diff --git a/opcua_tools/constants.py b/opcua_tools/constants.py new file mode 100644 index 0000000..1ddef05 --- /dev/null +++ b/opcua_tools/constants.py @@ -0,0 +1,57 @@ +from opcua_tools.ua_data_types import ( + UABoolean, + UAByte, + UAByteString, + UADataValue, + UADateTime, + UADiagnosticInfo, + UADouble, + UAExpandedNodeId, + UAExtensionObject, + UAFloat, + UAGuid, + UAInt16, + UAInt32, + UAInt64, + UALocalizedText, + UANodeId, + UAQualifiedName, + UASByte, + UAStatusCode, + UAString, + UAUInt16, + UAUInt32, + UAUInt64, + UAVariant, + UAXMLElement, + VariantType, +) + + +DATA_TYPES_MAPPING = { + VariantType.Boolean.name: UABoolean, + VariantType.SByte.name: UASByte, + VariantType.Byte.name: UAByte, + VariantType.Int16.name: UAInt16, + VariantType.UInt16.name: UAUInt16, + VariantType.Int32.name: UAInt32, + VariantType.UInt32.name: UAUInt32, + VariantType.Int64.name: UAInt64, + VariantType.UInt64.name: UAUInt64, + VariantType.Float.name: UAFloat, + VariantType.Double.name: UADouble, + VariantType.String.name: UAString, + VariantType.DateTime.name: UADateTime, + VariantType.Guid.name: UAGuid, + VariantType.ByteString.name: UAByteString, + VariantType.XmlElement.name: UAXMLElement, + VariantType.NodeId.name: UANodeId, + VariantType.ExpandedNodeId.name: UAExpandedNodeId, + VariantType.StatusCode.name: UAStatusCode, + VariantType.QualifiedName.name: UAQualifiedName, + VariantType.LocalizedText.name: UALocalizedText, + VariantType.ExtensionObject.name: UAExtensionObject, + VariantType.DataValue.name: UADataValue, + VariantType.Variant.name: UAVariant, + VariantType.DiagnosticInfo.name: UADiagnosticInfo, +} diff --git a/opcua_tools/nodeset_generator.py b/opcua_tools/nodeset_generator.py index c4afbf5..39deadd 100644 --- a/opcua_tools/nodeset_generator.py +++ b/opcua_tools/nodeset_generator.py @@ -166,7 +166,10 @@ def encode_values(nodes): def generate_nodes_xml( - nodes: pd.DataFrame, references: pd.DataFrame, lookup_df: pd.DataFrame + nodes: pd.DataFrame, + references: pd.DataFrame, + lookup_df: pd.DataFrame, + original_nodes: pd.DataFrame, ): assert ( nodes["BrowseNameNamespace"].isna().sum() == 0 @@ -178,6 +181,7 @@ def generate_nodes_xml( nodes["Description"] = replacer(nodes["Description"]) nodes["NodeId"] = replacer(nodes["NodeId"].map(str)) + nodes = value_validator.validate_values_in_df(nodes, original_nodes) nodes = denormalize_nodes_nodeids(nodes, lookup_df=lookup_df) references = denormalize_references_nodeids(references, lookup_df=lookup_df) @@ -186,7 +190,6 @@ def generate_nodes_xml( references["ReferenceType"] = replacer(references["ReferenceType"].map(str)) nodes = nodes.copy() - nodes = value_validator.validate_values_in_df(nodes) encode_values(nodes) encode_definitions(nodes) @@ -302,6 +305,7 @@ def create_nodeset2_file( nodes=nodes, references=references, namespace_index=serialize_namespace ) namespaces_in_use.sort() + original_nodes = nodes.copy() nodes = nodes[nodes["ns"].map(lambda x: x in (namespaces_in_use))].copy() serialize_namespace_uri = namespaces[serialize_namespace] original_namespaces = namespaces @@ -323,8 +327,7 @@ def create_nodeset2_file( nodes = nodes[nodes["ns"] == serialize_namespace].copy() # References restrict themselves - - nodes_df = generate_nodes_xml(nodes, references, lookup_df) + nodes_df = generate_nodes_xml(nodes, references, lookup_df, original_nodes) end_time = time.time() logger.info(f"Creating nodeset2xml-string took {str(end_time - start_time)}") logger.info("Writing nodeset2xml") diff --git a/opcua_tools/static/data_type_to_value_mapping.csv b/opcua_tools/static/data_type_to_value_mapping.csv deleted file mode 100644 index cf5d7a5..0000000 --- a/opcua_tools/static/data_type_to_value_mapping.csv +++ /dev/null @@ -1,4913 +0,0 @@ -DataType,NodeIdDataType,OPCUAToolsClass -0,i=3062, -1,i=3063, -2,i=24, -3,i=26,UAFloat -4,i=27, -5,i=28, -6,i=29, -7,i=1,UABoolean -8,i=2, -9,i=3, -10,i=4, -11,i=5,UAUInt16 -12,i=6, -13,i=7,UAUInt32 -14,i=8, -15,i=9, -16,i=10,UAFloat -17,i=11,UADouble -18,i=12,UAString -19,i=13,UADateTime -20,i=14, -21,i=15,UAByteString -22,i=16, -23,i=17, -24,i=18, -25,i=19, -26,i=20, -27,i=21,UALocalizedText -28,i=22, -29,i=23, -30,i=25, -31,i=30, -32,i=50, -33,i=31, -34,i=32, -35,i=33, -36,i=34, -37,i=35, -38,i=36, -39,i=37, -40,i=38, -41,i=39, -42,i=40, -43,i=41, -44,i=3065, -45,i=44, -46,i=45, -47,i=46, -48,i=47, -49,i=48, -50,i=49, -51,i=51, -52,i=52, -53,i=53, -54,i=54, -55,i=117, -56,i=56, -57,i=24136, -58,i=24137, -59,i=58, -60,i=61, -61,i=62, -62,i=63, -63,i=68, -64,i=69, -65,i=104, -66,i=105, -67,i=72, -68,i=106, -69,i=107, -70,i=15001, -71,i=75,UAEnumeration -72,i=76, -73,i=120,UAEnumeration -74,i=12169, -75,i=77, -76,i=78, -77,i=80, -78,i=83, -79,i=11508, -80,i=11510, -81,i=84, -82,i=85, -83,i=86, -84,i=87, -85,i=88, -86,i=89, -87,i=90, -88,i=91, -89,i=92, -90,i=93, -91,i=129, -92,i=131, -93,i=15957, -94,i=15958, -95,i=15959, -96,i=15960, -97,i=15961, -98,i=15962, -99,i=15963, -100,i=15964, -101,i=16134, -102,i=16135, -103,i=16136, -104,i=3068, -105,i=12170, -106,i=3067, -107,i=3069, -108,i=3070, -109,i=11433, -110,i=11498, -111,i=15002, -112,i=12908, -113,i=11512, -114,i=11513, -115,i=11432, -116,i=3071, -117,i=12745, -118,i=32750, -119,i=3072, -120,i=3073, -121,i=17605, -122,i=2000, -123,i=2001, -124,i=2002, -125,i=2003, -126,i=16307, -127,i=12756, -128,i=23751, -129,i=2004, -130,i=2005, -131,i=2006, -132,i=15003, -133,i=2007, -134,i=3074, -135,i=3075, -136,i=3076, -137,i=3077, -138,i=3078, -139,i=3079, -140,i=3080, -141,i=3081, -142,i=3082, -143,i=3083, -144,i=3084, -145,i=3085, -146,i=2008, -147,i=2742, -148,i=12882, -149,i=17612, -150,i=2009, -151,i=3086, -152,i=3087, -153,i=3088, -154,i=3089, -155,i=3090, -156,i=3091, -157,i=3092, -158,i=3093, -159,i=3094, -160,i=2010, -161,i=3095, -162,i=3096, -163,i=3097, -164,i=3098, -165,i=3099, -166,i=3100, -167,i=3101, -168,i=3102, -169,i=3104, -170,i=3105, -171,i=3106, -172,i=3107, -173,i=3108, -174,i=3110, -175,i=3111, -176,i=3112, -177,i=3113, -178,i=3114, -179,i=2011, -180,i=2012, -181,i=3115, -182,i=11527, -183,i=11489, -184,i=11490, -185,i=11491, -186,i=12871, -187,i=12872, -188,i=12746, -189,i=12747, -190,i=12748, -191,i=12883, -192,i=12884, -193,i=2013, -194,i=2014, -195,i=2016, -196,i=2017, -197,i=2732, -198,i=2733, -199,i=2734, -200,i=3049, -201,i=11549, -202,i=11550, -203,i=12910, -204,i=11551, -205,i=2019, -206,i=2754, -207,i=11562, -208,i=16295, -209,i=16296, -210,i=16297, -211,i=16298, -212,i=16299, -213,i=16300, -214,i=24088, -215,i=24089, -216,i=24090, -217,i=24091, -218,i=24103, -219,i=24092, -220,i=24093, -221,i=31770, -222,i=24094, -223,i=2020, -224,i=2021, -225,i=3116, -226,i=3117, -227,i=3118, -228,i=3119, -229,i=3120, -230,i=3121, -231,i=3122, -232,i=3124, -233,i=3125, -234,i=3126, -235,i=3127, -236,i=3128, -237,i=2022, -238,i=2023, -239,i=2744, -240,i=3129, -241,i=3130, -242,i=2025, -243,i=2026, -244,i=2027, -245,i=2028, -246,i=12097, -247,i=12098, -248,i=12099, -249,i=12100, -250,i=12101, -251,i=12102, -252,i=12103, -253,i=12104, -254,i=12105, -255,i=12106, -256,i=12107, -257,i=12108, -258,i=12109, -259,i=12110, -260,i=12111, -261,i=12112, -262,i=12113, -263,i=12114, -264,i=12115, -265,i=12116, -266,i=12117, -267,i=12118, -268,i=12119, -269,i=12120, -270,i=12121, -271,i=12122, -272,i=12123, -273,i=12124, -274,i=12125, -275,i=12126, -276,i=12127, -277,i=12128, -278,i=12129, -279,i=12130, -280,i=12131, -281,i=12132, -282,i=12133, -283,i=12134, -284,i=12135, -285,i=12136, -286,i=12137, -287,i=12138, -288,i=12139, -289,i=12140, -290,i=12141, -291,i=12142, -292,i=12143, -293,i=12144, -294,i=12145, -295,i=12146, -296,i=12147, -297,i=12148, -298,i=12149, -299,i=12150, -300,i=12151, -301,i=12152, -302,i=2029, -303,i=2030, -304,i=3131, -305,i=3132, -306,i=3133, -307,i=3134, -308,i=3135, -309,i=3136, -310,i=3137, -311,i=3138, -312,i=3139, -313,i=3140, -314,i=3141, -315,i=3142, -316,i=3143, -317,i=8898, -318,i=11891, -319,i=3151, -320,i=3152, -321,i=3153, -322,i=3154, -323,i=3155, -324,i=3156, -325,i=3157, -326,i=3158, -327,i=3159, -328,i=3160, -329,i=3161, -330,i=3162, -331,i=3163, -332,i=3164, -333,i=3165, -334,i=3166, -335,i=3167, -336,i=3168, -337,i=3169, -338,i=3170, -339,i=3171, -340,i=3172, -341,i=3173, -342,i=3174, -343,i=3175, -344,i=3176, -345,i=3177, -346,i=3178, -347,i=2031, -348,i=3179, -349,i=3180, -350,i=3181, -351,i=3182, -352,i=3183, -353,i=3184, -354,i=3185, -355,i=3186, -356,i=3187, -357,i=2032, -358,i=2033, -359,i=2034, -360,i=2035, -361,i=2036, -362,i=2037, -363,i=2038, -364,i=2039, -365,i=2040, -366,i=11945, -367,i=11948, -368,i=11564, -369,i=11565, -370,i=12161, -371,i=12162, -372,i=11567, -373,i=12163, -374,i=12164, -375,i=11569, -376,i=11570, -377,i=11571, -378,i=11572, -379,i=11573, -380,i=11574, -381,i=11575, -382,i=11576, -383,i=12686, -384,i=12687, -385,i=11579, -386,i=13341, -387,i=24244, -388,i=25200, -389,i=11580, -390,i=11581, -391,i=11582, -392,i=11583, -393,i=11584, -394,i=11585, -395,i=11586, -396,i=11587, -397,i=11588, -398,i=11589, -399,i=11590, -400,i=11591, -401,i=11592, -402,i=11593, -403,i=11594, -404,i=11595, -405,i=11615, -406,i=11616, -407,i=11617, -408,i=11618, -409,i=11619, -410,i=11620, -411,i=11621, -412,i=11622, -413,i=11623, -414,i=11624, -415,i=11625, -416,i=12690, -417,i=12691, -418,i=11628, -419,i=11629, -420,i=11630, -421,i=11631, -422,i=11632, -423,i=11633, -424,i=11634, -425,i=11635, -426,i=11636, -427,i=11637, -428,i=11638, -429,i=11639, -430,i=11640, -431,i=11641, -432,i=11642, -433,i=11643, -434,i=16137, -435,i=16138, -436,i=16139, -437,i=25267, -438,i=11645, -439,i=11646,UABoolean -440,i=11647, -441,i=11648, -442,i=11649, -443,i=11650, -444,i=11651, -445,i=11652, -446,i=11653, -447,i=2041, -448,i=2042, -449,i=2043, -450,i=2044, -451,i=2045, -452,i=2046, -453,i=2047, -454,i=3190, -455,i=2050, -456,i=2051, -457,i=31771, -458,i=31772, -459,i=31773, -460,i=31774, -461,i=2052, -462,i=2053, -463,i=2054, -464,i=2055, -465,i=2056, -466,i=2057, -467,i=2058, -468,i=17615, -469,i=2059, -470,i=2745, -471,i=2060, -472,i=2061, -473,i=2746, -474,i=2062, -475,i=2063, -476,i=2065, -477,i=2066, -478,i=24135, -479,i=2069, -480,i=2070, -481,i=2071, -482,i=2072, -483,i=2073, -484,i=2747, -485,i=2074, -486,i=2748, -487,i=2749, -488,i=2075, -489,i=2076, -490,i=2077, -491,i=11485, -492,i=2078, -493,i=2079, -494,i=2080, -495,i=2081, -496,i=2082, -497,i=2083, -498,i=2084, -499,i=2085, -500,i=2086, -501,i=2087, -502,i=2088, -503,i=2089, -504,i=2090, -505,i=2091, -506,i=2092, -507,i=2093, -508,i=2094, -509,i=2095, -510,i=2096, -511,i=2097, -512,i=2098, -513,i=2099, -514,i=2100, -515,i=2750, -516,i=2101, -517,i=2102, -518,i=2103, -519,i=2104, -520,i=2751, -521,i=2127, -522,i=2128, -523,i=2129, -524,i=2130, -525,i=2131, -526,i=11446, -527,i=11696, -528,i=2132, -529,i=2133, -530,i=2134, -531,i=2738, -532,i=2739, -533,i=3035, -534,i=11436, -535,i=12502, -536,i=12503, -537,i=23606, -538,i=23908, -539,i=23926, -540,i=23994, -541,i=23995, -542,i=23998, -543,i=23999, -544,i=25684, -545,i=2340, -546,i=2137, -547,i=2138, -548,i=2139, -549,i=2140, -550,i=2141, -551,i=2142, -552,i=3698, -553,i=3699, -554,i=3700, -555,i=3701, -556,i=3702, -557,i=3703, -558,i=2752, -559,i=2753, -560,i=3051, -561,i=3052, -562,i=3053, -563,i=3054, -564,i=3055, -565,i=3056, -566,i=3057, -567,i=2150, -568,i=2151, -569,i=2152, -570,i=2153, -571,i=2154, -572,i=2155, -573,i=2156, -574,i=2157, -575,i=2159, -576,i=2160, -577,i=2161, -578,i=2162, -579,i=2163, -580,i=2164, -581,i=12779, -582,i=12780, -583,i=12781, -584,i=12782, -585,i=12783, -586,i=2165, -587,i=2166, -588,i=11697, -589,i=11698, -590,i=11699, -591,i=2171, -592,i=12784, -593,i=12785, -594,i=12786, -595,i=12787, -596,i=12788, -597,i=12789, -598,i=12790, -599,i=12791, -600,i=12792, -601,i=12793, -602,i=12794, -603,i=12795, -604,i=12796, -605,i=12797, -606,i=12798, -607,i=12799, -608,i=12800, -609,i=12801, -610,i=12802, -611,i=12803, -612,i=12804, -613,i=12805, -614,i=12806, -615,i=12807, -616,i=12808, -617,i=12809, -618,i=12810, -619,i=12811, -620,i=12812, -621,i=12813, -622,i=12814, -623,i=12815, -624,i=2172, -625,i=2173, -626,i=2174, -627,i=2175, -628,i=2176, -629,i=2177, -630,i=8888, -631,i=2179, -632,i=2180, -633,i=2181, -634,i=2182, -635,i=2183, -636,i=2184, -637,i=2185, -638,i=2186, -639,i=2187, -640,i=2188, -641,i=2189, -642,i=2190, -643,i=2191, -644,i=2998, -645,i=2193, -646,i=8889, -647,i=8890, -648,i=8891, -649,i=8892, -650,i=8893, -651,i=8894, -652,i=8895, -653,i=8896, -654,i=8897, -655,i=8902, -656,i=2196, -657,i=12816, -658,i=12817, -659,i=12818, -660,i=12819, -661,i=12820, -662,i=12821, -663,i=12822, -664,i=12823, -665,i=12824, -666,i=12825, -667,i=12826, -668,i=12827, -669,i=12828, -670,i=12829, -671,i=12830, -672,i=12831, -673,i=12832, -674,i=12833, -675,i=12834, -676,i=12835, -677,i=12836, -678,i=12837, -679,i=12838, -680,i=12839, -681,i=12840, -682,i=12841, -683,i=12842, -684,i=12843, -685,i=12844, -686,i=12845, -687,i=12846, -688,i=12847, -689,i=12848, -690,i=12849, -691,i=12850, -692,i=12851, -693,i=12852, -694,i=12853, -695,i=12854, -696,i=12855, -697,i=12856, -698,i=12857, -699,i=12858, -700,i=12859, -701,i=2197, -702,i=2198, -703,i=2199, -704,i=2200, -705,i=2201, -706,i=2202, -707,i=2203, -708,i=2204, -709,i=3050, -710,i=2205, -711,i=2206, -712,i=2207, -713,i=2208, -714,i=2209, -715,i=8900, -716,i=11892, -717,i=2217, -718,i=2218, -719,i=2219, -720,i=2220, -721,i=2221, -722,i=2222, -723,i=2223, -724,i=2224, -725,i=2225, -726,i=2226, -727,i=2227, -728,i=2228, -729,i=2229, -730,i=2230, -731,i=2231, -732,i=2232, -733,i=2233, -734,i=2234, -735,i=2235, -736,i=2236, -737,i=2237, -738,i=2238, -739,i=2239, -740,i=2240, -741,i=2241, -742,i=2242, -743,i=2730, -744,i=2731, -745,i=2243, -746,i=12860, -747,i=12861, -748,i=12862, -749,i=12863, -750,i=12864, -751,i=12865, -752,i=12866, -753,i=12867, -754,i=12868, -755,i=12869, -756,i=2244, -757,i=2245, -758,i=2246, -759,i=2247, -760,i=2248, -761,i=2249, -762,i=2250, -763,i=2251, -764,i=2252, -765,i=3058, -766,i=11487, -767,i=11488, -768,i=11701, -769,i=16309, -770,i=17632, -771,i=17633, -772,i=16312, -773,i=17986, -774,i=17988, -775,i=17989, -776,i=17990, -777,i=3048, -778,i=31915, -779,i=2253, -780,i=2254, -781,i=2255, -782,i=15004, -783,i=2256, -784,i=2257, -785,i=2258, -786,i=2259, -787,i=2260, -788,i=2262, -789,i=2263, -790,i=2261, -791,i=2264, -792,i=2265, -793,i=2266, -794,i=2992, -795,i=2993, -796,i=2267, -797,i=2994, -798,i=12885, -799,i=17634, -800,i=2268, -801,i=2269, -802,i=2271, -803,i=2272, -804,i=2735, -805,i=2736, -806,i=2737, -807,i=3704, -808,i=11702, -809,i=11703, -810,i=12911, -811,i=11704, -812,i=11705, -813,i=12165, -814,i=12166, -815,i=11707, -816,i=12167, -817,i=12168, -818,i=11709, -819,i=11710, -820,i=11711, -821,i=11712, -822,i=11713, -823,i=11714, -824,i=2996, -825,i=2997, -826,i=15606, -827,i=16301, -828,i=16302, -829,i=16303, -830,i=16304, -831,i=16305, -832,i=24095, -833,i=24096, -834,i=24097, -835,i=24098, -836,i=24104, -837,i=24099, -838,i=24100, -839,i=31916, -840,i=24101, -841,i=2274, -842,i=2275, -843,i=2276, -844,i=2277, -845,i=2278, -846,i=2279, -847,i=3705, -848,i=2281, -849,i=2282, -850,i=2284, -851,i=2285, -852,i=2286, -853,i=2287, -854,i=2288, -855,i=2289, -856,i=2290, -857,i=3706, -858,i=3707, -859,i=3708, -860,i=2294, -861,i=2295, -862,i=2296, -863,i=3709, -864,i=11715, -865,i=11492, -866,i=11493, -867,i=11494, -868,i=12873, -869,i=12874, -870,i=12749, -871,i=12750, -872,i=12751, -873,i=12886, -874,i=12887, -875,i=11312, -876,i=11313, -877,i=11314, -878,i=14415, -879,i=11192, -880,i=11193, -881,i=11242, -882,i=11273, -883,i=11274, -884,i=11196, -885,i=11197, -886,i=11198, -887,i=11199, -888,i=11200, -889,i=11281, -890,i=11282, -891,i=11283, -892,i=11502, -893,i=11275, -894,i=11201, -895,i=19091, -896,i=23562, -897,i=11737, -898,i=24263, -899,i=14533, -900,i=16313, -901,i=17548, -902,i=15528, -903,i=31917, -904,i=31918, -905,i=2299, -906,i=2769, -907,i=3720, -908,i=2770, -909,i=3724, -910,i=2755, -911,i=2756, -912,i=2757, -913,i=2758, -914,i=2759, -915,i=2762, -916,i=2763, -917,i=2764, -918,i=2765, -919,i=2766, -920,i=11456, -921,i=2771, -922,i=2772, -923,i=3728, -924,i=2773, -925,i=3732, -926,i=17635, -927,i=17636, -928,i=2760, -929,i=2761, -930,i=2767, -931,i=2768, -932,i=2307, -933,i=2308, -934,i=2309, -935,i=2310, -936,i=2312, -937,i=15109, -938,i=15112, -939,i=15113, -940,i=15128, -941,i=15129, -942,i=15317, -943,i=17709, -944,i=17712, -945,i=17713, -946,i=17714, -947,i=17715, -948,i=17716, -949,i=18769, -950,i=18770, -951,i=18771, -952,i=18772, -953,i=18773, -954,i=18774, -955,i=18776, -956,i=18777, -957,i=18778, -958,i=18779, -959,i=18780, -960,i=18781, -961,i=18783, -962,i=18784, -963,i=18785, -964,i=18786, -965,i=18801, -966,i=18787, -967,i=18788, -968,i=18789, -969,i=18790, -970,i=18791, -971,i=18796, -972,i=18798, -973,i=18799, -974,i=18800, -975,i=18792, -976,i=19074, -977,i=19075, -978,i=19076, -979,i=18806, -980,i=18807, -981,i=18808, -982,i=18809, -983,i=18810, -984,i=18811, -985,i=18812, -986,i=18813, -987,i=18814, -988,i=2311, -989,i=2774, -990,i=3754, -991,i=2775, -992,i=3746, -993,i=2776, -994,i=3750, -995,i=2315, -996,i=2777, -997,i=2778, -998,i=11939, -999,i=11940, -1000,i=13353, -1001,i=13354, -1002,i=13355, -1003,i=13356, -1004,i=13357, -1005,i=13358, -1006,i=13359, -1007,i=13360, -1008,i=17718, -1009,i=17719, -1010,i=13363, -1011,i=13364, -1012,i=13365, -1013,i=13366, -1014,i=13367, -1015,i=13368, -1016,i=13369, -1017,i=13370, -1018,i=13372, -1019,i=13373, -1020,i=13374, -1021,i=13375, -1022,i=13376, -1023,i=13377, -1024,i=13378, -1025,i=13379, -1026,i=13380, -1027,i=13381, -1028,i=13382, -1029,i=13383, -1030,i=13384, -1031,i=13385, -1032,i=13386, -1033,i=13387, -1034,i=13388, -1035,i=13389, -1036,i=13390, -1037,i=13391, -1038,i=13392, -1039,i=13393, -1040,i=13394, -1041,i=13395, -1042,i=13396, -1043,i=13397, -1044,i=16314, -1045,i=16348, -1046,i=16349, -1047,i=16350, -1048,i=16351, -1049,i=16352, -1050,i=16353, -1051,i=16354, -1052,i=16355, -1053,i=16356, -1054,i=16357, -1055,i=16358, -1056,i=15744, -1057,i=15745, -1058,i=15746, -1059,i=15747, -1060,i=15748, -1061,i=15749, -1062,i=16359, -1063,i=15750, -1064,i=15751, -1065,i=15752, -1066,i=15753, -1067,i=15754, -1068,i=15755, -1069,i=15756, -1070,i=15794, -1071,i=15803, -1072,i=15815, -1073,i=15816, -1074,i=15817, -1075,i=15818, -1076,i=15819, -1077,i=15820, -1078,i=15821, -1079,i=15822, -1080,i=15823, -1081,i=15824, -1082,i=15825, -1083,i=15826, -1084,i=15827, -1085,i=15828, -1086,i=15829, -1087,i=15830, -1088,i=15831, -1089,i=15832, -1090,i=15833, -1091,i=15834, -1092,i=15835, -1093,i=15836, -1094,i=15837, -1095,i=15838, -1096,i=15839, -1097,i=15840, -1098,i=15841, -1099,i=15842, -1100,i=15843, -1101,i=15607, -1102,i=15608, -1103,i=16162, -1104,i=15997, -1105,i=15998, -1106,i=15999, -1107,i=16000, -1108,i=16001, -1109,i=15620, -1110,i=16173, -1111,i=15410, -1112,i=16174, -1113,i=15411, -1114,i=16175, -1115,i=24139, -1116,i=15624, -1117,i=15625, -1118,i=15626, -1119,i=15627, -1120,i=16176, -1121,i=16177, -1122,i=16178, -1123,i=16179, -1124,i=16180, -1125,i=16181, -1126,i=16182, -1127,i=16183, -1128,i=15632, -1129,i=15633, -1130,i=15634, -1131,i=17641, -1132,i=15644, -1133,i=16192, -1134,i=15412, -1135,i=16193, -1136,i=15413, -1137,i=16194, -1138,i=15648, -1139,i=15649, -1140,i=15650, -1141,i=15651, -1142,i=16195, -1143,i=16196, -1144,i=16197, -1145,i=16198, -1146,i=16199, -1147,i=16200, -1148,i=16201, -1149,i=16202, -1150,i=15656, -1151,i=16203, -1152,i=15414, -1153,i=16204, -1154,i=15415, -1155,i=16205, -1156,i=24141, -1157,i=15660, -1158,i=15661, -1159,i=15662, -1160,i=15663, -1161,i=16206, -1162,i=16207, -1163,i=16208, -1164,i=16209, -1165,i=16210, -1166,i=16211, -1167,i=16212, -1168,i=16213, -1169,i=15668, -1170,i=16214, -1171,i=15416, -1172,i=16215, -1173,i=15417, -1174,i=16216, -1175,i=24142, -1176,i=15672, -1177,i=15673, -1178,i=15674, -1179,i=15675, -1180,i=16217, -1181,i=16218, -1182,i=16219, -1183,i=16220, -1184,i=16221, -1185,i=16222, -1186,i=16223, -1187,i=16224, -1188,i=15680, -1189,i=16225, -1190,i=15418, -1191,i=16226, -1192,i=15423, -1193,i=16227, -1194,i=24143, -1195,i=15684, -1196,i=15685, -1197,i=15686, -1198,i=15687, -1199,i=16228, -1200,i=16229, -1201,i=16230, -1202,i=16231, -1203,i=16232, -1204,i=16233, -1205,i=16234, -1206,i=16235, -1207,i=16036, -1208,i=16236, -1209,i=15424, -1210,i=16237, -1211,i=15425, -1212,i=16238, -1213,i=24144, -1214,i=16041, -1215,i=16042, -1216,i=16043, -1217,i=16044, -1218,i=16239, -1219,i=16240, -1220,i=16241, -1221,i=16242, -1222,i=16243, -1223,i=16244, -1224,i=16245, -1225,i=16246, -1226,i=15692, -1227,i=16247, -1228,i=15426, -1229,i=16248, -1230,i=15427, -1231,i=16249, -1232,i=24145, -1233,i=15696, -1234,i=15697, -1235,i=15698, -1236,i=15699, -1237,i=16250, -1238,i=16251, -1239,i=16252, -1240,i=16253, -1241,i=16254, -1242,i=16255, -1243,i=16256, -1244,i=16257, -1245,i=15716, -1246,i=16269, -1247,i=15428, -1248,i=16270, -1249,i=15429, -1250,i=16271, -1251,i=24146, -1252,i=15720, -1253,i=15721, -1254,i=15722, -1255,i=15723, -1256,i=16272, -1257,i=16273, -1258,i=16274, -1259,i=16275, -1260,i=16276, -1261,i=16277, -1262,i=16278, -1263,i=16279, -1264,i=15704, -1265,i=16258, -1266,i=15430, -1267,i=16259, -1268,i=15527, -1269,i=16260, -1270,i=24147, -1271,i=15708, -1272,i=15709, -1273,i=15710, -1274,i=15711, -1275,i=16261, -1276,i=16262, -1277,i=16263, -1278,i=16264, -1279,i=16265, -1280,i=16266, -1281,i=16267, -1282,i=16268, -1283,i=25565, -1284,i=25566, -1285,i=25567, -1286,i=25568, -1287,i=25569, -1288,i=25570, -1289,i=25571, -1290,i=25572, -1291,i=25573, -1292,i=25574, -1293,i=25575, -1294,i=25576, -1295,i=25577, -1296,i=25578, -1297,i=25579, -1298,i=25580, -1299,i=25581, -1300,i=25582, -1301,i=25583, -1302,i=25603, -1303,i=25604, -1304,i=25605, -1305,i=25606, -1306,i=25607, -1307,i=25608, -1308,i=25609, -1309,i=25610, -1310,i=25611, -1311,i=25612, -1312,i=25613, -1313,i=25614, -1314,i=25615, -1315,i=25616, -1316,i=25617, -1317,i=25618, -1318,i=25619, -1319,i=25620, -1320,i=25621, -1321,i=25584, -1322,i=25585, -1323,i=25586, -1324,i=25587, -1325,i=25588, -1326,i=25589, -1327,i=25590, -1328,i=25591, -1329,i=25592, -1330,i=25593, -1331,i=25594, -1332,i=25595, -1333,i=25596, -1334,i=25597, -1335,i=25598, -1336,i=25599, -1337,i=25600, -1338,i=25601, -1339,i=25602, -1340,i=17589, -1341,i=17590, -1342,i=17591, -1343,i=17592, -1344,i=17593, -1345,i=17594, -1346,i=17597, -1347,i=17598, -1348,i=17600, -1349,i=17602, -1350,i=17708, -1351,i=17603, -1352,i=17604, -1353,i=23498, -1354,i=23501, -1355,i=23513, -1356,i=23517, -1357,i=23518, -1358,i=23519, -1359,i=23521, -1360,i=23525, -1361,i=2365, -1362,i=2366, -1363,i=2367, -1364,i=15318, -1365,i=17567, -1366,i=17568, -1367,i=17569, -1368,i=2368, -1369,i=2369, -1370,i=17497, -1371,i=17502, -1372,i=17570, -1373,i=17575, -1374,i=2372, -1375,i=2373, -1376,i=2374, -1377,i=2375, -1378,i=2376, -1379,i=2377, -1380,i=11238, -1381,i=11241, -1382,i=11461, -1383,i=12021, -1384,i=12024, -1385,i=12025, -1386,i=12026, -1387,i=12027, -1388,i=12028, -1389,i=12029, -1390,i=12037, -1391,i=12038, -1392,i=12046, -1393,i=12047, -1394,i=12055, -1395,i=12056, -1396,i=12057, -1397,i=12065, -1398,i=12066, -1399,i=12067, -1400,i=12068, -1401,i=12076, -1402,i=8995, -1403,i=8996, -1404,i=9000, -1405,i=9001, -1406,i=11110, -1407,i=11111, -1408,i=9002, -1409,i=9003, -1410,i=9004, -1411,i=9005, -1412,i=16361, -1413,i=16362, -1414,i=32059, -1415,i=2782, -1416,i=11112, -1417,i=11113, -1418,i=9009, -1419,i=9010, -1420,i=3874, -1421,i=32060, -1422,i=9011, -1423,i=9012, -1424,i=9015, -1425,i=9016, -1426,i=9017, -1427,i=9018, -1428,i=9019, -1429,i=9020, -1430,i=9021, -1431,i=9022, -1432,i=9023, -1433,i=9024, -1434,i=9025, -1435,i=9026, -1436,i=9028, -1437,i=9027, -1438,i=9029, -1439,i=9030, -1440,i=3875, -1441,i=3876, -1442,i=12912, -1443,i=12913, -1444,i=2830, -1445,i=9035, -1446,i=9036, -1447,i=9055, -1448,i=9056, -1449,i=9060, -1450,i=9062, -1451,i=9063, -1452,i=2831, -1453,i=9064, -1454,i=9065, -1455,i=9066, -1456,i=9067, -1457,i=9068, -1458,i=9069, -1459,i=9070, -1460,i=24312, -1461,i=24313, -1462,i=2881, -1463,i=9073, -1464,i=9074, -1465,i=9093, -1466,i=9094, -1467,i=9098, -1468,i=9100, -1469,i=9101, -1470,i=9102, -1471,i=9103, -1472,i=9107, -1473,i=9109, -1474,i=9110, -1475,i=9111, -1476,i=9112, -1477,i=9113, -1478,i=9114, -1479,i=2915, -1480,i=9118, -1481,i=9119, -1482,i=9160, -1483,i=9161, -1484,i=9164, -1485,i=9165, -1486,i=9166, -1487,i=9167, -1488,i=9168, -1489,i=11120, -1490,i=9169, -1491,i=9170, -1492,i=9174, -1493,i=9176, -1494,i=9177, -1495,i=16371, -1496,i=16372, -1497,i=16376, -1498,i=16378, -1499,i=16379, -1500,i=9178, -1501,i=9179, -1502,i=9180, -1503,i=9184, -1504,i=9185, -1505,i=9188, -1506,i=9189, -1507,i=9213, -1508,i=9214, -1509,i=9211, -1510,i=9212, -1511,i=9215, -1512,i=9216, -1513,i=16389, -1514,i=16390, -1515,i=16380, -1516,i=16381, -1517,i=16385, -1518,i=16387, -1519,i=16388, -1520,i=16395, -1521,i=16396, -1522,i=16397, -1523,i=16398, -1524,i=18190, -1525,i=18191, -1526,i=18195, -1527,i=18197, -1528,i=18198, -1529,i=16399, -1530,i=16400, -1531,i=16401, -1532,i=16402, -1533,i=16403, -1534,i=24316, -1535,i=24317, -1536,i=17868, -1537,i=24318, -1538,i=24319, -1539,i=17869, -1540,i=24320, -1541,i=24321, -1542,i=17870, -1543,i=24322, -1544,i=24323, -1545,i=18199, -1546,i=24324, -1547,i=24325, -1548,i=24744, -1549,i=25154, -1550,i=16405, -1551,i=16406, -1552,i=16407, -1553,i=16408, -1554,i=16409, -1555,i=16410, -1556,i=16411, -1557,i=16412, -1558,i=16414, -1559,i=16415, -1560,i=16416, -1561,i=16417, -1562,i=16420, -1563,i=16421, -1564,i=16422, -1565,i=16423, -1566,i=16424, -1567,i=16432, -1568,i=16433, -1569,i=16434, -1570,i=16435, -1571,i=16436, -1572,i=16437, -1573,i=16438, -1574,i=16439, -1575,i=16440, -1576,i=16441, -1577,i=16442, -1578,i=16443, -1579,i=16444, -1580,i=16461, -1581,i=16462, -1582,i=16465, -1583,i=16466, -1584,i=16472, -1585,i=16473, -1586,i=16474, -1587,i=16519, -1588,i=32064, -1589,i=32226, -1590,i=2929, -1591,i=9115, -1592,i=2930, -1593,i=6098, -1594,i=2932, -1595,i=6100, -1596,i=2933, -1597,i=6101, -1598,i=2935, -1599,i=11322, -1600,i=2936, -1601,i=11323, -1602,i=2940, -1603,i=11324, -1604,i=2942, -1605,i=11325, -1606,i=2943, -1607,i=11326, -1608,i=2945, -1609,i=11327, -1610,i=2949, -1611,i=2991, -1612,i=24756, -1613,i=24757, -1614,i=2947, -1615,i=24758, -1616,i=24759, -1617,i=2948, -1618,i=24760, -1619,i=24761, -1620,i=2955, -1621,i=11124, -1622,i=11125, -1623,i=11126, -1624,i=11127, -1625,i=16572, -1626,i=16573, -1627,i=16574, -1628,i=16575, -1629,i=24770, -1630,i=24771, -1631,i=24772, -1632,i=24773, -1633,i=24774, -1634,i=24775, -1635,i=24776, -1636,i=24777, -1637,i=9318, -1638,i=9329, -1639,i=9330, -1640,i=9331, -1641,i=9332, -1642,i=9333, -1643,i=9334, -1644,i=9335, -1645,i=9336, -1646,i=9337, -1647,i=11340, -1648,i=9338, -1649,i=11341, -1650,i=9339, -1651,i=11342, -1652,i=9340, -1653,i=11343, -1654,i=9341, -1655,i=9398, -1656,i=9399, -1657,i=9455, -1658,i=9456, -1659,i=9457, -1660,i=9461, -1661,i=9462, -1662,i=9465, -1663,i=9906, -1664,i=9963, -1665,i=9964, -1666,i=10020, -1667,i=10021, -1668,i=10025, -1669,i=10027, -1670,i=10028, -1671,i=10029, -1672,i=10030, -1673,i=10034, -1674,i=10036, -1675,i=10037, -1676,i=10038, -1677,i=10039, -1678,i=10043, -1679,i=10045, -1680,i=10046, -1681,i=10047, -1682,i=10048, -1683,i=10052, -1684,i=10054, -1685,i=10055, -1686,i=10060, -1687,i=9482, -1688,i=10368, -1689,i=10522, -1690,i=16776, -1691,i=10214, -1692,i=16858, -1693,i=9764, -1694,i=9905, -1695,i=16817, -1696,i=9623, -1697,i=16899, -1698,i=10523, -1699,i=10637, -1700,i=11158, -1701,i=11753, -1702,i=10751, -1703,i=18347, -1704,i=18496, -1705,i=13225, -1706,i=13325, -1707,i=14900, -1708,i=13326, -1709,i=13327, -1710,i=17080, -1711,i=17215, -1712,i=17216, -1713,i=17217, -1714,i=11163, -1715,i=11164, -1716,i=11165, -1717,i=11166, -1718,i=17218, -1719,i=17219, -1720,i=17220, -1721,i=18665, -1722,i=17221, -1723,i=2790, -1724,i=2803, -1725,i=2829, -1726,i=17222, -1727,i=11851, -1728,i=8927, -1729,i=11852, -1730,i=8944, -1731,i=17223, -1732,i=11853, -1733,i=8961, -1734,i=17224, -1735,i=11854, -1736,i=11093, -1737,i=11855, -1738,i=17225, -1739,i=17242, -1740,i=15013, -1741,i=17259, -1742,i=2787, -1743,i=2788, -1744,i=2789, -1745,i=9006, -1746,i=17276, -1747,i=17983, -1748,i=17984, -1749,i=17985, -1750,i=17279, -1751,i=17280, -1752,i=17991, -1753,i=17281, -1754,i=17282, -1755,i=17284, -1756,i=17285, -1757,i=17286, -1758,i=17287, -1759,i=17283, -1760,i=17288, -1761,i=17289, -1762,i=18666, -1763,i=17277, -1764,i=17278, -1765,i=32244, -1766,i=32245, -1767,i=32246, -1768,i=32247, -1769,i=32248, -1770,i=32249, -1771,i=32250, -1772,i=32251, -1773,i=32252, -1774,i=2391, -1775,i=3830, -1776,i=3831, -1777,i=3833, -1778,i=3835, -1779,i=3836, -1780,i=3838, -1781,i=3839, -1782,i=2392, -1783,i=2393, -1784,i=2394, -1785,i=2395, -1786,i=2396, -1787,i=2397, -1788,i=2398, -1789,i=2399, -1790,i=3840, -1791,i=3841, -1792,i=3842, -1793,i=3843, -1794,i=3844, -1795,i=3845, -1796,i=3846, -1797,i=3847, -1798,i=15038, -1799,i=15040, -1800,i=3848, -1801,i=3849, -1802,i=3850, -1803,i=2406, -1804,i=2407, -1805,i=2400, -1806,i=2401, -1807,i=2402, -1808,i=2403, -1809,i=2404, -1810,i=2405, -1811,i=2408, -1812,i=2409, -1813,i=2410, -1814,i=2411, -1815,i=2412, -1816,i=2413, -1817,i=2414, -1818,i=2415, -1819,i=2416, -1820,i=2417, -1821,i=2418, -1822,i=2419, -1823,i=2420, -1824,i=2421, -1825,i=2422, -1826,i=2423, -1827,i=2424, -1828,i=2425, -1829,i=2426, -1830,i=2427, -1831,i=2428, -1832,i=2429, -1833,i=2430, -1834,i=2378, -1835,i=2379, -1836,i=11856, -1837,i=11875, -1838,i=3806, -1839,i=3825, -1840,i=3826, -1841,i=2380, -1842,i=2381, -1843,i=2382, -1844,i=2383, -1845,i=2384, -1846,i=2385, -1847,i=2386, -1848,i=2387, -1849,i=2388, -1850,i=2389, -1851,i=2390, -1852,i=15383, -1853,i=15384, -1854,i=15385, -1855,i=15386, -1856,i=15387, -1857,i=15388, -1858,i=15389, -1859,i=15390, -1860,i=15391, -1861,i=15392, -1862,i=15393, -1863,i=15394, -1864,i=15395, -1865,i=11214, -1866,i=2318, -1867,i=3059, -1868,i=11168, -1869,i=11169, -1870,i=11170, -1871,i=11171, -1872,i=11876, -1873,i=2323, -1874,i=2324, -1875,i=2325, -1876,i=2326, -1877,i=2327, -1878,i=2328, -1879,i=11499, -1880,i=11500, -1881,i=19092, -1882,i=11202, -1883,i=11203, -1884,i=11204, -1885,i=11205, -1886,i=11206, -1887,i=11207, -1888,i=11208, -1889,i=11215, -1890,i=2330, -1891,i=2331, -1892,i=2332, -1893,i=11268, -1894,i=11269, -1895,i=2334, -1896,i=2335, -1897,i=2336, -1898,i=2337, -1899,i=2338, -1900,i=11278, -1901,i=11279, -1902,i=11280, -1903,i=11501, -1904,i=11270, -1905,i=11172, -1906,i=19094, -1907,i=2999, -1908,i=3025, -1909,i=3028, -1910,i=3003, -1911,i=3029, -1912,i=3030, -1913,i=3006, -1914,i=3026, -1915,i=3031, -1916,i=3032, -1917,i=3033, -1918,i=19095, -1919,i=19293, -1920,i=19294, -1921,i=19295, -1922,i=3012, -1923,i=3027, -1924,i=3014, -1925,i=3015, -1926,i=3016, -1927,i=3017, -1928,i=3034, -1929,i=3019, -1930,i=3020, -1931,i=3021, -1932,i=3022, -1933,i=3023, -1934,i=3024, -1935,i=12522, -1936,i=12542, -1937,i=19296, -1938,i=32254, -1939,i=23563, -1940,i=12543, -1941,i=12544, -1942,i=12545, -1943,i=12546, -1944,i=12705, -1945,i=12547, -1946,i=12548, -1947,i=12549, -1948,i=12550, -1949,i=12551, -1950,i=23564, -1951,i=23565, -1952,i=12552, -1953,i=12553, -1954,i=12554, -1955,i=19297, -1956,i=19446, -1957,i=19447, -1958,i=19448, -1959,i=12555, -1960,i=13599, -1961,i=13600, -1962,i=13601, -1963,i=13602, -1964,i=13603, -1965,i=13605, -1966,i=13606, -1967,i=13607, -1968,i=13608, -1969,i=13609, -1970,i=13610, -1971,i=13611, -1972,i=13612, -1973,i=13613, -1974,i=13614, -1975,i=13615, -1976,i=13616, -1977,i=13617, -1978,i=13618, -1979,i=13619, -1980,i=13620, -1981,i=13621, -1982,i=13622, -1983,i=13623, -1984,i=13624, -1985,i=13625, -1986,i=13626, -1987,i=13627, -1988,i=13628, -1989,i=13629, -1990,i=13630, -1991,i=13631, -1992,i=23526, -1993,i=23527, -1994,i=19450, -1995,i=19451, -1996,i=19452, -1997,i=19453, -1998,i=19454, -1999,i=19455, -2000,i=19456, -2001,i=19458, -2002,i=19459, -2003,i=19460, -2004,i=19461, -2005,i=19464, -2006,i=19465, -2007,i=19466, -2008,i=19467, -2009,i=19468, -2010,i=19476, -2011,i=19477, -2012,i=19478, -2013,i=19479, -2014,i=19480, -2015,i=19481, -2016,i=19482, -2017,i=19483, -2018,i=19484, -2019,i=19485, -2020,i=19486, -2021,i=19487, -2022,i=19488, -2023,i=19505, -2024,i=19506, -2025,i=19509, -2026,i=19510, -2027,i=19518, -2028,i=20101, -2029,i=20138, -2030,i=20139, -2031,i=20141, -2032,i=20142, -2033,i=20143, -2034,i=20144, -2035,i=20145, -2036,i=20146, -2037,i=20147, -2038,i=20148, -2039,i=20149, -2040,i=20151, -2041,i=20152, -2042,i=20153, -2043,i=20154, -2044,i=20157, -2045,i=20158, -2046,i=20159, -2047,i=20160, -2048,i=20161, -2049,i=20169, -2050,i=20170, -2051,i=20171, -2052,i=20172, -2053,i=20173, -2054,i=20174, -2055,i=20175, -2056,i=20176, -2057,i=20177, -2058,i=20178, -2059,i=20179, -2060,i=20180, -2061,i=20181, -2062,i=20198, -2063,i=20199, -2064,i=20202, -2065,i=20203, -2066,i=20211, -2067,i=20249, -2068,i=20286, -2069,i=20287, -2070,i=20288, -2071,i=20289, -2072,i=13813, -2073,i=13814, -2074,i=13815, -2075,i=13816, -2076,i=13817, -2077,i=13818, -2078,i=13819, -2079,i=13821, -2080,i=13822, -2081,i=13823, -2082,i=13824, -2083,i=13825, -2084,i=13826, -2085,i=13827, -2086,i=13828, -2087,i=13829, -2088,i=13830, -2089,i=13831, -2090,i=13832, -2091,i=13833, -2092,i=13834, -2093,i=13835, -2094,i=13836, -2095,i=13837, -2096,i=13838, -2097,i=13839, -2098,i=13840, -2099,i=13841, -2100,i=13842, -2101,i=13843, -2102,i=13844, -2103,i=13845, -2104,i=13846, -2105,i=13847, -2106,i=13848, -2107,i=13849, -2108,i=13850, -2109,i=13851, -2110,i=13852, -2111,i=13853, -2112,i=13855, -2113,i=13856, -2114,i=13857, -2115,i=13858, -2116,i=13859, -2117,i=13860, -2118,i=13861, -2119,i=13862, -2120,i=13863, -2121,i=13864, -2122,i=13865, -2123,i=13866, -2124,i=13867, -2125,i=13868, -2126,i=13869, -2127,i=13870, -2128,i=13871, -2129,i=13872, -2130,i=13873, -2131,i=13874, -2132,i=13875, -2133,i=13876, -2134,i=13877, -2135,i=13878, -2136,i=13879, -2137,i=13880, -2138,i=13881, -2139,i=13882, -2140,i=13883, -2141,i=13884, -2142,i=13885, -2143,i=13886, -2144,i=13887, -2145,i=13889, -2146,i=13890, -2147,i=13891, -2148,i=13892, -2149,i=13893, -2150,i=13894, -2151,i=13895, -2152,i=13896, -2153,i=13897, -2154,i=13898, -2155,i=13899, -2156,i=13900, -2157,i=13901, -2158,i=13902, -2159,i=13903, -2160,i=13904, -2161,i=13905, -2162,i=13906, -2163,i=13907, -2164,i=13908, -2165,i=13909, -2166,i=13910, -2167,i=13911, -2168,i=13912, -2169,i=13913, -2170,i=13914, -2171,i=13915, -2172,i=13916, -2173,i=13917, -2174,i=13918, -2175,i=13919, -2176,i=13920, -2177,i=13921, -2178,i=13923, -2179,i=13924, -2180,i=13925, -2181,i=13926, -2182,i=13927, -2183,i=13928, -2184,i=13929, -2185,i=13930, -2186,i=13931, -2187,i=13932, -2188,i=13933, -2189,i=13934, -2190,i=13935, -2191,i=13936, -2192,i=13937, -2193,i=13938, -2194,i=13939, -2195,i=13940, -2196,i=13941, -2197,i=13942, -2198,i=13943, -2199,i=13944, -2200,i=13945, -2201,i=13946, -2202,i=13947, -2203,i=13948, -2204,i=13949, -2205,i=12556, -2206,i=12557, -2207,i=12558, -2208,i=15181, -2209,i=12559, -2210,i=12560, -2211,i=23537, -2212,i=23538, -2213,i=23539, -2214,i=23540, -2215,i=23541, -2216,i=23542, -2217,i=23543, -2218,i=32260, -2219,i=12561, -2220,i=32281, -2221,i=32285, -2222,i=32286, -2223,i=32287, -2224,i=32288, -2225,i=32289, -2226,i=32290, -2227,i=32291, -2228,i=32292, -2229,i=12581, -2230,i=13950, -2231,i=13951, -2232,i=13952, -2233,i=13953, -2234,i=13954, -2235,i=13955, -2236,i=13956, -2237,i=13958, -2238,i=13959, -2239,i=13960, -2240,i=13961, -2241,i=13962, -2242,i=13963, -2243,i=13964, -2244,i=13965, -2245,i=13966, -2246,i=13967, -2247,i=13968, -2248,i=13969, -2249,i=13970, -2250,i=13971, -2251,i=13972, -2252,i=13973, -2253,i=13974, -2254,i=13975, -2255,i=13976, -2256,i=13977, -2257,i=13978, -2258,i=13979, -2259,i=13980, -2260,i=13981, -2261,i=13982, -2262,i=13983, -2263,i=13984, -2264,i=25696, -2265,i=25724, -2266,i=25697, -2267,i=12708, -2268,i=12583, -2269,i=12584, -2270,i=12585, -2271,i=23593, -2272,i=12616, -2273,i=12617, -2274,i=12618, -2275,i=32296, -2276,i=32297, -2277,i=32298, -2278,i=12734, -2279,i=25698, -2280,i=12731, -2281,i=12732, -2282,i=12733, -2283,i=12775, -2284,i=12776, -2285,i=25699, -2286,i=32299, -2287,i=32300, -2288,i=32301, -2289,i=32302, -2290,i=32303, -2291,i=32304, -2292,i=32305, -2293,i=32306, -2294,i=12620, -2295,i=13735, -2296,i=13736, -2297,i=12637, -2298,i=14053, -2299,i=14156, -2300,i=12642, -2301,i=12643, -2302,i=14157, -2303,i=14158, -2304,i=12646, -2305,i=12647, -2306,i=12648, -2307,i=12649, -2308,i=12650, -2309,i=12651, -2310,i=12652, -2311,i=12653, -2312,i=12654, -2313,i=12655, -2314,i=12656, -2315,i=12657, -2316,i=12658, -2317,i=12659, -2318,i=12660, -2319,i=12661, -2320,i=12662, -2321,i=12663, -2322,i=12664, -2323,i=12665, -2324,i=12666, -2325,i=14160, -2326,i=12667, -2327,i=12668, -2328,i=12669, -2329,i=12670, -2330,i=12671, -2331,i=14161, -2332,i=14088, -2333,i=14089, -2334,i=14090, -2335,i=14091, -2336,i=14092, -2337,i=14093, -2338,i=14095, -2339,i=14096, -2340,i=14097, -2341,i=14098, -2342,i=14099, -2343,i=14100, -2344,i=14101, -2345,i=14102, -2346,i=14103, -2347,i=14104, -2348,i=14105, -2349,i=14106, -2350,i=14107, -2351,i=14108, -2352,i=14109, -2353,i=14110, -2354,i=14111, -2355,i=14112, -2356,i=14113, -2357,i=14114, -2358,i=14115, -2359,i=14116, -2360,i=14117, -2361,i=14118, -2362,i=14119, -2363,i=14120, -2364,i=14121, -2365,i=14122, -2366,i=14123, -2367,i=14124, -2368,i=14125, -2369,i=14126, -2370,i=14127, -2371,i=14129, -2372,i=14130, -2373,i=14131, -2374,i=14132, -2375,i=14133, -2376,i=14134, -2377,i=14135, -2378,i=14136, -2379,i=14137, -2380,i=14138, -2381,i=14139, -2382,i=14140, -2383,i=14141, -2384,i=14142, -2385,i=14143, -2386,i=14144, -2387,i=14145, -2388,i=14146, -2389,i=14147, -2390,i=14148, -2391,i=14149, -2392,i=14150, -2393,i=14151, -2394,i=14152, -2395,i=14153, -2396,i=14154, -2397,i=14155, -2398,i=25706, -2399,i=25725, -2400,i=25707, -2401,i=12710, -2402,i=12639, -2403,i=12640, -2404,i=12641, -2405,i=23597, -2406,i=13737, -2407,i=13738, -2408,i=13739, -2409,i=12740, -2410,i=25708, -2411,i=12737, -2412,i=12738, -2413,i=12739, -2414,i=12777, -2415,i=12778, -2416,i=25709, -2417,i=25710, -2418,i=17496, -2419,i=17511, -2420,i=17512, -2421,i=17513, -2422,i=17522, -2423,i=17523, -2424,i=17524, -2425,i=18155, -2426,i=18001, -2427,i=18069, -2428,i=18165, -2429,i=18004, -2430,i=18005, -2431,i=17534, -2432,i=17535, -2433,i=17536, -2434,i=18006, -2435,i=18007, -2436,i=18008, -2437,i=18011, -2438,i=18028, -2439,i=18029, -2440,i=18047, -2441,i=18064, -2442,i=23556, -2443,i=23557, -2444,i=23558, -2445,i=23559, -2446,i=23560, -2447,i=17732, -2448,i=17852, -2449,i=18072, -2450,i=17860, -2451,i=18073, -2452,i=11187, -2453,i=11188, -2454,i=11189, -2455,i=11190, -2456,i=11191, -2457,i=2341, -2458,i=2342, -2459,i=2343, -2460,i=11285, -2461,i=2344, -2462,i=11304, -2463,i=2346, -2464,i=2347, -2465,i=2348, -2466,i=2349, -2467,i=2350, -2468,i=11286, -2469,i=11287, -2470,i=11305, -2471,i=11306, -2472,i=11288, -2473,i=2351, -2474,i=2352, -2475,i=11307, -2476,i=11308, -2477,i=2355, -2478,i=2357, -2479,i=2358, -2480,i=2359, -2481,i=11505, -2482,i=11506, -2483,i=11507, -2484,i=2360, -2485,i=2361, -2486,i=2362, -2487,i=2363, -2488,i=2364, -2489,i=11292, -2490,i=11426, -2491,i=11427, -2492,i=11428, -2493,i=11429, -2494,i=15534, -2495,i=14525, -2496,i=15487, -2497,i=15488, -2498,i=15005, -2499,i=15006, -2500,i=24105, -2501,i=24106, -2502,i=24107, -2503,i=14647, -2504,i=14648, -2505,i=14523, -2506,i=14524, -2507,i=15904, -2508,i=15577, -2509,i=14593, -2510,i=15578, -2511,i=15580, -2512,i=14273, -2513,i=15581, -2514,i=15582, -2515,i=25269, -2516,i=15583, -2517,i=15584, -2518,i=15597, -2519,i=15598, -2520,i=15605, -2521,i=15609, -2522,i=15480, -2523,i=15611, -2524,i=15616, -2525,i=15617, -2526,i=15618, -2527,i=15502, -2528,i=15510, -2529,i=15520, -2530,i=15621, -2531,i=15622, -2532,i=15623, -2533,i=15628, -2534,i=15629, -2535,i=15630, -2536,i=15631, -2537,i=14744, -2538,i=15874, -2539,i=15875, -2540,i=15635, -2541,i=15530, -2542,i=23599, -2543,i=23600, -2544,i=23601, -2545,i=25270, -2546,i=23602, -2547,i=20408, -2548,i=15641, -2549,i=15642, -2550,i=15643, -2551,i=15645, -2552,i=15646, -2553,i=15647, -2554,i=15652, -2555,i=15653, -2556,i=15654, -2557,i=15655, -2558,i=15657, -2559,i=15658, -2560,i=15659, -2561,i=15664, -2562,i=15665, -2563,i=23603, -2564,i=23604, -2565,i=23605, -2566,i=23608, -2567,i=23609, -2568,i=17467, -2569,i=23612, -2570,i=15532, -2571,i=23613, -2572,i=23614, -2573,i=15007, -2574,i=15008, -2575,i=15009, -2576,i=15667, -2577,i=15669, -2578,i=15670, -2579,i=15906, -2580,i=15907, -2581,i=15908, -2582,i=15909, -2583,i=15910, -2584,i=15911, -2585,i=15912, -2586,i=15913, -2587,i=15914, -2588,i=15915, -2589,i=15916, -2590,i=15917, -2591,i=15918, -2592,i=25277, -2593,i=25278, -2594,i=25279, -2595,i=25280, -2596,i=25281, -2597,i=25282, -2598,i=15452, -2599,i=15453, -2600,i=15454, -2601,i=15455, -2602,i=15456, -2603,i=15457, -2604,i=15458, -2605,i=25293, -2606,i=25294, -2607,i=25295, -2608,i=25296, -2609,i=25297, -2610,i=25298, -2611,i=15459, -2612,i=15460, -2613,i=15010, -2614,i=15011, -2615,i=15012, -2616,i=15043, -2617,i=15461, -2618,i=15462, -2619,i=15463, -2620,i=15464, -2621,i=15465, -2622,i=25312, -2623,i=25313, -2624,i=25314, -2625,i=25315, -2626,i=25316, -2627,i=25317, -2628,i=15471, -2629,i=15472, -2630,i=15046, -2631,i=15047, -2632,i=15048, -2633,i=15056, -2634,i=25624, -2635,i=25625, -2636,i=25345, -2637,i=25337, -2638,i=25626, -2639,i=25627, -2640,i=25628, -2641,i=25629, -2642,i=25630, -2643,i=25631, -2644,i=25634, -2645,i=25635, -2646,i=25340, -2647,i=25636, -2648,i=25637, -2649,i=25638, -2650,i=25639, -2651,i=25640, -2652,i=25641, -2653,i=25642, -2654,i=25643, -2655,i=25644, -2656,i=25645, -2657,i=25646, -2658,i=25647, -2659,i=25346, -2660,i=25347, -2661,i=25348, -2662,i=25349, -2663,i=25350, -2664,i=25351, -2665,i=25352, -2666,i=25353, -2667,i=25354, -2668,i=25355, -2669,i=25356, -2670,i=25357, -2671,i=25358, -2672,i=25648, -2673,i=25649, -2674,i=25361, -2675,i=25650, -2676,i=25651, -2677,i=25652, -2678,i=25653, -2679,i=25654, -2680,i=25655, -2681,i=25656, -2682,i=25657, -2683,i=25658, -2684,i=25659, -2685,i=25660, -2686,i=25661, -2687,i=25366, -2688,i=25367, -2689,i=25368, -2690,i=25369, -2691,i=25370, -2692,i=25371, -2693,i=25372, -2694,i=25373, -2695,i=25374, -2696,i=25375, -2697,i=14416, -2698,i=14417, -2699,i=14418, -2700,i=17292, -2701,i=17706, -2702,i=17478, -2703,i=14423, -2704,i=15533, -2705,i=17503, -2706,i=14419, -2707,i=14420, -2708,i=17296, -2709,i=17297, -2710,i=16598, -2711,i=16599, -2712,i=16600, -2713,i=14432, -2714,i=14433, -2715,i=14434, -2716,i=23622, -2717,i=25403, -2718,i=25404, -2719,i=25405, -2720,i=25406, -2721,i=25407, -2722,i=25411, -2723,i=25412, -2724,i=25413, -2725,i=25414, -2726,i=25415, -2727,i=25416, -2728,i=25417, -2729,i=25418, -2730,i=25419, -2731,i=25420, -2732,i=25421, -2733,i=25422, -2734,i=25423, -2735,i=25424, -2736,i=25425, -2737,i=25426, -2738,i=25427, -2739,i=25428, -2740,i=25429, -2741,i=25430, -2742,i=25431, -2743,i=15844, -2744,i=15845, -2745,i=18715, -2746,i=18716, -2747,i=18717, -2748,i=18718, -2749,i=18719, -2750,i=18720, -2751,i=18722, -2752,i=18723, -2753,i=18724, -2754,i=18725, -2755,i=18727, -2756,i=18728, -2757,i=18729, -2758,i=18730, -2759,i=18731, -2760,i=18732, -2761,i=18733, -2762,i=18735, -2763,i=18736, -2764,i=18737, -2765,i=18738, -2766,i=18740, -2767,i=18741, -2768,i=18742, -2769,i=18743, -2770,i=18745, -2771,i=18746, -2772,i=18747, -2773,i=18748, -2774,i=18750, -2775,i=18751, -2776,i=18752, -2777,i=18753, -2778,i=18755, -2779,i=18756, -2780,i=18757, -2781,i=18758, -2782,i=18760, -2783,i=18761, -2784,i=18762, -2785,i=18763, -2786,i=18764, -2787,i=18765, -2788,i=18766, -2789,i=18767, -2790,i=18768, -2791,i=23642, -2792,i=23643, -2793,i=23644, -2794,i=23645, -2795,i=23646, -2796,i=23647, -2797,i=23648, -2798,i=23649, -2799,i=24009, -2800,i=17479, -2801,i=25432, -2802,i=25433, -2803,i=32396, -2804,i=32397, -2805,i=14443, -2806,i=15215, -2807,i=15216, -2808,i=15217, -2809,i=15440, -2810,i=15441, -2811,i=15442, -2812,i=15443, -2813,i=15444, -2814,i=15445, -2815,i=15446, -2816,i=15447, -2817,i=15448, -2818,i=25440, -2819,i=25441, -2820,i=25442, -2821,i=25443, -2822,i=25444, -2823,i=25445, -2824,i=17364, -2825,i=17365, -2826,i=17366, -2827,i=17367, -2828,i=17368, -2829,i=17369, -2830,i=17370, -2831,i=17371, -2832,i=23658, -2833,i=25451, -2834,i=25452, -2835,i=25453, -2836,i=25454, -2837,i=25455, -2838,i=25459, -2839,i=25460, -2840,i=25461, -2841,i=25462, -2842,i=25463, -2843,i=25464, -2844,i=25465, -2845,i=25466, -2846,i=25467, -2847,i=25468, -2848,i=25469, -2849,i=25470, -2850,i=25471, -2851,i=25472, -2852,i=25473, -2853,i=25474, -2854,i=25475, -2855,i=25476, -2856,i=25477, -2857,i=25478, -2858,i=25479, -2859,i=17405, -2860,i=17406, -2861,i=17409, -2862,i=17410, -2863,i=17411, -2864,i=17412, -2865,i=17413, -2866,i=17414, -2867,i=17416, -2868,i=17417, -2869,i=17418, -2870,i=17419, -2871,i=17421, -2872,i=17422, -2873,i=17423, -2874,i=17424, -2875,i=17425, -2876,i=17426, -2877,i=17429, -2878,i=17431, -2879,i=17432, -2880,i=17433, -2881,i=17434, -2882,i=17436, -2883,i=17437, -2884,i=17438, -2885,i=17439, -2886,i=17441, -2887,i=17442, -2888,i=17443, -2889,i=17444, -2890,i=17446, -2891,i=17447, -2892,i=17448, -2893,i=17449, -2894,i=17451, -2895,i=17452, -2896,i=17453, -2897,i=17454, -2898,i=17457, -2899,i=17458, -2900,i=17459, -2901,i=17460, -2902,i=17461, -2903,i=17462, -2904,i=17463, -2905,i=17464, -2906,i=17466, -2907,i=23678, -2908,i=23679, -2909,i=23680, -2910,i=23681, -2911,i=23682, -2912,i=23683, -2913,i=23684, -2914,i=23685, -2915,i=17481, -2916,i=25480, -2917,i=25481, -2918,i=32403, -2919,i=32404, -2920,i=32405, -2921,i=32406, -2922,i=32407,UAEnumeration -2923,i=32408, -2924,i=32409, -2925,i=32410, -2926,i=32411, -2927,i=32412, -2928,i=32413, -2929,i=32414,UAEnumeration -2930,i=32415, -2931,i=32416, -2932,i=32417, -2933,i=32424, -2934,i=32425, -2935,i=32426, -2936,i=32427, -2937,i=32428, -2938,i=32429, -2939,i=32508, -2940,i=32509, -2941,i=32510, -2942,i=32511, -2943,i=32512, -2944,i=32513, -2945,i=32514, -2946,i=32515, -2947,i=32535, -2948,i=32546, -2949,i=32547, -2950,i=32548, -2951,i=32549, -2952,i=32550, -2953,i=32554, -2954,i=32555, -2955,i=32556, -2956,i=32557, -2957,i=32558, -2958,i=32559, -2959,i=32560, -2960,i=32561, -2961,i=32562, -2962,i=32563, -2963,i=32564, -2964,i=32565, -2965,i=32566, -2966,i=32567, -2967,i=32568, -2968,i=32569, -2969,i=32570, -2970,i=32571, -2971,i=32572, -2972,i=32573, -2973,i=32574, -2974,i=32575, -2975,i=32576, -2976,i=32579, -2977,i=32580, -2978,i=32581, -2979,i=32582, -2980,i=32583, -2981,i=32584, -2982,i=32586, -2983,i=32587, -2984,i=32588, -2985,i=32589, -2986,i=32591, -2987,i=32592, -2988,i=32593, -2989,i=32594, -2990,i=32595, -2991,i=32596, -2992,i=32597, -2993,i=32599, -2994,i=32600, -2995,i=32601, -2996,i=32602, -2997,i=32604, -2998,i=32605, -2999,i=32606, -3000,i=32607, -3001,i=32609, -3002,i=32610, -3003,i=32611, -3004,i=32612, -3005,i=32614, -3006,i=32615, -3007,i=32616, -3008,i=32617, -3009,i=32619, -3010,i=32620, -3011,i=32621, -3012,i=32622, -3013,i=32624, -3014,i=32625, -3015,i=32626, -3016,i=32627, -3017,i=32628, -3018,i=32629, -3019,i=32630, -3020,i=32631, -3021,i=32632, -3022,i=32633, -3023,i=32634, -3024,i=32635, -3025,i=32636, -3026,i=32637, -3027,i=32638, -3028,i=32656, -3029,i=32644, -3030,i=32646, -3031,i=32647, -3032,i=32648, -3033,i=14476, -3034,i=25482, -3035,i=25505, -3036,i=25506, -3037,i=25507, -3038,i=25508, -3039,i=25509, -3040,i=25510, -3041,i=25517, -3042,i=25518, -3043,i=25519, -3044,i=25520, -3045,i=14509, -3046,i=15222, -3047,i=16720, -3048,i=16721, -3049,i=17482, -3050,i=15223, -3051,i=15224, -3052,i=14519, -3053,i=15229, -3054,i=16759, -3055,i=25521, -3056,i=15481, -3057,i=15482, -3058,i=15483, -3059,i=15484, -3060,i=15485, -3061,i=15486, -3062,i=15489, -3063,i=15490, -3064,i=15491, -3065,i=15492, -3066,i=15493, -3067,i=15494, -3068,i=15495, -3069,i=14936, -3070,i=14534, -3071,i=14548, -3072,i=14555, -3073,i=14556, -3074,i=14557, -3075,i=14558, -3076,i=14559, -3077,i=14560, -3078,i=14572, -3079,i=14586, -3080,i=14587, -3081,i=14588, -3082,i=15052, -3083,i=15053, -3084,i=15517, -3085,i=14477, -3086,i=14478, -3087,i=14479, -3088,i=14480, -3089,i=14481, -3090,i=14482, -3091,i=14483, -3092,i=14484, -3093,i=16842, -3094,i=16843, -3095,i=16853, -3096,i=16881, -3097,i=16882, -3098,i=16883, -3099,i=14485, -3100,i=14486, -3101,i=16884, -3102,i=16894, -3103,i=16922, -3104,i=16923, -3105,i=16924, -3106,i=14487, -3107,i=14489, -3108,i=15221, -3109,i=14493, -3110,i=14494, -3111,i=14495, -3112,i=14496, -3113,i=14497, -3114,i=14498, -3115,i=16935, -3116,i=16958, -3117,i=16959, -3118,i=16960, -3119,i=16961, -3120,i=16971, -3121,i=14499, -3122,i=14500, -3123,i=16994, -3124,i=16995,UAEnumeration -3125,i=16996, -3126,i=16997, -3127,i=17007, -3128,i=14209, -3129,i=14595, -3130,i=17306, -3131,i=17710, -3132,i=17485, -3133,i=14221, -3134,i=17202, -3135,i=17576, -3136,i=17203, -3137,i=17310, -3138,i=17311, -3139,i=17204, -3140,i=17486, -3141,i=17314, -3142,i=17315, -3143,i=17214, -3144,i=17318, -3145,i=17319, -3146,i=17321, -3147,i=17322, -3148,i=17558, -3149,i=17325, -3150,i=17326, -3151,i=17302, -3152,i=17487, -3153,i=17329, -3154,i=17330, -3155,i=14600, -3156,i=14601, -3157,i=19241, -3158,i=19242, -3159,i=19243, -3160,i=19244, -3161,i=19245, -3162,i=19246, -3163,i=19248, -3164,i=19249, -3165,i=19250, -3166,i=19251, -3167,i=19253, -3168,i=19254, -3169,i=19255, -3170,i=19256, -3171,i=19257, -3172,i=19258, -3173,i=19259, -3174,i=19261, -3175,i=19262, -3176,i=19263, -3177,i=19264, -3178,i=19266, -3179,i=19267, -3180,i=19268, -3181,i=19269, -3182,i=19271, -3183,i=19272, -3184,i=19273, -3185,i=19274, -3186,i=19276, -3187,i=19277, -3188,i=19278, -3189,i=19279, -3190,i=19281, -3191,i=19282, -3192,i=19283, -3193,i=19284, -3194,i=19286, -3195,i=19287, -3196,i=19288, -3197,i=17427, -3198,i=17428, -3199,i=17456, -3200,i=17465, -3201,i=17507, -3202,i=17508, -3203,i=14225, -3204,i=14226, -3205,i=17721, -3206,i=14232, -3207,i=15926, -3208,i=15927, -3209,i=15928, -3210,i=17724, -3211,i=17488, -3212,i=15265, -3213,i=15266, -3214,i=17725, -3215,i=17736, -3216,i=17737, -3217,i=17738, -3218,i=17739, -3219,i=17740, -3220,i=17559, -3221,i=17741, -3222,i=17742, -3223,i=17743, -3224,i=17744, -3225,i=17745, -3226,i=17490, -3227,i=17749, -3228,i=17750, -3229,i=17812, -3230,i=17813, -3231,i=17814, -3232,i=17815, -3233,i=17816, -3234,i=17817, -3235,i=17819,UAEURange -3236,i=17820,UAEngineeringUnits -3237,i=17821, -3238,i=17822, -3239,i=17824, -3240,i=17825, -3241,i=17826, -3242,i=17827, -3243,i=17828, -3244,i=17829, -3245,i=17830, -3246,i=17832, -3247,i=17833, -3248,i=17834, -3249,i=17835, -3250,i=17837, -3251,i=17838, -3252,i=17839, -3253,i=17840, -3254,i=17842, -3255,i=17843, -3256,i=17844, -3257,i=17845, -3258,i=17847, -3259,i=17848, -3260,i=17849, -3261,i=17850, -3262,i=17853, -3263,i=17854, -3264,i=17855, -3265,i=17856, -3266,i=17859, -3267,i=17864, -3268,i=17871, -3269,i=17872, -3270,i=17874, -3271,i=17878, -3272,i=17885, -3273,i=17892, -3274,i=17900, -3275,i=17901, -3276,i=17902, -3277,i=17903, -3278,i=17858, -3279,i=17913, -3280,i=17920, -3281,i=17927, -3282,i=17934, -3283,i=17969, -3284,i=17976, -3285,i=17987, -3286,i=17992, -3287,i=17993, -3288,i=15296, -3289,i=18804, -3290,i=17997, -3291,i=17998, -3292,i=17999, -3293,i=18076, -3294,i=18077, -3295,i=18078, -3296,i=18079, -3297,i=18080, -3298,i=18081, -3299,i=18082, -3300,i=17560, -3301,i=17562, -3302,i=17492, -3303,i=18088, -3304,i=18089, -3305,i=21006, -3306,i=21015, -3307,i=21016, -3308,i=21017, -3309,i=21018, -3310,i=21019, -3311,i=21020, -3312,i=21022, -3313,i=21023, -3314,i=21024, -3315,i=21025, -3316,i=21027, -3317,i=21028, -3318,i=21029, -3319,i=21030, -3320,i=21031, -3321,i=21032, -3322,i=21033, -3323,i=21035, -3324,i=21036, -3325,i=21037, -3326,i=21038, -3327,i=21040, -3328,i=21041, -3329,i=21042, -3330,i=21043, -3331,i=21045, -3332,i=21046, -3333,i=21047, -3334,i=21048, -3335,i=21050, -3336,i=21051, -3337,i=21052, -3338,i=21053, -3339,i=21055, -3340,i=21056, -3341,i=21057, -3342,i=21058, -3343,i=21061, -3344,i=21062, -3345,i=21063, -3346,i=21064, -3347,i=21060, -3348,i=21076, -3349,i=21077, -3350,i=21078, -3351,i=21079, -3352,i=21080, -3353,i=21081, -3354,i=21082, -3355,i=21083, -3356,i=21084, -3357,i=21085, -3358,i=21086, -3359,i=15297, -3360,i=18805, -3361,i=21090, -3362,i=21091, -3363,i=15298, -3364,i=21092, -3365,i=21093, -3366,i=21094, -3367,i=17493, -3368,i=15303, -3369,i=21095, -3370,i=15299, -3371,i=15300, -3372,i=19550, -3373,i=19551, -3374,i=19552, -3375,i=19553, -3376,i=19554, -3377,i=19555, -3378,i=19557, -3379,i=19558, -3380,i=19559, -3381,i=19560, -3382,i=19562, -3383,i=19563, -3384,i=19564, -3385,i=19565, -3386,i=19566, -3387,i=19567, -3388,i=19568, -3389,i=19570, -3390,i=19571, -3391,i=19572, -3392,i=19573, -3393,i=19575, -3394,i=19576, -3395,i=19577, -3396,i=19578, -3397,i=19580, -3398,i=19581, -3399,i=19582, -3400,i=19583, -3401,i=19585, -3402,i=19586, -3403,i=19587, -3404,i=19588, -3405,i=19590, -3406,i=19591, -3407,i=19592, -3408,i=19593, -3409,i=19596, -3410,i=19597, -3411,i=19598, -3412,i=19599, -3413,i=19595, -3414,i=15305, -3415,i=21096, -3416,i=15306, -3417,i=21097, -3418,i=21098, -3419,i=21099, -3420,i=21100, -3421,i=21101, -3422,i=21102, -3423,i=17563, -3424,i=17564, -3425,i=15932, -3426,i=15933, -3427,i=15934, -3428,i=17494, -3429,i=15311, -3430,i=21103, -3431,i=15307, -3432,i=15308, -3433,i=19609, -3434,i=19610, -3435,i=19611, -3436,i=19612, -3437,i=19613, -3438,i=19614, -3439,i=19616, -3440,i=19617, -3441,i=19618, -3442,i=19619, -3443,i=19621, -3444,i=19622, -3445,i=19623, -3446,i=19624, -3447,i=19625, -3448,i=19626, -3449,i=19627, -3450,i=19629, -3451,i=19630, -3452,i=19631, -3453,i=19632, -3454,i=19634, -3455,i=19635, -3456,i=19636, -3457,i=19637, -3458,i=19639, -3459,i=19640, -3460,i=19641, -3461,i=19642, -3462,i=19644, -3463,i=19645, -3464,i=19646, -3465,i=19647, -3466,i=19649, -3467,i=19650, -3468,i=19651, -3469,i=19652, -3470,i=19655, -3471,i=19656, -3472,i=19657, -3473,i=19658, -3474,i=19654, -3475,i=15316, -3476,i=17386, -3477,i=17387, -3478,i=17388, -3479,i=17389, -3480,i=17390, -3481,i=17391, -3482,i=15319, -3483,i=21104, -3484,i=15108, -3485,i=15111, -3486,i=15114, -3487,i=15115, -3488,i=15116, -3489,i=15117, -3490,i=15118, -3491,i=15119, -3492,i=15120, -3493,i=15127, -3494,i=23795, -3495,i=23796, -3496,i=23797, -3497,i=23798, -3498,i=23799, -3499,i=23800, -3500,i=23801, -3501,i=23802, -3502,i=23803, -3503,i=23804, -3504,i=23805, -3505,i=23806, -3506,i=23807, -3507,i=23808, -3508,i=23809, -3509,i=23810, -3510,i=23811, -3511,i=23812, -3512,i=23813, -3513,i=23814, -3514,i=23815, -3515,i=23816, -3516,i=23817, -3517,i=23818, -3518,i=23819, -3519,i=23820, -3520,i=23828, -3521,i=23829, -3522,i=23830, -3523,i=23831, -3524,i=14643, -3525,i=14644, -3526,i=14645, -3527,i=14646, -3528,i=19677, -3529,i=19678, -3530,i=19679, -3531,i=19680, -3532,i=19681, -3533,i=19682, -3534,i=19684, -3535,i=19685, -3536,i=19686, -3537,i=19687, -3538,i=19689, -3539,i=19690, -3540,i=19691, -3541,i=19692, -3542,i=19693, -3543,i=19694, -3544,i=19695, -3545,i=19697, -3546,i=19698, -3547,i=19699, -3548,i=19700, -3549,i=19702, -3550,i=19703, -3551,i=19704, -3552,i=19705, -3553,i=19707, -3554,i=19708, -3555,i=19709, -3556,i=19710, -3557,i=19712, -3558,i=19713, -3559,i=19714, -3560,i=19715, -3561,i=19717, -3562,i=19718, -3563,i=19719, -3564,i=19720, -3565,i=19722, -3566,i=19723,UAInt32 -3567,i=19724, -3568,i=19725, -3569,i=19726, -3570,i=19727, -3571,i=19728, -3572,i=19729, -3573,i=19730,UAInt32 -3574,i=19731, -3575,i=19732, -3576,i=19777, -3577,i=19778, -3578,i=19779, -3579,i=19780, -3580,i=19781, -3581,i=19782, -3582,i=19783, -3583,i=19784, -3584,i=19785, -3585,i=19786, -3586,i=19831, -3587,i=19832, -3588,i=19833, -3589,i=19834, -3590,i=19848, -3591,i=19880, -3592,i=19881, -3593,i=19882, -3594,i=19883, -3595,i=19885, -3596,i=19886, -3597,i=19887, -3598,i=19888, -3599,i=19890, -3600,i=19891, -3601,i=19892, -3602,i=19893, -3603,i=19879, -3604,i=19895, -3605,i=19896, -3606,i=19897, -3607,i=19898, -3608,i=19899, -3609,i=19900, -3610,i=19901, -3611,i=19902, -3612,i=19903, -3613,i=19917, -3614,i=19949, -3615,i=19950, -3616,i=19951, -3617,i=19952, -3618,i=19954, -3619,i=19955, -3620,i=19956, -3621,i=19957, -3622,i=19959, -3623,i=19960, -3624,i=19961, -3625,i=19962, -3626,i=19948, -3627,i=19964, -3628,i=19965, -3629,i=19966, -3630,i=19967, -3631,i=19968, -3632,i=19982, -3633,i=20014, -3634,i=20015, -3635,i=20016, -3636,i=20017, -3637,i=20013, -3638,i=20019, -3639,i=20020, -3640,i=20021, -3641,i=20022, -3642,i=20023, -3643,i=20024, -3644,i=20025, -3645,i=20026, -3646,i=20027, -3647,i=20041, -3648,i=20073, -3649,i=20074, -3650,i=20075, -3651,i=20076, -3652,i=20078, -3653,i=20079, -3654,i=20080, -3655,i=20081, -3656,i=20072, -3657,i=20083, -3658,i=20084, -3659,i=20085, -3660,i=20086, -3661,i=20087, -3662,i=20088, -3663,i=20089, -3664,i=20090, -3665,i=20091, -3666,i=20092, -3667,i=20093, -3668,i=20094, -3669,i=23832, -3670,i=23833, -3671,i=23834, -3672,i=23835, -3673,i=23836, -3674,i=23837, -3675,i=23838, -3676,i=32651, -3677,i=32652, -3678,i=32653, -3679,i=32654, -3680,i=32655, -3681,i=15535, -3682,i=15545, -3683,i=15546, -3684,i=15547, -3685,i=15548, -3686,i=15561, -3687,i=15562, -3688,i=15563, -3689,i=15576, -3690,i=21105, -3691,i=21106, -3692,i=21107, -3693,i=21108, -3694,i=21109, -3695,i=21110, -3696,i=21111, -3697,i=21112, -3698,i=21113, -3699,i=21114, -3700,i=21115, -3701,i=21116, -3702,i=21117, -3703,i=21119, -3704,i=17477, -3705,i=21120, -3706,i=21121, -3707,i=21122, -3708,i=21123, -3709,i=21124, -3710,i=21125, -3711,i=21126, -3712,i=21127, -3713,i=21128, -3714,i=21129, -3715,i=21130, -3716,i=21131, -3717,i=21132, -3718,i=15064, -3719,i=15072, -3720,i=15154, -3721,i=17579, -3722,i=23839, -3723,i=23840, -3724,i=25525, -3725,i=25526, -3726,i=21133, -3727,i=21134, -3728,i=21135, -3729,i=23842, -3730,i=23843, -3731,i=23844, -3732,i=25527, -3733,i=23847, -3734,i=23848, -3735,i=23849, -3736,i=24016, -3737,i=24017, -3738,i=24018, -3739,i=24019, -3740,i=25528, -3741,i=24022, -3742,i=24023, -3743,i=15155, -3744,i=15156, -3745,i=15178, -3746,i=21136, -3747,i=21137, -3748,i=15246, -3749,i=15247, -3750,i=15249, -3751,i=21138, -3752,i=21139, -3753,i=21140, -3754,i=15250, -3755,i=15251, -3756,i=15330, -3757,i=21141, -3758,i=21142, -3759,i=21143, -3760,i=15334, -3761,i=15419, -3762,i=15420, -3763,i=21144, -3764,i=21145, -3765,i=21146, -3766,i=17582, -3767,i=21147, -3768,i=21149, -3769,i=23455, -3770,i=23456, -3771,i=23457, -3772,i=23458, -3773,i=23459, -3774,i=23460, -3775,i=23461, -3776,i=23462, -3777,i=23463, -3778,i=23464, -3779,i=23468, -3780,i=23469, -3781,i=23470, -3782,i=23476, -3783,i=23477, -3784,i=23478, -3785,i=23479, -3786,i=23485, -3787,i=23486, -3788,i=23487, -3789,i=23488, -3790,i=23494, -3791,i=23495, -3792,i=23496, -3793,i=24264, -3794,i=24265, -3795,i=24266, -3796,i=24267, -3797,i=24268, -3798,i=24269, -3799,i=24270, -3800,i=24271, -3801,i=24272, -3802,i=24273, -3803,i=24274, -3804,i=24275, -3805,i=24276, -3806,i=24277, -3807,i=24278, -3808,i=24279, -3809,i=24280, -3810,i=24281, -3811,i=24290, -3812,i=24301, -3813,i=24302, -3814,i=24303, -3815,i=24291, -3816,i=24304, -3817,i=24305, -3818,i=24306, -3819,i=24307, -3820,i=24308, -3821,i=24309, -3822,i=24310, -3823,i=24311, -3824,i=19077, -3825,i=19082, -3826,i=19083, -3827,i=19084, -3828,i=19090, -3829,i=25726, -3830,i=25731, -3831,i=26850, -3832,i=26851, -3833,i=26852, -3834,i=26849, -3835,i=26871, -3836,i=26872, -3837,i=26873, -3838,i=26874, -3839,i=26875, -3840,i=26876, -3841,i=26878, -3842,i=26879, -3843,i=26880, -3844,i=26881, -3845,i=26882, -3846,i=26883, -3847,i=26884, -3848,i=26885, -3849,i=26889, -3850,i=26890, -3851,i=26891, -3852,i=26892, -3853,i=26893, -3854,i=26894, -3855,i=26895, -3856,i=26896, -3857,i=26897, -3858,i=26898, -3859,i=26899, -3860,i=26900, -3861,i=26901, -3862,i=26902, -3863,i=26903, -3864,i=26904, -3865,i=26907, -3866,i=26908, -3867,i=26909, -3868,i=26910, -3869,i=26911, -3870,i=26912, -3871,i=26913, -3872,i=26914, -3873,i=26915, -3874,i=26916, -3875,i=26917, -3876,i=27997, -3877,i=27998, -3878,i=27999, -3879,i=28000, -3880,i=28001, -3881,i=28002, -3882,i=28003, -3883,i=28005, -3884,i=28006, -3885,i=28007, -3886,i=28008, -3887,i=28010, -3888,i=28011, -3889,i=28012, -3890,i=28013, -3891,i=28014, -3892,i=27996, -3893,i=29878, -3894,i=29879, -3895,i=29880, -3896,i=29881, -3897,i=24148, -3898,i=24149, -3899,i=24150, -3900,i=24151, -3901,i=24152, -3902,i=24157, -3903,i=24158, -3904,i=24159, -3905,i=24164, -3906,i=24165, -3907,i=24166, -3908,i=24233, -3909,i=24234, -3910,i=24167, -3911,i=24168, -3912,i=25218, -3913,i=25219, -3914,i=24169, -3915,i=24170, -3916,i=24171, -3917,i=24172, -3918,i=24173, -3919,i=24174, -3920,i=24175, -3921,i=24176, -3922,i=24177, -3923,i=24178, -3924,i=24179, -3925,i=24180, -3926,i=24181, -3927,i=24182, -3928,i=24183, -3929,i=24184, -3930,i=24185, -3931,i=24186, -3932,i=24187, -3933,i=24188, -3934,i=24189, -3935,i=24190, -3936,i=24191, -3937,i=24194, -3938,i=24195, -3939,i=24198, -3940,i=24199, -3941,i=24200, -3942,i=24201, -3943,i=24202, -3944,i=24203, -3945,i=24204, -3946,i=24205, -3947,i=24206, -3948,i=24207, -3949,i=24208, -3950,i=24209, -3951,i=24210, -3952,i=24235, -3953,i=24212, -3954,i=24236, -3955,i=24214, -3956,i=24237, -3957,i=24216, -3958,i=24238, -3959,i=24218, -3960,i=24239, -3961,i=24220, -3962,i=24240, -3963,i=24222, -3964,i=24241, -3965,i=24224, -3966,i=24242, -3967,i=25220, -3968,i=24226, -3969,i=24227, -3970,i=24228, -3971,i=24229, -3972,i=24230, -3973,i=24231, -3974,i=24232, -3975,i=25221, -3976,i=25222, -3977,i=25223, -3978,i=25224, -3979,i=25225, -3980,i=25252, -3981,i=25226, -3982,i=25227, -3983,i=25228, -3984,i=25229, -3985,i=25230, -3986,i=25231, -3987,i=25232, -3988,i=25237, -3989,i=25238, -3990,i=25253, -3991,i=25254, -3992,i=25255, -3993,i=25265, -3994,i=25256, -3995,i=25257, -3996,i=25258, -3997,i=25259, -3998,i=25260, -3999,i=25261, -4000,i=25262, -4001,i=25263, -4002,i=25264, -4003,i=32679, -4004,i=32657, -4005,i=32658, -4006,i=32659, -4007,i=32660, -4008,i=256,UAInt32 -4009,i=7591, -4010,i=257, -4011,i=11878, -4012,i=94, -4013,i=15030, -4014,i=15031, -4015,i=15032, -4016,i=15406, -4017,i=15407, -4018,i=15033, -4019,i=15034, -4020,i=95, -4021,i=15035, -4022,i=96, -4023,i=97, -4024,i=98, -4025,i=14528, -4026,i=101, -4027,i=99, -4028,i=100, -4029,i=296,UAExtensionObject -4030,i=7594,UAExtensionObject -4031,i=102, -4032,i=12755, -4033,i=12877, -4034,i=12878, -4035,i=12879, -4036,i=12880, -4037,i=12881, -4038,i=290, -4039,i=294, -4040,i=295, -4041,i=8912, -4042,i=17588, -4043,i=288, -4044,i=307, -4045,i=7597, -4046,i=308, -4047,i=20998, -4048,i=12189, -4049,i=311, -4050,i=302, -4051,i=7595, -4052,i=303, -4053,i=7596, -4054,i=304, -4055,i=312, -4056,i=432, -4057,i=12890, -4058,i=12891, -4059,i=315, -4060,i=7598, -4061,i=344, -4062,i=388, -4063,i=316, -4064,i=319, -4065,i=322, -4066,i=325, -4067,i=938, -4068,i=348, -4069,i=11881, -4070,i=376, -4071,i=379, -4072,i=382, -4073,i=385, -4074,i=347, -4075,i=15036, -4076,i=521, -4077,i=537, -4078,i=540, -4079,i=289, -4080,i=291,UAString -4081,i=331, -4082,i=576, -4083,i=7605, -4084,i=583, -4085,i=586, -4086,i=589, -4087,i=592, -4088,i=595, -4089,i=598, -4090,i=601, -4091,i=659, -4092,i=11234, -4093,i=11884, -4094,i=11293, -4095,i=11885, -4096,i=719, -4097,i=725, -4098,i=948, -4099,i=920, -4100,i=338, -4101,i=851, -4102,i=7611, -4103,i=852, -4104,i=7612, -4105,i=853, -4106,i=11943, -4107,i=11944, -4108,i=856, -4109,i=859, -4110,i=862, -4111,i=865, -4112,i=868, -4113,i=871, -4114,i=299, -4115,i=874, -4116,i=877, -4117,i=897, -4118,i=884,UAEURange -4119,i=887,UAEngineeringUnits -4120,i=12077, -4121,i=12078, -4122,i=12171, -4123,i=12172, -4124,i=12079, -4125,i=12080, -4126,i=894, -4127,i=24033, -4128,i=891, -4129,i=890, -4130,i=7614, -4131,i=12766, -4132,i=14846, -4133,i=17537, -4134,i=17549, -4135,i=15671, -4136,i=18815, -4137,i=18816, -4138,i=18817, -4139,i=18818, -4140,i=18819, -4141,i=18820, -4142,i=18821, -4143,i=18822, -4144,i=18823, -4145,i=15736, -4146,i=23507, -4147,i=12680, -4148,i=32382, -4149,i=15676, -4150,i=125, -4151,i=126, -4152,i=127, -4153,i=15421, -4154,i=15422, -4155,i=24108, -4156,i=24109, -4157,i=24110, -4158,i=124, -4159,i=14839, -4160,i=14847, -4161,i=15677, -4162,i=15678, -4163,i=14323, -4164,i=15679, -4165,i=15681, -4166,i=25529, -4167,i=15682, -4168,i=15683, -4169,i=15688, -4170,i=15689, -4171,i=21150, -4172,i=15691, -4173,i=15693, -4174,i=15694, -4175,i=15695, -4176,i=21151, -4177,i=21152, -4178,i=21153, -4179,i=15701, -4180,i=15702, -4181,i=15703, -4182,i=15705, -4183,i=15706, -4184,i=15707, -4185,i=15712, -4186,i=14848, -4187,i=15713, -4188,i=21154, -4189,i=23851, -4190,i=23852, -4191,i=23853, -4192,i=25530, -4193,i=23854, -4194,i=15715, -4195,i=15717, -4196,i=15718, -4197,i=15719, -4198,i=15724, -4199,i=15725, -4200,i=23855, -4201,i=23856, -4202,i=23857, -4203,i=23860, -4204,i=23861, -4205,i=17468, -4206,i=23864, -4207,i=21155, -4208,i=23865, -4209,i=23866, -4210,i=15479, -4211,i=15727, -4212,i=15729, -4213,i=15733, -4214,i=25531, -4215,i=25532, -4216,i=23499, -4217,i=24292, -4218,i=25239, -4219,i=32661, -4220,i=32662, -4221,i=128, -4222,i=121, -4223,i=14844, -4224,i=122, -4225,i=123, -4226,i=298, -4227,i=8251, -4228,i=14845, -4229,i=12765, -4230,i=8917, -4231,i=310, -4232,i=12207, -4233,i=306, -4234,i=314, -4235,i=434, -4236,i=12900, -4237,i=12901, -4238,i=346, -4239,i=318, -4240,i=321, -4241,i=324, -4242,i=327, -4243,i=940, -4244,i=378, -4245,i=381, -4246,i=384, -4247,i=387, -4248,i=539, -4249,i=542, -4250,i=333, -4251,i=585, -4252,i=588, -4253,i=591, -4254,i=594, -4255,i=597, -4256,i=600, -4257,i=603, -4258,i=661, -4259,i=721, -4260,i=727, -4261,i=950, -4262,i=922, -4263,i=340, -4264,i=855, -4265,i=11957, -4266,i=11958, -4267,i=858, -4268,i=861, -4269,i=864, -4270,i=867, -4271,i=870, -4272,i=873, -4273,i=301, -4274,i=876, -4275,i=879, -4276,i=899, -4277,i=886, -4278,i=889, -4279,i=12181, -4280,i=12182, -4281,i=12089, -4282,i=12090, -4283,i=896, -4284,i=24034, -4285,i=893, -4286,i=7617, -4287,i=7619, -4288,i=15037, -4289,i=12770, -4290,i=14873, -4291,i=17538, -4292,i=17550, -4293,i=15734, -4294,i=18824, -4295,i=18827, -4296,i=18830, -4297,i=18833, -4298,i=18836, -4299,i=18839, -4300,i=18842, -4301,i=18845, -4302,i=18848, -4303,i=15738, -4304,i=23514, -4305,i=12681, -4306,i=32383, -4307,i=15741, -4308,i=14855, -4309,i=15599, -4310,i=15602, -4311,i=15501, -4312,i=15521, -4313,i=24111, -4314,i=24114, -4315,i=24117, -4316,i=14849, -4317,i=14852, -4318,i=14876, -4319,i=15766, -4320,i=15769, -4321,i=14324, -4322,i=15772, -4323,i=15775, -4324,i=25533, -4325,i=15778, -4326,i=15781, -4327,i=15784, -4328,i=15787, -4329,i=21156, -4330,i=15793, -4331,i=15854, -4332,i=15857, -4333,i=15860, -4334,i=21159, -4335,i=21162, -4336,i=21165, -4337,i=15866, -4338,i=15869, -4339,i=15872, -4340,i=15877, -4341,i=15880, -4342,i=15883, -4343,i=15886, -4344,i=21002, -4345,i=15889, -4346,i=21168, -4347,i=23870, -4348,i=23873, -4349,i=23876, -4350,i=25536, -4351,i=23879, -4352,i=15895, -4353,i=15898, -4354,i=15919, -4355,i=15922, -4356,i=15925, -4357,i=15931, -4358,i=23882, -4359,i=23885, -4360,i=23888, -4361,i=23897, -4362,i=23900, -4363,i=17469, -4364,i=23909, -4365,i=21171, -4366,i=23912, -4367,i=23915, -4368,i=15524, -4369,i=15940, -4370,i=15943, -4371,i=15946, -4372,i=25539, -4373,i=25542, -4374,i=23502, -4375,i=24293, -4376,i=25240, -4377,i=32663, -4378,i=32666, -4379,i=16131, -4380,i=18178, -4381,i=18181, -4382,i=18184, -4383,i=18187, -4384,i=7650, -4385,i=7656, -4386,i=14870, -4387,i=12767, -4388,i=8914, -4389,i=7665, -4390,i=12213, -4391,i=7662, -4392,i=7668, -4393,i=7782, -4394,i=12902, -4395,i=12905, -4396,i=7698, -4397,i=7671, -4398,i=7674, -4399,i=7677, -4400,i=7680, -4401,i=7683, -4402,i=7728, -4403,i=7731, -4404,i=7734, -4405,i=7737, -4406,i=12718, -4407,i=12721, -4408,i=7686, -4409,i=7929, -4410,i=7932, -4411,i=7935, -4412,i=7938, -4413,i=7941, -4414,i=7944, -4415,i=7947, -4416,i=8004, -4417,i=8067, -4418,i=8073, -4419,i=8076, -4420,i=8172, -4421,i=7692, -4422,i=8208, -4423,i=11959, -4424,i=11962, -4425,i=8211, -4426,i=8214, -4427,i=8217, -4428,i=8220, -4429,i=8223, -4430,i=8226, -4431,i=7659, -4432,i=8229, -4433,i=8232, -4434,i=8235, -4435,i=8238, -4436,i=8241, -4437,i=12183, -4438,i=12186, -4439,i=12091, -4440,i=12094, -4441,i=8247, -4442,i=24035, -4443,i=8244, -4444,i=12758, -4445,i=14802, -4446,i=17541, -4447,i=17553, -4448,i=15949, -4449,i=18851, -4450,i=18852, -4451,i=18853, -4452,i=18854, -4453,i=18855, -4454,i=18856, -4455,i=18857, -4456,i=18858, -4457,i=18859, -4458,i=15728, -4459,i=23520, -4460,i=12676, -4461,i=32386,UAExtensionObject -4462,i=15950, -4463,i=14796, -4464,i=15589, -4465,i=15590, -4466,i=15529, -4467,i=15531, -4468,i=24120, -4469,i=24121, -4470,i=24122, -4471,i=14794, -4472,i=14795, -4473,i=14803, -4474,i=15951, -4475,i=15952, -4476,i=14319, -4477,i=15953, -4478,i=15954, -4479,i=25545, -4480,i=15955, -4481,i=15956, -4482,i=15987, -4483,i=15988, -4484,i=21174, -4485,i=15990, -4486,i=15991, -4487,i=15992, -4488,i=15993, -4489,i=21175, -4490,i=21176, -4491,i=21177, -4492,i=15995, -4493,i=15996, -4494,i=16007, -4495,i=16008, -4496,i=16009, -4497,i=16010, -4498,i=16011, -4499,i=14804, -4500,i=16012, -4501,i=21178, -4502,i=23919, -4503,i=23920, -4504,i=23921, -4505,i=25546, -4506,i=23922, -4507,i=16014, -4508,i=16015, -4509,i=16016, -4510,i=16017, -4511,i=16018, -4512,i=16019, -4513,i=23923, -4514,i=23924, -4515,i=23925, -4516,i=23928, -4517,i=23929, -4518,i=17472, -4519,i=23932, -4520,i=21179, -4521,i=23933, -4522,i=23934, -4523,i=15579, -4524,i=16021, -4525,i=16022, -4526,i=16023, -4527,i=25547, -4528,i=25548, -4529,i=23505, -4530,i=24296, -4531,i=25243, -4532,i=32669, -4533,i=32670, -4534,i=16126, -4535,i=14797, -4536,i=14800, -4537,i=14798, -4538,i=14799, -4539,i=297, -4540,i=7616, -4541,i=14801, -4542,i=12757, -4543,i=8913, -4544,i=309, -4545,i=12195, -4546,i=305, -4547,i=313, -4548,i=433, -4549,i=12892, -4550,i=12893, -4551,i=345, -4552,i=317, -4553,i=320, -4554,i=323, -4555,i=326, -4556,i=939, -4557,i=377, -4558,i=380, -4559,i=383, -4560,i=386, -4561,i=538, -4562,i=541, -4563,i=332, -4564,i=584, -4565,i=587, -4566,i=590, -4567,i=593, -4568,i=596, -4569,i=599, -4570,i=602, -4571,i=660, -4572,i=720, -4573,i=726, -4574,i=949, -4575,i=921, -4576,i=339, -4577,i=854, -4578,i=11949, -4579,i=11950, -4580,i=857, -4581,i=860, -4582,i=863, -4583,i=866, -4584,i=869, -4585,i=872, -4586,i=300, -4587,i=875, -4588,i=878, -4589,i=898, -4590,i=885, -4591,i=888, -4592,i=12173, -4593,i=12174, -4594,i=12081, -4595,i=12082, -4596,i=895, -4597,i=24038, -4598,i=892, -4599,i=8252, -4600,i=8254, -4601,i=15039, -4602,i=12762, -4603,i=14829, -4604,i=17542, -4605,i=17554, -4606,i=16024, -4607,i=18860, -4608,i=18863, -4609,i=18866, -4610,i=18869, -4611,i=19049, -4612,i=19052, -4613,i=19055, -4614,i=19058, -4615,i=19061, -4616,i=15730, -4617,i=23522, -4618,i=12677, -4619,i=32387, -4620,i=16027, -4621,i=14811, -4622,i=15591, -4623,i=15594, -4624,i=15585, -4625,i=15588, -4626,i=24123, -4627,i=24126, -4628,i=24129, -4629,i=14805, -4630,i=14808, -4631,i=14832, -4632,i=16030, -4633,i=16033, -4634,i=14320, -4635,i=16037, -4636,i=16040, -4637,i=25549, -4638,i=16047, -4639,i=16050, -4640,i=16053, -4641,i=16056, -4642,i=21180, -4643,i=16062, -4644,i=16065, -4645,i=16068, -4646,i=16071, -4647,i=21183, -4648,i=21186, -4649,i=21189, -4650,i=16077, -4651,i=16080, -4652,i=16083, -4653,i=16086, -4654,i=16089, -4655,i=16092, -4656,i=16095, -4657,i=14835, -4658,i=16098, -4659,i=21192, -4660,i=23938, -4661,i=23941, -4662,i=23944, -4663,i=25552, -4664,i=23947, -4665,i=16104, -4666,i=16107, -4667,i=16110, -4668,i=16113, -4669,i=16116, -4670,i=16119, -4671,i=23950, -4672,i=23953, -4673,i=23956, -4674,i=23965, -4675,i=23968, -4676,i=17473, -4677,i=23977, -4678,i=21195, -4679,i=23980, -4680,i=23983, -4681,i=15640, -4682,i=16125, -4683,i=16144, -4684,i=16147, -4685,i=25555, -4686,i=25558, -4687,i=23508, -4688,i=24297, -4689,i=25244, -4690,i=32671, -4691,i=32674, -4692,i=16127, -4693,i=18166, -4694,i=18169, -4695,i=18172, -4696,i=18175, -4697,i=8285, -4698,i=8291, -4699,i=14826, -4700,i=12759, -4701,i=8918, -4702,i=8300, -4703,i=12201, -4704,i=8297, -4705,i=8303, -4706,i=8417, -4707,i=12894, -4708,i=12897, -4709,i=8333, -4710,i=8306, -4711,i=8309, -4712,i=8312, -4713,i=8315, -4714,i=8318, -4715,i=8363, -4716,i=8366, -4717,i=8369, -4718,i=8372, -4719,i=12712, -4720,i=12715, -4721,i=8321, -4722,i=8564, -4723,i=8567, -4724,i=8570, -4725,i=8573, -4726,i=8576, -4727,i=8579, -4728,i=8582, -4729,i=8639, -4730,i=8702, -4731,i=8708, -4732,i=8711, -4733,i=8807, -4734,i=8327, -4735,i=8843, -4736,i=11951, -4737,i=11954, -4738,i=8846, -4739,i=8849, -4740,i=8852, -4741,i=8855, -4742,i=8858, -4743,i=8861, -4744,i=8294, -4745,i=8864, -4746,i=8867, -4747,i=8870, -4748,i=8873, -4749,i=8876, -4750,i=12175, -4751,i=12178, -4752,i=12083, -4753,i=12086, -4754,i=8882, -4755,i=24039, -4756,i=8879, -4757,i=15085, -4758,i=15041, -4759,i=17547, -4760,i=17557, -4761,i=16150, -4762,i=19064, -4763,i=19065, -4764,i=19066, -4765,i=19067, -4766,i=19068, -4767,i=19069, -4768,i=19070, -4769,i=19071, -4770,i=19072, -4771,i=15042, -4772,i=23528, -4773,i=15044, -4774,i=32390, -4775,i=16151, -4776,i=15057, -4777,i=15058, -4778,i=15059, -4779,i=15700, -4780,i=15714, -4781,i=24132, -4782,i=24133, -4783,i=24134, -4784,i=15050, -4785,i=15051, -4786,i=15049, -4787,i=16152, -4788,i=16153, -4789,i=15060, -4790,i=16154, -4791,i=16155, -4792,i=25561, -4793,i=16156, -4794,i=16157, -4795,i=16158, -4796,i=16159, -4797,i=21198, -4798,i=16161, -4799,i=16280, -4800,i=16281, -4801,i=16282, -4802,i=21199, -4803,i=21200, -4804,i=21201, -4805,i=16284, -4806,i=16285, -4807,i=16286, -4808,i=16287, -4809,i=16288, -4810,i=16308, -4811,i=16310, -4812,i=15061, -4813,i=16311, -4814,i=21202, -4815,i=23987, -4816,i=23988, -4817,i=23989, -4818,i=25562, -4819,i=23990, -4820,i=16323, -4821,i=16391, -4822,i=16392, -4823,i=16393, -4824,i=16394, -4825,i=16404, -4826,i=23991, -4827,i=23992, -4828,i=23993, -4829,i=23996, -4830,i=23997, -4831,i=17476, -4832,i=24000, -4833,i=21203, -4834,i=24001, -4835,i=24002, -4836,i=15726, -4837,i=16524, -4838,i=16525, -4839,i=16526, -4840,i=25563, -4841,i=25564, -4842,i=23511, -4843,i=24300, -4844,i=25247, -4845,i=32677, -4846,i=32678, -4847,i=15062, -4848,i=15063, -4849,i=15065, -4850,i=15066, -4851,i=15067, -4852,i=15081, -4853,i=15082, -4854,i=15083, -4855,i=15084, -4856,i=15086, -4857,i=15087, -4858,i=15095, -4859,i=15098, -4860,i=15099, -4861,i=15102, -4862,i=15105, -4863,i=15106, -4864,i=15136, -4865,i=15140, -4866,i=15141, -4867,i=15142, -4868,i=15143, -4869,i=15144, -4870,i=15165, -4871,i=15169, -4872,i=15172, -4873,i=15175, -4874,i=15188, -4875,i=15189, -4876,i=15199, -4877,i=15204, -4878,i=15205, -4879,i=15206, -4880,i=15207, -4881,i=15208, -4882,i=15209, -4883,i=15210, -4884,i=15273, -4885,i=15293, -4886,i=15295, -4887,i=15304, -4888,i=15349, -4889,i=15361, -4890,i=15362, -4891,i=15363, -4892,i=15364, -4893,i=15365, -4894,i=15366, -4895,i=15367, -4896,i=15368, -4897,i=15369, -4898,i=15370, -4899,i=15371, -4900,i=15372, -4901,i=15373, -4902,i=15374, -4903,i=15375, -4904,i=15376, -4905,i=15377, -4906,i=15378, -4907,i=15379, -4908,i=15380, -4909,i=15381, -4910,i=24042, -4911,i=15382, diff --git a/opcua_tools/validator/value_validator.py b/opcua_tools/validator/value_validator.py index ccdfbb3..d62b6de 100644 --- a/opcua_tools/validator/value_validator.py +++ b/opcua_tools/validator/value_validator.py @@ -1,33 +1,19 @@ -import pathlib - import pandas as pd -from opcua_tools import ua_data_types +from opcua_tools import constants from opcua_tools.validator import exceptions -MAPPING_FILE_PATH = ( - pathlib.Path(__file__).parent.parent / "static/data_type_to_value_mapping.csv" -) -OPCUA_TOOLS_CLASSES_TO_SKIP = ["UAEnumeration"] + VALUE_VALIDATION_ERROR_MESSAGE = ( "Invalid Value for rows with the following display names: {}." ) -def get_data_type_to_value_mapping() -> pd.DataFrame: - mapping_file_path = MAPPING_FILE_PATH - return pd.read_csv(mapping_file_path, index_col="DataType") - - -VALUE_MAPPING = get_data_type_to_value_mapping() - - -def validate_value(row: pd.Series) -> pd.Series: +def validate_value(row: pd.Series, original_nodes: pd.DataFrame) -> pd.Series: """ Apply the function to a DataFrame to validate that the value is correct, based on the DataType value. """ variable_node_class_name = "UAVariable" - if row.get("NodeClass", variable_node_class_name) != variable_node_class_name: row["IsValidValue"] = True return row @@ -43,87 +29,34 @@ def validate_value(row: pd.Series) -> pd.Series: f"UAVariable has no DataType! Value: {value_from_row}" ) - if isinstance(data_type_from_row, ua_data_types.UANodeId): - data_type_from_row = transform_data_type_to_plain_int(data_type_from_row) + data_types_mapping = constants.DATA_TYPES_MAPPING + data_type_display_name = original_nodes.iloc[data_type_from_row]["DisplayName"] - class_name_from_value = value_from_row.__class__.__name__ - opcua_tools_class_as_str = get_opcua_tools_class_name_from_mapping( - class_name_from_value, data_type_from_row, row - ) - if opcua_tools_class_as_str in OPCUA_TOOLS_CLASSES_TO_SKIP: + if ( + value_from_row.__class__ not in data_types_mapping.values() + or data_type_display_name not in data_types_mapping + ): + # The validator can be used to check against the basic data types only. row["IsValidValue"] = True return row - if pd.isna(opcua_tools_class_as_str): - opcua_tools_class_as_str = include_missing_opcua_class_in_mapping_file( - value_from_row, data_type_from_row - ) - - value_to_check = value_from_row - - if isinstance(value_from_row, ua_data_types.UAListOf): - first_list_element = value_from_row.value[0] - value_to_check = first_list_element - - data_type_opcua_tools_class = getattr(ua_data_types, opcua_tools_class_as_str) - does_value_match_data_type = isinstance(value_to_check, data_type_opcua_tools_class) - - row["IsValidValue"] = does_value_match_data_type + expected_opcua_tools_class = constants.DATA_TYPES_MAPPING[data_type_display_name] + row["IsValidValue"] = isinstance(value_from_row, expected_opcua_tools_class) return row -def transform_data_type_to_plain_int(data_type_from_row: ua_data_types.UANodeId) -> int: - data_type_as_plain_int = VALUE_MAPPING[ - VALUE_MAPPING["NodeIdDataType"] == f"i={data_type_from_row.value}" - ].index.values.tolist()[0] - data_type_from_row = data_type_as_plain_int - return data_type_from_row - - -def include_missing_opcua_class_in_mapping_file( - value_from_row: ua_data_types.UAData, data_type_from_row: int -) -> str: - - if value_from_row.__class__.__name__ == "UAListOf": - first_list_element = value_from_row.value[0] - class_name_from_value = first_list_element.__class__.__name__ - else: - class_name_from_value = value_from_row.__class__.__name__ - - VALUE_MAPPING.at[data_type_from_row, "OPCUAToolsClass"] = class_name_from_value - - # Update the mapping file by uncommenting the following line and run the tests: - # VALUE_MAPPING.to_csv(MAPPING_FILE_PATH, index_label="DataType") - - return class_name_from_value - - -def get_opcua_tools_class_name_from_mapping( - class_name_from_value: str, data_type_from_row: int, row: pd.Series -) -> str: - try: - opcua_tools_class_as_str = VALUE_MAPPING.iloc[data_type_from_row][ - "OPCUAToolsClass" - ] - except IndexError: - available_opcua_tools_classes = VALUE_MAPPING["OPCUAToolsClass"].dropna().values - if class_name_from_value in available_opcua_tools_classes: - opcua_tools_class_as_str = class_name_from_value - else: - raise exceptions.ValidationError( - f"Invalid DataType for row {row.name}: {row['DataType']}" - ) - return opcua_tools_class_as_str - - -def validate_values_in_df(df_to_validate: pd.DataFrame) -> pd.DataFrame: +def validate_values_in_df( + df_to_validate: pd.DataFrame, original_nodes: pd.DataFrame +) -> pd.DataFrame: """ Validate that the value is valid for the corresponding DataType for all rows in a DataFrame. """ if df_to_validate.empty: return df_to_validate - df_to_validate = df_to_validate.apply(validate_value, axis=1) + df_to_validate = df_to_validate.apply( + validate_value, args=(original_nodes,), axis=1 + ) if not df_to_validate["IsValidValue"].all(): invalid_display_names = df_to_validate[df_to_validate["IsValidValue"] == False][ diff --git a/setup.py b/setup.py index c1a7239..ace9387 100644 --- a/setup.py +++ b/setup.py @@ -20,7 +20,7 @@ setup( name="opcua-tools", - version="1.2.0", + version="1.2.1", description="OPCUA Tools for Python using Pandas DataFrames", long_description=README, long_description_content_type="text/markdown", diff --git a/tests/conftest.py b/tests/conftest.py index 0e22ee4..8d950a4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -50,6 +50,41 @@ def ua_object_node_row() -> pd.Series: ) +@pytest.fixture +def sample_original_nodes(ua_object_node_row) -> pd.DataFrame: + return pd.DataFrame.from_records( + [ + ua_object_node_row, + pd.Series( + { + "NodeClass": "UADataType", + "DisplayName": "Enumeration", + "Description": "", + "Value": pd.NA, + "NodeId": UANodeId( + namespace=0, nodeid_type=NodeIdType.NUMERIC, value="29" + ), + "BrowseName": "Enumeration", + "SymbolicName": pd.NA, + "IsAbstract": "true", + "Symmetric": pd.NA, + "ValueRank": pd.NA, + "DataType": pd.NA, + "ParentNodeId": pd.NA, + "ArrayDimensions": pd.NA, + "MinimumSamplingInterval": pd.NA, + "AccessLevel": pd.NA, + "MethodDeclarationId": pd.NA, + "EventNotifier": pd.NA, + "BrowseNameNamespace": 0, + "ns": 0, + "id": 1, + } + ), + ] + ) + + @pytest.fixture def ua_variable_node_row() -> pd.Series: return pd.Series( diff --git a/tests/test_validator.py b/tests/test_validator.py index d9b7dee..63971ca 100644 --- a/tests/test_validator.py +++ b/tests/test_validator.py @@ -58,31 +58,35 @@ def test_validate_values_in_df_raises_validation_error( class TestValidatorUnit: def test_validator_row_is_valid_when_nodeclass_is_not_uavariable( - self, ua_object_node_row + self, ua_object_node_row, sample_original_nodes ): - row = value_validator.validate_value(ua_object_node_row) + row = value_validator.validate_value(ua_object_node_row, sample_original_nodes) assert row["IsValidValue"] is True def test_validator_row_is_valid_when_uavariable_has_empty_value( - self, ua_variable_node_row + self, ua_variable_node_row, sample_original_nodes ): ua_variable_node_row["Value"] = pd.NA - row = value_validator.validate_value(ua_variable_node_row) + row = value_validator.validate_value( + ua_variable_node_row, sample_original_nodes + ) assert row["IsValidValue"] is True def test_validator_row_is_invalid_when_opcua_tools_class_name_is_invalid( - self, ua_variable_node_row + self, ua_variable_node_row, sample_original_nodes ): ua_variable_node_row["Value"] = 123 invalid_data_type_id = 99999999999 ua_variable_node_row["DataType"] = invalid_data_type_id - with pytest.raises(exceptions.ValidationError): - value_validator.validate_value(ua_variable_node_row) + with pytest.raises(IndexError): + value_validator.validate_value(ua_variable_node_row, sample_original_nodes) def test_validator_row_is_valid_when_enumeration_is_given( - self, ua_variable_node_row + self, ua_variable_node_row, sample_original_nodes ): ua_variable_node_row["Value"] = UAInt32() - ua_variable_node_row["DataType"] = 73 - row = value_validator.validate_value(ua_variable_node_row) + ua_variable_node_row["DataType"] = 1 + row = value_validator.validate_value( + ua_variable_node_row, sample_original_nodes + ) assert row["IsValidValue"] is True