From: Christian Heinrich Date: Tue, 19 Jan 2016 16:50:00 +0000 (+0100) Subject: [Contrib] Deleted contrib/network_model X-Git-Tag: v3_13~1182 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/6eb4843297e804e5fbf1491999e39d0114081b80 [Contrib] Deleted contrib/network_model --- diff --git a/contrib/network_model/calibrate_piecewise.py b/contrib/network_model/calibrate_piecewise.py deleted file mode 100755 index 8a54e84513..0000000000 --- a/contrib/network_model/calibrate_piecewise.py +++ /dev/null @@ -1,216 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2010-2011, 2014. The SimGrid Team. -# All rights reserved. - -# This program is free software; you can redistribute it and/or modify it -# under the terms of the license (GNU LGPL) which comes with this package. - -import sys -from math import sqrt - - -if len(sys.argv) < 5: - print("Usage : %s datafile links latency bandwidth [size...]" % sys.argv[0]) - print("where : datafile is a SkaMPI pingpong measurement log file"); - print(" links is the number of links between nodes") - print(" latency is the nominal latency given in the platform file") - print(" bandwidth is the nominal bandwidth given in the platform file") - print(" size are segments limits") - sys.exit(-1) - -##----------------------------------------- -## avg : return average of a list of values -## param l list of values -##----------------------------------------- -def avg (l): - sum = 0 - for e in l: - sum += float(e); - return sum / len(l) - -##------------------------------------------------- -## cov : covariance -## param X first data vector (..x_i..) -## param Y second data vector (..x_i..) -## = 1/n \Sum_{i=1}^n (x_i - avg(x)) * (y_i - avg(y)) -##-------------------------------------------------- -def cov (X, Y): - assert len(X) == len(Y) - n = len(X) # n=len(X)=len(Y) - avg_X = avg(X) - avg_Y = avg(Y) - S_XY = 0.0 - for i in range(n): - S_XY += (X[i] - avg_X) * (Y[i] - avg_Y) - return (S_XY / n) - -##--------------------------------------------------------------------- -## variance : variance -## param X data vector ( ..x_i.. ) -## (S_X)^2 = (Sum ( x_i - avg(x) )^2 ) / n -##--------------------------------------------------------------------- -def variance (X): - n = len(X) - avg_X = avg (X) - S_X2 = 0.0 - for i in range(n): - S_X2 += (X[i] - avg_X) ** 2 - return (S_X2 / n) - -##--------------------------------------------------------------------- -## calibrate : output correction factors, c_lat on latency, c_bw on bw -## such that bandwidth * c_bw = bw_regr, latency * c_lat = lat_regr -## where bw_regr and lat_regr are the values approximating experimental -## observations. -## -## param links number of links traversed during ping-pong -## param latency as specified on command line, in s -## param bandwidth as specified on command line, in Byte/s -## param sizes vector of data sizes, in Bytes -## param timings vector of time taken: timings[i] for sizes[i], in us -##--------------------------------------------------------------------- -def calibrate (links, latency, bandwidth, sizes, timings): - assert len(sizes) == len(timings) - if len(sizes) < 2: - return None - # compute linear regression : find an affine form time = a*size+b - S_XY = cov(sizes, timings) - S_X2 = variance(sizes) - a = S_XY / S_X2 - b = avg(timings) - a * avg(sizes) - # corresponding bandwith, in byte/s (was in byte/us in skampi dat) - bw_regr = 1e6 / a - # corresponding latency, in s (was in us in skampi dat) - lat_regr = b*1e-6 - print("\nregression: {0} * x + {1}".format(a,b)) - print("corr_bw = bw_regr/bandwidth= {0}/{1}={2} lat_regr/(lat_xml*links)={3}/({4}*{5}))".format(bw_regr,bandwidth,bw_regr/bandwidth,lat_regr,latency,links)) - # return linear regression result and corresponding correction factors c_bw,c_lat - return a,b, bw_regr/bandwidth, lat_regr/(latency*links) - - -##--------------------------------------------------------------------- -## outputs a C formatted conditional return value for factor -## -## param lb lower bound -## param ub upper bound -## param lb_included boolean to tell if bound is included (<=) or exclude (<) -## param ub_included boolean to tell if bound is included (<=) or exclude (<) -##--------------------------------------------------------------------- -def c_code_print (lb,ub, retval, lb_included, ub_included): - lb_cmp = ub_cmp = "<" - if lb_included: - lb_cmp ="<=" - if ub_included: - ub_cmp ="<=" - - ub_kib=ub/1024. - lb_kib=lb/1024. - print("\t /* case {0:.1f} KiB {1} size {2} {3:.1f} KiB */".format(lb_kib,lb_cmp,ub_cmp,ub_kib)) - print("\t if ({0:d} {1} size && size {2} {3:d}) ".format(lb,lb_cmp,ub_cmp,ub)) - print("\t return({0});" . format(retval)) - - -##----------------------------------------------------------------------------------------------- -## main -##----------------------------------------------------------------------------------------------- -links = int(sys.argv[2]) -latency = float(sys.argv[3]) -bandwidth = float(sys.argv[4]) -skampidat = open(sys.argv[1], "r") - -## read data from skampi logs. -timings = [] -sizes = [] -readdata =[] -for line in skampidat: - l = line.split(); - if line[0] != '#' and len(l) >= 3: # is it a comment ? - ## expected format - ## --------------- - #count= 8388608 8388608 144916.1 7.6 32 144916.1 143262.0 - #("%s %d %d %f %f %d %f %f\n" % (countlbl, count, countn, time, stddev, iter, mini, maxi) - readdata.append( (int(l[1]),float(l[3]) / 2) ); # divide by 2 because of ping-pong measured - -## These may not be sorted so sort it by message size before processing. -sorteddata = sorted( readdata, key=lambda pair: pair[0]) -sizes,timings= zip(*sorteddata) - - -## adds message sizes of interest: if values are specified starting from the 6th command line arg -## and these values are found as message sizes in te log file, add it to the limits list. -## Each of these value si considered a potential inflexion point between two segments. -## -## If no value specified, a single segment is considered from 1st to last message size logged. -limits = [] -if len(sys.argv) > 5: - for i in range(5, len(sys.argv)): - limits += [idx for idx in range(len(sizes)) if sizes[idx] == int(sys.argv[i])] -limits.append(len(sizes) - 1) - -factors = [] -low = 0 -for lim in limits: - correc = calibrate(links, latency, bandwidth, sizes[low:lim + 1], timings[low:lim + 1]) - if correc: - # save interval [lb,ub] correction, regression line direction and origin - # and corresponding correction factors for bw and lat resp. - (dircoef,origin,factor_bw,factor_lat) = correc - factors.append( (sizes[low],sizes[lim], dircoef, origin, factor_bw,factor_lat) ) - print("Segment [%d:%d] --Bandwidth factor=%g --Latency factor=%g " % (sizes[low], sizes[lim], factor_bw,factor_lat)) - low = lim + 1 - -# now computes joining lines between segments -joinseg=[] - -print("\n/**\n *------------------ ----------------------") -print(" *\n * produced by: {0}\n *".format(' '.join(sys.argv))) -print(" *---------------------------------------------------------------------------------------\n **/") - -# print correction factor for bandwidth for each segment -print("static double smpi_bandwidth_factor(double size)\n{") -for (lb,ub,a,b,factor_bw,factor_lat) in factors: - c_code_print(lb,ub,factor_bw,True,True) - - # save ends and starts of segments - if lb != sizes[0]: - joinseg.append( (lb,timings[sizes.index(lb)]) ) - if ub != sizes[-1]: - joinseg.append( (ub,timings[sizes.index(ub)]) ) - -# print correction factor for bandwidth between segments -joinseg.reverse() -print("\n\t /* ..:: inter-segment corrections ::.. */"); -inx=len(joinseg)-1 -while inx>=1: - (x0,y0) = joinseg[inx] - inx = inx -1 - (x1,y1) = joinseg[inx] - inx = inx -1 - # line eq. is y = (y1-y0)/(x0-x1) * x + (y0 x1 - y1 x0)/(x1-x0) - a = (y1-y0) / (x1-x0) - bw_join = 1e6 / a - factor_join_bw = bw_join / bandwidth - #print("Joining points (%f,%f) -> (%f,%f) : line dir : a=%g\n" % (x0,y0,x1,y1,a)) - c_code_print(x0,x1,factor_join_bw,False,False) - -print("}\n") - -# print correction factor for latency for each segment -print("static double smpi_latency_factor(double size)\n{") -for (lb,ub,a,b,factor_bw,factor_lat) in factors: - c_code_print(lb,ub,factor_lat,True,True) - -print("\n\t /* ..:: inter-segment corrections ::.. */"); -while joinseg: - (x0,y0) = joinseg.pop() - (x1,y1) = joinseg.pop() - # line eq. is y = (y0-y1)/(x0-x1) * x + (y0 x1 - y1 x0)/(x1-x0) - #print("(%f,%f) -> (%f,%f)\n" % (x0,y0,x1,y1)) - b = 1e-6 * (y0*x1-y1*x0) / (x1-x0) - factor_join_lat = b / (latency*links) - c_code_print(x0,x1,factor_join_lat,False,False) - -print("}\n") - -print("\n/**\n *------------------ ----------------------\n **/") diff --git a/contrib/network_model/griffon_skampi_pt2pt.ski.dat b/contrib/network_model/griffon_skampi_pt2pt.ski.dat deleted file mode 100644 index 42ce879b62..0000000000 --- a/contrib/network_model/griffon_skampi_pt2pt.ski.dat +++ /dev/null @@ -1,158 +0,0 @@ -# SkaMPI pt2pt test -# on cluster : griffon (nancy) Grid5000. See Grid5000 website for technical data. - -#vendor_id : GenuineIntel -#cpu family : 6 -#model : 23 -#model name : Intel(R) Xeon(R) CPU L5420 @ 2.50GHz -#stepping : 10 -#cpu MHz : 2493.757 -#cache size : 6144 KB - - -# /home/sgenaud/openmpi.install/bin/mpiexec --mca btl_tcp_if_include eth0 --mca btl_tcp_if_exclude ib0 --mca btl tcp,self -mca orte_base_help_aggregate 0 -mca plm_rsh_agent oarsh -machinefile machinefile -n 2 skampi -i ski_smpi/skampi_pt2pt.ski - -# Finished at Fri Jul 9 16:19:24 2010 -# SKaMPI Version 5.0.4 rev. 355 -# Started at Fri Jul 9 16:19:02 2010 -# Total runtime 22 seconds -# begin result "Pingpong_Send_Recv" -# duration = 22.49 sec -# end result "Pingpong_Send_Recv" - -count= 1 1 109.2 0.2 32 106.7 107.7 -count= 2 2 109.3 0.3 32 107.6 107.0 -count= 4 4 111.7 0.7 32 107.8 109.7 -count= 8 8 109.0 0.3 32 106.8 107.0 -count= 16 16 109.1 0.4 32 108.0 106.7 -count= 32 32 111.1 0.4 32 110.5 107.4 -count= 64 64 110.2 0.2 32 107.8 108.6 -count= 128 128 118.9 1.2 32 109.9 116.2 -count= 256 256 145.8 0.4 32 138.4 144.9 -count= 512 512 161.7 0.3 32 154.7 161.6 -count= 1024 1024 190.4 0.2 32 182.7 190.4 -count= 1024 1024 193.4 0.3 32 185.9 193.0 -count= 1536 1536 237.3 0.5 32 226.9 237.3 -count= 2048 2048 248.0 0.8 32 238.4 247.9 -count= 2048 2048 249.2 1.0 32 240.1 247.7 -count= 2560 2560 262.9 0.6 32 251.7 262.9 -count= 3072 3072 277.9 0.4 32 272.7 275.0 -count= 3584 3584 285.0 0.5 32 275.0 285.0 -count= 4096 4096 303.0 0.9 32 293.5 298.9 -count= 4096 4096 303.4 0.8 32 297.2 301.6 -count= 4608 4608 310.0 0.8 32 310.0 291.7 -count= 5120 5120 321.4 0.7 32 321.4 291.5 -count= 5632 5632 343.7 0.7 32 343.7 312.0 -count= 6144 6144 320.7 0.5 32 320.7 282.6 -count= 6656 6656 339.4 0.4 32 339.4 296.6 -count= 7168 7168 353.3 0.7 32 353.3 308.5 -count= 7680 7680 386.7 0.8 32 385.3 378.8 -count= 8192 8192 389.1 0.6 32 389.1 373.8 -count= 8192 8192 393.7 0.8 32 391.1 380.4 -count= 16384 16384 627.7 0.7 32 627.7 533.9 -count= 32768 32768 1060.2 0.9 32 1060.2 828.9 -count= 32768 32768 1062.0 1.0 32 1062.0 836.4 -count= 33792 33792 1096.1 0.8 32 1096.1 838.2 -count= 34816 34816 1109.6 0.7 32 1109.6 835.3 -count= 35840 35840 1125.7 1.7 32 1125.7 856.3 -count= 36864 36864 1168.1 1.4 32 1168.1 930.2 -count= 37888 37888 1208.8 0.6 32 1208.8 937.2 -count= 38912 38912 1229.7 1.0 32 1229.7 952.2 -count= 39936 39936 1255.4 1.2 32 1255.4 969.3 -count= 40960 40960 1292.8 0.9 32 1292.8 978.8 -count= 41984 41984 1300.8 1.6 32 1300.8 976.3 -count= 43008 43008 1322.0 1.2 32 1322.0 988.2 -count= 44032 44032 1365.8 1.0 32 1365.8 1064.5 -count= 45056 45056 1400.6 0.8 32 1400.6 1072.9 -count= 46080 46080 1426.9 0.9 32 1426.9 1096.7 -count= 47104 47104 1445.7 0.9 32 1445.7 1101.4 -count= 48128 48128 1489.7 0.9 32 1489.7 1119.3 -count= 49152 49152 1516.2 0.6 32 1516.2 1137.3 -count= 50176 50176 1515.0 0.9 32 1515.0 1124.5 -count= 51200 51200 1558.4 1.4 32 1558.4 1202.6 -count= 52224 52224 1595.4 0.8 32 1595.4 1209.2 -count= 53248 53248 1614.3 1.0 32 1614.3 1219.8 -count= 54272 54272 1647.7 0.8 32 1647.7 1244.3 -count= 55296 55296 1684.2 0.9 32 1684.2 1258.9 -count= 56320 56320 1714.6 0.8 32 1714.6 1281.8 -count= 57344 57344 1710.3 1.4 32 1710.3 1262.5 -count= 58368 58368 1757.1 1.1 32 1757.1 1344.3 -count= 59392 59392 1793.4 1.3 32 1793.4 1350.9 -count= 60416 60416 1817.8 0.7 32 1817.8 1366.0 -count= 61440 61440 1850.5 1.5 32 1850.5 1392.2 -count= 62464 62464 1884.3 1.3 32 1884.3 1398.8 -count= 63488 63488 1896.7 1.2 32 1896.7 1403.7 -count= 64512 64512 1907.1 1.0 32 1907.1 1405.3 -count= 65536 65536 2250.0 1.2 32 2250.0 1648.1 -count= 65536 65536 2253.6 1.8 32 2253.6 1653.3 -count= 66560 66560 2263.2 0.8 32 2263.2 1654.2 -count= 67584 67584 2284.4 1.4 32 2284.4 1655.7 -count= 68608 68608 2308.5 1.7 32 2308.5 1685.1 -count= 69632 69632 2299.3 2.7 32 2299.3 1672.3 -count= 70656 70656 2342.2 2.4 32 2342.2 1708.0 -count= 71680 71680 2385.5 2.4 32 2385.5 1733.6 -count= 72704 72704 2422.9 2.5 32 2422.9 1765.7 -count= 73728 73728 2441.9 1.7 32 2441.9 1783.1 -count= 74752 74752 2465.0 1.9 32 2465.0 1781.5 -count= 75776 75776 2482.6 2.5 32 2482.6 1806.1 -count= 76800 76800 2490.0 2.1 32 2490.0 1808.3 -count= 77824 77824 2503.4 2.8 32 2503.4 1815.1 -count= 78848 78848 2568.6 2.6 32 2568.6 1864.5 -count= 79872 79872 2618.4 2.2 32 2618.4 1897.0 -count= 80896 80896 2615.7 2.6 32 2615.7 1891.0 -count= 81920 81920 2641.5 2.1 32 2641.5 1919.9 -count= 82944 82944 2647.5 2.4 32 2647.5 1919.4 -count= 83968 83968 2662.6 1.8 32 2662.6 1929.4 -count= 84992 84992 2693.4 1.7 32 2693.4 1954.6 -count= 86016 86016 2733.1 2.3 32 2733.1 1974.2 -count= 87040 87040 2784.9 2.0 32 2784.9 2013.4 -count= 88064 88064 2792.3 1.9 32 2792.3 2014.1 -count= 89088 89088 2820.0 1.8 32 2820.0 2032.9 -count= 90112 90112 2833.6 1.7 32 2833.6 2045.1 -count= 91136 91136 2861.4 1.1 32 2861.4 2056.6 -count= 92160 92160 2873.4 1.5 32 2873.4 2071.6 -count= 93184 93184 2926.1 0.8 32 2926.1 2103.4 -count= 94208 94208 2960.6 1.8 32 2960.6 2128.3 -count= 95232 95232 2970.0 1.6 32 2970.0 2145.8 -count= 96256 96256 2993.8 1.7 32 2993.8 2147.2 -count= 97280 97280 3010.7 2.4 32 3010.7 2169.1 -count= 98304 98304 3039.6 1.7 32 3039.6 2180.1 -count= 99328 99328 3048.7 2.0 32 3048.7 2186.0 -count= 100352 100352 3107.2 1.4 32 3107.2 2227.0 -count= 101376 101376 3147.7 1.4 32 3147.7 2258.1 -count= 102400 102400 3145.7 1.8 32 3145.7 2256.1 -count= 103424 103424 3171.8 1.3 32 3171.8 2266.4 -count= 104448 104448 3200.2 2.4 32 3200.2 2300.5 -count= 105472 105472 3219.3 2.7 32 3219.3 2301.5 -count= 106496 106496 3229.6 2.1 32 3229.6 2308.6 -count= 107520 107520 3284.7 2.3 32 3284.7 2344.4 -count= 108544 108544 3311.8 2.2 32 3311.8 2364.9 -count= 109568 109568 3323.4 1.7 32 3323.4 2376.3 -count= 110592 110592 3354.0 2.0 32 3354.0 2399.0 -count= 111616 111616 3376.2 1.7 32 3376.2 2419.3 -count= 112640 112640 3397.4 2.4 32 3397.4 2429.9 -count= 113664 113664 3401.1 1.4 32 3401.1 2430.6 -count= 114688 114688 3458.1 2.7 32 3458.1 2470.8 -count= 115712 115712 3481.2 3.4 32 3481.2 2484.3 -count= 116736 116736 3512.1 2.2 32 3512.1 2502.9 -count= 117760 117760 3532.9 2.1 32 3532.9 2524.1 -count= 118784 118784 3544.9 1.9 32 3544.9 2527.8 -count= 119808 119808 3575.5 1.4 32 3575.5 2544.6 -count= 120832 120832 3584.4 2.2 32 3584.4 2554.0 -count= 121856 121856 3641.5 2.3 32 3641.5 2593.2 -count= 122880 122880 3662.0 1.7 32 3662.0 2608.6 -count= 123904 123904 3695.2 1.7 32 3695.2 2638.5 -count= 124928 124928 3711.6 1.6 32 3711.6 2643.5 -count= 125952 125952 3737.9 1.3 32 3737.9 2659.9 -count= 126976 126976 3750.0 1.8 32 3750.0 2673.3 -count= 128000 128000 3761.6 2.2 32 3761.6 2678.8 -count= 129024 129024 3822.9 1.8 32 3822.9 2725.9 -count= 130048 130048 3838.5 2.3 32 3838.5 2727.5 -count= 131072 131072 3870.2 1.8 32 3870.2 2750.0 -count= 131072 131072 3873.2 1.8 32 3873.2 2757.4 -count= 262144 262144 7121.5 1.0 32 7121.5 4980.9 -count= 524288 524288 10740.7 4.1 32 10740.7 9458.5 -count= 1048576 1048576 19872.8 4.9 32 19872.8 18373.7 -count= 2097152 2097152 37947.8 63.3 32 37947.8 36227.3 -count= 4194304 4194304 73299.4 7.8 32 73299.4 71898.5 -count= 8388608 8388608 144965.0 15.2 32 144965.0 143205.7 diff --git a/contrib/network_model/pingpong-in.dat b/contrib/network_model/pingpong-in.dat deleted file mode 100644 index 7245687578..0000000000 --- a/contrib/network_model/pingpong-in.dat +++ /dev/null @@ -1,7681 +0,0 @@ -0 98 -1 100 -2 100 -3 100 -4 100 -5 100 -6 100 -7 100 -8 100 -9 100 -10 100 -11 99 -12 97 -13 95 -14 90 -15 83 -16 82 -17 82 -18 82 -19 92 -20 87 -21 82 -22 76 -23 76 -24 89 -25 94 -26 97 -27 100 -28 100 -29 100 -30 100 -31 100 -32 100 -33 100 -34 100 -35 100 -36 100 -37 100 -38 100 -39 99 -40 96 -41 94 -42 89 -43 83 -44 82 -45 86 -46 94 -47 79 -48 76 -49 82 -50 84 -51 92 -52 97 -53 98 -54 100 -55 100 -56 100 -57 100 -58 100 -59 100 -60 100 -61 100 -62 100 -63 100 -64 100 -65 100 -66 99 -67 97 -68 94 -69 86 -70 82 -71 82 -72 91 -73 94 -74 90 -75 88 -76 89 -77 93 -78 97 -79 100 -80 100 -81 100 -82 100 -83 100 -84 100 -85 100 -86 100 -87 100 -88 100 -89 100 -90 100 -91 100 -92 99 -93 97 -94 94 -95 90 -96 82 -97 82 -98 87 -99 94 -100 93 -101 88 -102 90 -103 92 -104 98 -105 99 -106 100 -107 100 -108 100 -109 100 -110 100 -111 100 -112 100 -113 100 -114 100 -115 100 -116 99 -117 100 -118 100 -119 100 -120 99 -121 97 -122 95 -123 92 -124 90 -125 82 -126 82 -127 94 -128 86 -129 85 -130 95 -131 97 -132 99 -133 100 -134 100 -135 100 -136 100 -137 100 -138 100 -139 100 -140 100 -141 100 -142 100 -143 100 -144 100 -145 100 -146 100 -147 100 -148 98 -149 96 -150 94 -151 94 -152 87 -153 88 -154 94 -155 94 -156 92 -157 97 -158 98 -159 100 -160 100 -161 100 -162 100 -163 100 -164 100 -165 100 -166 100 -167 100 -168 100 -169 100 -170 100 -171 100 -172 100 -173 100 -174 100 -175 100 -176 98 -177 103 -178 84 -179 94 -180 87 -181 85 -182 97 -183 97 -184 99 -185 100 -186 100 -187 100 -188 100 -189 100 -190 100 -191 100 -192 100 -193 100 -194 100 -195 100 -196 100 -197 100 -198 100 -199 100 -200 100 -201 100 -202 99 -203 103 -204 93 -205 86 -206 95 -207 82 -208 96 -209 100 -210 98 -211 100 -212 100 -213 100 -214 100 -215 100 -216 100 -217 100 -218 100 -219 100 -220 100 -221 100 -222 100 -223 100 -224 100 -225 100 -226 100 -227 100 -228 100 -229 100 -230 102 -231 107 -232 94 -233 82 -234 94 -235 95 -236 101 -237 102 -238 100 -239 100 -240 100 -241 100 -242 100 -243 100 -244 100 -245 100 -246 100 -247 100 -248 100 -249 100 -250 100 -251 100 -252 100 -253 100 -254 100 -255 91 -256 84 -257 98 -258 103 -259 103 -260 100 -261 101 -262 100 -263 100 -264 100 -265 100 -266 100 -267 100 -268 100 -269 100 -270 100 -271 100 -272 100 -273 100 -274 100 -275 100 -276 100 -277 100 -278 100 -279 100 -280 109 -281 96 -282 99 -283 97 -284 92 -285 101 -286 103 -287 104 -288 102 -289 100 -290 100 -291 100 -292 100 -293 100 -294 100 -295 100 -296 100 -297 100 -298 100 -299 100 -300 100 -301 100 -302 100 -303 100 -304 100 -305 101 -306 103 -307 112 -308 98 -309 101 -310 101 -311 101 -312 104 -313 105 -314 107 -315 104 -316 100 -317 100 -318 100 -319 100 -320 100 -321 100 -322 100 -323 100 -324 100 -325 100 -326 100 -327 100 -328 100 -329 100 -330 100 -331 100 -332 100 -333 112 -334 112 -335 98 -336 108 -337 103 -338 99 -339 104 -340 106 -341 107 -342 106 -343 102 -344 100 -345 100 -346 100 -347 100 -348 100 -349 100 -350 100 -351 100 -352 100 -353 100 -354 100 -355 100 -356 100 -357 100 -358 100 -359 104 -360 111 -361 107 -362 111 -363 104 -364 107 -365 107 -366 104 -367 106 -368 106 -369 106 -370 101 -371 100 -372 100 -373 100 -374 100 -375 100 -376 100 -377 100 -378 100 -379 100 -380 100 -381 100 -382 100 -383 100 -384 100 -385 100 -386 106 -387 100 -388 100 -389 100 -390 110 -391 103 -392 109 -393 106 -394 105 -395 106 -396 107 -397 105 -398 101 -399 100 -400 100 -401 100 -402 100 -403 100 -404 100 -405 100 -406 100 -407 100 -408 100 -409 100 -410 100 -411 100 -412 100 -413 105 -414 112 -415 100 -416 100 -417 100 -418 107 -419 117 -420 114 -421 108 -422 106 -423 106 -424 107 -425 100 -426 100 -427 100 -428 101 -429 100 -430 100 -431 100 -432 100 -433 101 -434 106 -435 112 -436 113 -437 112 -438 113 -439 114 -440 117 -441 116 -442 107 -443 106 -444 107 -445 106 -446 102 -447 100 -448 100 -449 100 -450 100 -451 100 -452 100 -453 100 -454 100 -455 100 -456 100 -457 100 -458 100 -459 101 -460 100 -461 106 -462 113 -463 112 -464 101 -465 113 -466 118 -467 119 -468 116 -469 108 -470 107 -471 107 -472 107 -473 105 -474 100 -475 100 -476 100 -477 100 -478 100 -479 100 -480 100 -481 100 -482 100 -483 100 -484 100 -485 100 -486 100 -487 105 -488 112 -489 100 -490 113 -491 103 -492 119 -493 119 -494 119 -495 114 -496 107 -497 106 -498 106 -499 106 -500 104 -501 100 -502 100 -503 100 -504 100 -505 100 -506 100 -507 100 -508 100 -509 100 -510 100 -511 100 -512 100 -513 102 -514 104 -515 112 -516 112 -517 107 -518 113 -519 117 -520 119 -521 120 -522 120 -523 116 -524 109 -525 107 -526 106 -527 107 -528 104 -529 101 -530 100 -531 100 -532 100 -533 100 -534 100 -535 100 -536 100 -537 100 -538 100 -539 100 -540 100 -541 105 -542 100 -543 113 -544 112 -545 101 -546 115 -547 121 -548 121 -549 123 -550 121 -551 118 -552 112 -553 107 -554 106 -555 107 -556 106 -557 104 -558 100 -559 100 -560 100 -561 100 -562 100 -563 100 -564 100 -565 100 -566 100 -567 102 -568 110 -569 100 -570 112 -571 100 -572 112 -573 118 -574 120 -575 122 -576 123 -577 122 -578 119 -579 112 -580 107 -581 107 -582 107 -583 106 -584 102 -585 101 -586 100 -587 100 -588 100 -589 100 -590 100 -591 100 -592 100 -593 101 -594 101 -595 105 -596 100 -597 116 -598 118 -599 120 -600 121 -601 124 -602 106 -603 107 -604 104 -605 101 -606 100 -607 100 -608 100 -609 100 -610 100 -611 100 -612 101 -613 100 -614 101 -615 110 -616 100 -617 112 -618 112 -619 112 -620 119 -621 122 -622 124 -623 124 -624 122 -625 121 -626 114 -627 108 -628 107 -629 106 -630 106 -631 104 -632 100 -633 100 -634 100 -635 100 -636 100 -637 100 -638 100 -639 100 -640 100 -641 105 -642 111 -643 107 -644 100 -645 112 -646 113 -647 116 -648 121 -649 123 -650 125 -651 124 -652 122 -653 120 -654 114 -655 107 -656 107 -657 108 -658 106 -659 105 -660 102 -661 100 -662 100 -663 100 -664 100 -665 100 -666 100 -667 100 -668 100 -669 103 -670 106 -671 107 -672 106 -673 102 -674 117 -675 121 -676 123 -677 125 -678 125 -679 125 -680 122 -681 119 -682 113 -683 107 -684 106 -685 107 -686 107 -687 104 -688 100 -689 100 -690 101 -691 100 -692 100 -693 100 -694 102 -695 107 -696 111 -697 113 -698 111 -699 111 -700 116 -701 121 -702 122 -703 125 -704 125 -705 125 -706 123 -707 122 -708 115 -709 108 -710 107 -711 107 -712 106 -713 103 -714 100 -715 100 -716 101 -717 100 -718 100 -719 100 -720 102 -721 110 -722 106 -723 112 -724 113 -725 115 -726 120 -727 122 -728 123 -729 124 -730 125 -731 125 -732 123 -733 122 -734 119 -735 109 -736 108 -737 107 -738 106 -739 105 -740 101 -741 100 -742 100 -743 100 -744 100 -745 100 -746 100 -747 108 -748 115 -749 106 -750 110 -751 116 -752 107 -753 120 -754 123 -755 124 -756 125 -757 125 -758 125 -759 125 -760 124 -761 120 -762 121 -763 112 -764 107 -765 110 -766 106 -767 108 -768 100 -769 101 -770 101 -771 113 -772 108 -773 108 -774 106 -775 122 -776 125 -777 125 -778 125 -779 124 -780 124 -781 123 -782 121 -783 118 -784 112 -785 110 -786 107 -787 110 -788 102 -789 102 -790 100 -791 100 -792 100 -793 101 -794 103 -795 100 -796 100 -797 100 -798 113 -799 106 -800 113 -801 120 -802 124 -803 124 -804 125 -805 125 -806 125 -807 125 -808 124 -809 122 -810 123 -811 117 -812 110 -813 108 -814 111 -815 106 -816 106 -817 101 -818 100 -819 100 -820 100 -821 104 -822 100 -823 100 -824 117 -825 101 -826 108 -827 119 -828 120 -829 124 -830 125 -831 125 -832 125 -833 125 -834 125 -835 124 -836 121 -837 121 -838 116 -839 111 -840 104 -841 108 -842 107 -843 106 -844 103 -845 100 -846 101 -847 100 -848 101 -849 106 -850 112 -851 106 -852 106 -853 113 -854 116 -855 121 -856 124 -857 125 -858 125 -859 125 -860 124 -861 125 -862 125 -863 124 -864 123 -865 121 -866 114 -867 108 -868 107 -869 106 -870 107 -871 106 -872 101 -873 101 -874 100 -875 101 -876 108 -877 100 -878 112 -879 100 -880 113 -881 109 -882 121 -883 122 -884 124 -885 124 -886 125 -887 125 -888 124 -889 125 -890 125 -891 124 -892 122 -893 119 -894 114 -895 108 -896 106 -897 107 -898 107 -899 104 -900 100 -901 101 -902 103 -903 100 -904 112 -905 101 -906 106 -907 114 -908 117 -909 119 -910 123 -911 123 -912 125 -913 125 -914 125 -915 125 -916 124 -917 124 -918 125 -919 124 -920 122 -921 122 -922 115 -923 109 -924 107 -925 107 -926 107 -927 105 -928 103 -929 101 -930 101 -931 111 -932 107 -933 113 -934 101 -935 115 -936 118 -937 121 -938 122 -939 125 -940 125 -941 125 -942 125 -943 125 -944 124 -945 122 -946 120 -947 115 -948 110 -949 108 -950 108 -951 107 -952 100 -953 100 -954 112 -955 101 -956 113 -957 120 -958 122 -959 123 -960 125 -961 125 -962 125 -963 125 -964 125 -965 125 -966 125 -967 125 -968 124 -969 124 -970 122 -971 120 -972 114 -973 110 -974 107 -975 106 -976 106 -977 105 -978 106 -979 113 -980 113 -981 100 -982 108 -983 107 -984 119 -985 121 -986 124 -987 125 -988 125 -989 125 -990 124 -991 125 -992 125 -993 125 -994 125 -995 125 -996 124 -997 123 -998 122 -999 120 -1000 112 -1001 108 -1002 107 -1003 107 -1004 106 -1005 109 -1006 101 -1007 113 -1008 108 -1009 114 -1010 102 -1011 117 -1012 121 -1013 123 -1014 125 -1015 125 -1016 125 -1017 125 -1018 125 -1019 125 -1020 125 -1021 125 -1022 125 -1023 124 -1024 125 -1026 123 -1028 122 -1030 118 -1032 109 -1034 107 -1036 107 -1038 107 -1040 108 -1042 109 -1044 101 -1046 113 -1048 107 -1050 102 -1052 111 -1054 115 -1056 120 -1058 124 -1060 125 -1062 125 -1064 125 -1066 125 -1068 125 -1070 125 -1072 125 -1074 125 -1076 125 -1078 125 -1080 125 -1082 125 -1084 125 -1086 125 -1088 123 -1090 121 -1092 116 -1094 107 -1096 108 -1098 106 -1100 112 -1102 118 -1104 100 -1106 107 -1108 114 -1110 119 -1112 122 -1114 123 -1116 125 -1118 125 -1120 125 -1122 124 -1124 125 -1126 125 -1128 125 -1130 125 -1132 125 -1134 125 -1136 125 -1138 125 -1140 125 -1142 125 -1144 123 -1146 122 -1148 118 -1150 112 -1152 109 -1154 116 -1156 113 -1158 119 -1160 114 -1162 114 -1164 112 -1166 119 -1168 122 -1170 124 -1172 125 -1174 125 -1176 125 -1178 125 -1180 125 -1182 125 -1184 125 -1186 125 -1188 125 -1190 125 -1192 124 -1194 125 -1196 125 -1198 125 -1200 124 -1202 124 -1204 121 -1206 120 -1208 117 -1210 119 -1212 119 -1214 108 -1216 120 -1218 119 -1220 120 -1222 125 -1224 125 -1226 125 -1228 125 -1230 125 -1232 125 -1234 125 -1236 125 -1238 125 -1240 125 -1242 124 -1244 123 -1246 122 -1248 119 -1250 120 -1252 108 -1254 115 -1256 113 -1258 117 -1260 121 -1262 123 -1264 124 -1266 125 -1268 124 -1270 125 -1272 125 -1274 125 -1276 125 -1278 125 -1280 125 -1282 125 -1284 125 -1286 125 -1288 125 -1290 125 -1292 125 -1294 125 -1296 125 -1298 124 -1300 125 -1302 131 -1304 116 -1306 123 -1308 120 -1310 115 -1312 120 -1314 126 -1316 126 -1318 126 -1320 125 -1322 125 -1324 125 -1326 125 -1328 125 -1330 124 -1332 125 -1334 124 -1336 125 -1338 125 -1340 125 -1342 125 -1344 125 -1346 125 -1348 125 -1350 125 -1352 125 -1354 134 -1356 123 -1358 121 -1360 128 -1362 123 -1364 121 -1366 128 -1368 129 -1370 128 -1372 126 -1374 125 -1376 125 -1378 125 -1380 125 -1382 125 -1384 125 -1386 125 -1388 125 -1390 125 -1392 125 -1394 125 -1396 125 -1398 125 -1400 125 -1402 125 -1404 125 -1406 125 -1408 128 -1410 125 -1412 136 -1414 135 -1416 119 -1418 127 -1420 127 -1422 129 -1424 130 -1426 100 -1428 100 -1430 101 -1432 96 -1434 100 -1436 101 -1438 100 -1440 101 -1442 99 -1444 101 -1446 101 -1448 97 -1450 99 -1452 98 -1454 100 -1456 99 -1458 99 -1460 98 -1462 100 -1464 100 -1466 100 -1468 101 -1470 100 -1472 100 -1474 100 -1476 100 -1478 100 -1480 100 -1482 100 -1484 100 -1486 100 -1488 101 -1490 100 -1492 104 -1494 102 -1496 99 -1498 98 -1500 94 -1502 100 -1504 101 -1506 101 -1508 100 -1510 100 -1512 99 -1514 101 -1516 100 -1518 100 -1520 97 -1522 101 -1524 100 -1526 100 -1528 100 -1530 100 -1532 100 -1534 100 -1536 101 -1538 100 -1540 100 -1542 100 -1544 100 -1546 100 -1548 101 -1550 101 -1552 101 -1554 101 -1556 99 -1558 99 -1560 100 -1562 97 -1564 103 -1566 99 -1568 100 -1570 100 -1572 99 -1574 102 -1576 99 -1578 99 -1580 100 -1582 100 -1584 100 -1586 100 -1588 100 -1590 100 -1592 101 -1594 99 -1596 96 -1598 99 -1600 95 -1602 100 -1604 96 -1606 102 -1608 102 -1610 97 -1612 96 -1614 98 -1616 99 -1618 101 -1620 101 -1622 100 -1624 100 -1626 100 -1628 100 -1630 100 -1632 100 -1634 100 -1636 100 -1638 100 -1640 100 -1642 100 -1644 100 -1646 100 -1648 100 -1650 100 -1652 98 -1654 98 -1656 101 -1658 101 -1660 100 -1662 100 -1664 101 -1666 97 -1668 101 -1670 99 -1672 95 -1674 98 -1676 98 -1678 101 -1680 99 -1682 98 -1684 101 -1686 100 -1688 100 -1690 100 -1692 100 -1694 100 -1696 100 -1698 100 -1700 100 -1702 100 -1704 100 -1706 100 -1708 101 -1710 99 -1712 98 -1714 100 -1716 100 -1718 103 -1720 100 -1722 103 -1724 100 -1726 102 -1728 97 -1730 100 -1732 99 -1734 101 -1736 103 -1738 101 -1740 101 -1742 101 -1744 100 -1746 100 -1748 100 -1750 100 -1752 100 -1754 101 -1756 100 -1758 100 -1760 100 -1762 100 -1764 100 -1766 102 -1768 103 -1770 98 -1772 101 -1774 103 -1776 100 -1778 104 -1780 96 -1782 101 -1784 99 -1786 103 -1788 102 -1790 102 -1792 98 -1794 102 -1796 102 -1798 100 -1800 100 -1802 100 -1804 100 -1806 100 -1808 100 -1810 100 -1812 100 -1814 100 -1816 100 -1818 101 -1820 100 -1822 102 -1824 100 -1826 99 -1828 99 -1830 104 -1832 103 -1834 104 -1836 104 -1838 104 -1840 100 -1842 105 -1844 101 -1846 103 -1848 103 -1850 102 -1852 102 -1854 102 -1856 101 -1858 100 -1860 100 -1862 100 -1864 101 -1866 100 -1868 101 -1870 100 -1872 100 -1874 100 -1876 100 -1878 100 -1880 100 -1882 101 -1884 104 -1886 106 -1888 102 -1890 101 -1892 106 -1894 105 -1896 103 -1898 106 -1900 106 -1902 104 -1904 104 -1906 105 -1908 104 -1910 102 -1912 103 -1914 101 -1916 100 -1918 101 -1920 100 -1922 100 -1924 100 -1926 100 -1928 100 -1930 100 -1932 100 -1934 100 -1936 100 -1938 101 -1940 100 -1942 101 -1944 100 -1946 105 -1948 103 -1950 106 -1952 107 -1954 106 -1956 104 -1958 105 -1960 105 -1962 103 -1964 106 -1966 105 -1968 102 -1970 101 -1972 101 -1974 100 -1976 100 -1978 100 -1980 100 -1982 100 -1984 101 -1986 101 -1988 101 -1990 101 -1992 101 -1994 101 -1996 102 -1998 100 -2000 105 -2002 109 -2004 105 -2006 104 -2008 105 -2010 105 -2012 106 -2014 106 -2016 108 -2018 106 -2020 104 -2022 102 -2024 103 -2026 103 -2028 102 -2030 100 -2032 101 -2034 101 -2036 101 -2038 100 -2040 101 -2042 100 -2044 101 -2046 100 -2048 100 -2052 101 -2056 101 -2060 105 -2064 106 -2068 102 -2072 109 -2076 107 -2080 108 -2084 107 -2088 107 -2092 108 -2096 104 -2100 108 -2104 107 -2108 109 -2112 105 -2116 105 -2120 101 -2124 103 -2128 101 -2132 102 -2136 100 -2140 100 -2144 100 -2148 100 -2152 100 -2156 101 -2160 100 -2164 100 -2168 106 -2172 108 -2176 107 -2180 108 -2184 109 -2188 111 -2192 108 -2196 107 -2200 107 -2204 112 -2208 108 -2212 106 -2216 104 -2220 102 -2224 101 -2228 100 -2232 100 -2236 101 -2240 101 -2244 101 -2248 100 -2252 101 -2256 101 -2260 102 -2264 103 -2268 101 -2272 101 -2276 107 -2280 103 -2284 109 -2288 110 -2292 112 -2296 108 -2300 111 -2304 112 -2308 111 -2312 109 -2316 112 -2320 110 -2324 111 -2328 107 -2332 105 -2336 104 -2340 101 -2344 101 -2348 102 -2352 102 -2356 101 -2360 101 -2364 101 -2368 101 -2372 100 -2376 102 -2380 101 -2384 101 -2388 101 -2392 103 -2396 107 -2400 109 -2404 111 -2408 107 -2412 112 -2416 108 -2420 111 -2424 113 -2428 113 -2432 112 -2436 114 -2440 107 -2444 112 -2448 113 -2452 109 -2456 103 -2460 101 -2464 100 -2468 103 -2472 101 -2476 101 -2480 101 -2484 101 -2488 100 -2492 101 -2496 105 -2500 101 -2504 107 -2508 103 -2512 111 -2516 112 -2520 111 -2524 108 -2528 113 -2532 112 -2536 116 -2540 116 -2544 114 -2548 115 -2552 112 -2556 113 -2560 113 -2564 111 -2568 109 -2572 109 -2576 102 -2580 102 -2584 101 -2588 104 -2592 101 -2596 100 -2600 101 -2604 104 -2608 101 -2612 101 -2616 106 -2620 108 -2624 112 -2628 112 -2632 116 -2636 115 -2640 115 -2644 117 -2648 113 -2652 114 -2656 112 -2660 114 -2664 111 -2668 106 -2672 102 -2676 102 -2680 102 -2684 103 -2688 102 -2692 102 -2696 101 -2700 101 -2704 101 -2708 101 -2712 101 -2716 103 -2720 109 -2724 112 -2728 112 -2732 113 -2736 117 -2740 118 -2744 113 -2748 118 -2752 115 -2756 114 -2760 117 -2764 114 -2768 115 -2772 113 -2776 113 -2780 111 -2784 108 -2788 103 -2792 101 -2796 104 -2800 102 -2804 105 -2808 101 -2812 107 -2816 106 -2820 106 -2824 102 -2828 104 -2832 108 -2836 112 -2840 111 -2844 116 -2848 114 -2852 118 -2856 118 -2860 119 -2864 118 -2868 117 -2872 118 -2876 124 -2880 126 -2884 119 -2888 124 -2892 118 -2896 121 -2900 114 -2904 118 -2908 123 -2912 116 -2916 116 -2920 123 -2924 121 -2928 120 -2932 121 -2936 125 -2940 105 -2944 126 -2948 111 -2952 129 -2956 116 -2960 111 -2964 116 -2968 129 -2972 128 -2976 119 -2980 128 -2984 123 -2988 127 -2992 130 -2996 129 -3000 118 -3004 128 -3008 122 -3012 115 -3016 127 -3020 114 -3024 119 -3028 118 -3032 119 -3036 126 -3040 102 -3044 111 -3048 103 -3052 111 -3056 104 -3060 109 -3064 104 -3068 109 -3072 131 -3076 131 -3080 114 -3084 117 -3088 129 -3092 127 -3096 127 -3100 128 -3104 125 -3108 127 -3112 124 -3116 127 -3120 121 -3124 128 -3128 117 -3132 122 -3136 113 -3140 121 -3144 112 -3148 126 -3152 104 -3156 105 -3160 114 -3164 102 -3168 114 -3172 124 -3176 127 -3180 109 -3184 131 -3188 117 -3192 115 -3196 129 -3200 129 -3204 122 -3208 121 -3212 122 -3216 129 -3220 129 -3224 126 -3228 127 -3232 127 -3236 126 -3240 124 -3244 120 -3248 119 -3252 125 -3256 112 -3260 121 -3264 106 -3268 125 -3272 126 -3276 121 -3280 117 -3284 126 -3288 126 -3292 131 -3296 111 -3300 105 -3304 117 -3308 116 -3312 116 -3316 120 -3320 130 -3324 129 -3328 126 -3332 128 -3336 129 -3340 127 -3344 121 -3348 125 -3352 115 -3356 127 -3360 126 -3364 127 -3368 111 -3372 121 -3376 131 -3380 118 -3384 111 -3388 131 -3392 132 -3396 132 -3400 130 -3404 128 -3408 127 -3412 129 -3416 128 -3420 125 -3424 127 -3428 129 -3432 126 -3436 120 -3440 125 -3444 126 -3448 116 -3452 131 -3456 124 -3460 129 -3464 117 -3468 130 -3472 130 -3476 133 -3480 102 -3484 133 -3488 135 -3492 115 -3496 131 -3500 120 -3504 120 -3508 123 -3512 124 -3516 126 -3520 129 -3524 132 -3528 129 -3532 129 -3536 127 -3540 130 -3544 123 -3548 129 -3552 132 -3556 127 -3560 129 -3564 129 -3568 121 -3572 131 -3576 117 -3580 135 -3584 121 -3588 131 -3592 112 -3596 121 -3600 136 -3604 119 -3608 123 -3612 119 -3616 121 -3620 132 -3624 131 -3628 129 -3632 127 -3636 132 -3640 128 -3644 131 -3648 127 -3652 129 -3656 130 -3660 128 -3664 133 -3668 124 -3672 125 -3676 122 -3680 128 -3684 120 -3688 116 -3692 114 -3696 127 -3700 112 -3704 125 -3708 127 -3712 114 -3716 136 -3720 136 -3724 135 -3728 133 -3732 133 -3736 134 -3740 133 -3744 128 -3748 129 -3752 127 -3756 129 -3760 131 -3764 132 -3768 129 -3772 129 -3776 131 -3780 134 -3784 128 -3788 123 -3792 126 -3796 126 -3800 115 -3804 128 -3808 127 -3812 133 -3816 136 -3820 114 -3824 138 -3828 122 -3832 128 -3836 140 -3840 116 -3844 127 -3848 134 -3852 136 -3856 131 -3860 129 -3864 128 -3868 129 -3872 132 -3876 131 -3880 128 -3884 130 -3888 131 -3892 132 -3896 131 -3900 127 -3904 130 -3908 127 -3912 134 -3916 123 -3920 129 -3924 135 -3928 128 -3932 118 -3936 117 -3940 142 -3944 132 -3948 124 -3952 138 -3956 139 -3960 136 -3964 131 -3968 132 -3972 132 -3976 127 -3980 130 -3984 130 -3988 129 -3992 129 -3996 132 -4000 132 -4004 132 -4008 130 -4012 133 -4016 132 -4020 136 -4024 128 -4028 131 -4032 121 -4036 130 -4040 138 -4044 142 -4048 121 -4052 132 -4056 123 -4060 130 -4064 123 -4068 134 -4072 135 -4076 135 -4080 134 -4084 132 -4088 131 -4092 131 -4096 131 -4104 136 -4112 131 -4120 137 -4128 135 -4136 128 -4144 128 -4152 131 -4160 120 -4168 143 -4176 144 -4184 143 -4192 143 -4200 126 -4208 139 -4216 138 -4224 136 -4232 133 -4240 133 -4248 137 -4256 132 -4264 135 -4272 133 -4280 135 -4288 132 -4296 134 -4304 131 -4312 131 -4320 131 -4328 143 -4336 148 -4344 141 -4352 140 -4360 136 -4368 137 -4376 138 -4384 136 -4392 142 -4400 139 -4408 140 -4416 136 -4424 140 -4432 141 -4440 133 -4448 140 -4456 138 -4464 146 -4472 139 -4480 139 -4488 141 -4496 138 -4504 139 -4512 138 -4520 136 -4528 140 -4536 146 -4544 146 -4552 145 -4560 145 -4568 143 -4576 139 -4584 140 -4592 141 -4600 141 -4608 146 -4616 146 -4624 140 -4632 137 -4640 144 -4648 138 -4656 140 -4664 139 -4672 140 -4680 143 -4688 144 -4696 142 -4704 142 -4712 140 -4720 142 -4728 141 -4736 137 -4744 139 -4752 140 -4760 141 -4768 141 -4776 142 -4784 145 -4792 146 -4800 140 -4808 146 -4816 138 -4824 141 -4832 144 -4840 136 -4848 142 -4856 146 -4864 143 -4872 147 -4880 140 -4888 143 -4896 146 -4904 146 -4912 144 -4920 145 -4928 142 -4936 142 -4944 139 -4952 143 -4960 139 -4968 140 -4976 142 -4984 144 -4992 145 -5000 139 -5008 145 -5016 147 -5024 140 -5032 146 -5040 148 -5048 140 -5056 140 -5064 144 -5072 142 -5080 143 -5088 143 -5096 145 -5104 146 -5112 144 -5120 147 -5128 142 -5136 146 -5144 147 -5152 143 -5160 141 -5168 142 -5176 140 -5184 137 -5192 140 -5200 144 -5208 144 -5216 143 -5224 143 -5232 144 -5240 147 -5248 143 -5256 146 -5264 140 -5272 146 -5280 146 -5288 142 -5296 2984 -5304 1277 -5312 142 -5320 286 -5328 239 -5336 267 -5344 211 -5352 140 -5360 141 -5368 144 -5376 145 -5384 145 -5392 148 -5400 144 -5408 149 -5416 146 -5424 150 -5432 143 -5440 144 -5448 149 -5456 148 -5464 145 -5472 146 -5480 146 -5488 147 -5496 146 -5504 143 -5512 141 -5520 145 -5528 137 -5536 145 -5544 143 -5552 142 -5560 143 -5568 146 -5576 145 -5584 148 -5592 145 -5600 145 -5608 145 -5616 149 -5624 143 -5632 150 -5640 150 -5648 148 -5656 145 -5664 147 -5672 146 -5680 148 -5688 149 -5696 148 -5704 150 -5712 147 -5720 149 -5728 144 -5736 146 -5744 147 -5752 140 -5760 148 -5768 211 -5776 147 -5784 151 -5792 150 -5800 151 -5808 149 -5816 146 -5824 153 -5832 159 -5840 146 -5848 154 -5856 151 -5864 149 -5872 152 -5880 147 -5888 150 -5896 149 -5904 151 -5912 149 -5920 148 -5928 151 -5936 150 -5944 150 -5952 150 -5960 150 -5968 148 -5976 149 -5984 148 -5992 147 -6000 148 -6008 150 -6016 150 -6024 150 -6032 149 -6040 146 -6048 158 -6056 144 -6064 149 -6072 147 -6080 152 -6088 153 -6096 149 -6104 151 -6112 150 -6120 150 -6128 149 -6136 149 -6144 150 -6152 151 -6160 151 -6168 151 -6176 150 -6184 150 -6192 151 -6200 150 -6208 149 -6216 149 -6224 151 -6232 151 -6240 153 -6248 153 -6256 152 -6264 148 -6272 150 -6280 150 -6288 153 -6296 151 -6304 152 -6312 149 -6320 152 -6328 148 -6336 150 -6344 151 -6352 152 -6360 151 -6368 150 -6376 153 -6384 153 -6392 151 -6400 151 -6408 151 -6416 150 -6424 151 -6432 151 -6440 152 -6448 151 -6456 153 -6464 152 -6472 151 -6480 151 -6488 155 -6496 155 -6504 155 -6512 158 -6520 155 -6528 154 -6536 152 -6544 154 -6552 152 -6560 152 -6568 151 -6576 153 -6584 152 -6592 152 -6600 152 -6608 153 -6616 151 -6624 151 -6632 153 -6640 151 -6648 154 -6656 152 -6664 153 -6672 151 -6680 151 -6688 160 -6696 160 -6704 151 -6712 152 -6720 155 -6728 158 -6736 153 -6744 158 -6752 878 -6760 157 -6768 780 -6776 152 -6784 175 -6792 154 -6800 153 -6808 154 -6816 156 -6824 152 -6832 157 -6840 155 -6848 158 -6856 159 -6864 158 -6872 155 -6880 154 -6888 150 -6896 154 -6904 155 -6912 154 -6920 154 -6928 151 -6936 153 -6944 152 -6952 152 -6960 152 -6968 154 -6976 154 -6984 151 -6992 153 -7000 154 -7008 157 -7016 157 -7024 156 -7032 156 -7040 153 -7048 160 -7056 158 -7064 156 -7072 156 -7080 157 -7088 161 -7096 162 -7104 156 -7112 156 -7120 158 -7128 157 -7136 155 -7144 155 -7152 157 -7160 155 -7168 152 -7176 153 -7184 152 -7192 155 -7200 152 -7208 154 -7216 177 -7224 157 -7232 158 -7240 156 -7248 160 -7256 155 -7264 158 -7272 155 -7280 155 -7288 156 -7296 157 -7304 154 -7312 162 -7320 160 -7328 158 -7336 161 -7344 162 -7352 163 -7360 161 -7368 162 -7376 164 -7384 161 -7392 162 -7400 160 -7408 162 -7416 162 -7424 161 -7432 161 -7440 161 -7448 157 -7456 156 -7464 157 -7472 154 -7480 160 -7488 156 -7496 156 -7504 162 -7512 157 -7520 156 -7528 161 -7536 160 -7544 164 -7552 162 -7560 163 -7568 163 -7576 164 -7584 164 -7592 163 -7600 162 -7608 164 -7616 162 -7624 161 -7632 162 -7640 163 -7648 163 -7656 160 -7664 161 -7672 162 -7680 161 -7688 157 -7696 160 -7704 161 -7712 156 -7720 157 -7728 155 -7736 162 -7744 156 -7752 161 -7760 159 -7768 162 -7776 164 -7784 163 -7792 165 -7800 167 -7808 166 -7816 165 -7824 165 -7832 165 -7840 164 -7848 164 -7856 166 -7864 166 -7872 163 -7880 164 -7888 163 -7896 162 -7904 165 -7912 157 -7920 155 -7928 163 -7936 160 -7944 163 -7952 162 -7960 163 -7968 162 -7976 160 -7984 162 -7992 164 -8000 165 -8008 166 -8016 166 -8024 164 -8032 168 -8040 168 -8048 167 -8056 166 -8064 167 -8072 167 -8080 167 -8088 166 -8096 164 -8104 165 -8112 166 -8120 167 -8128 168 -8136 164 -8144 161 -8152 162 -8160 167 -8168 167 -8176 165 -8184 165 -8192 164 -8208 165 -8224 168 -8240 167 -8256 168 -8272 169 -8288 167 -8304 167 -8320 168 -8336 167 -8352 166 -8368 167 -8384 166 -8400 169 -8416 166 -8432 170 -8448 170 -8464 167 -8480 167 -8496 167 -8512 168 -8528 159 -8544 168 -8560 168 -8576 168 -8592 169 -8608 169 -8624 169 -8640 171 -8656 170 -8672 172 -8688 172 -8704 173 -8720 171 -8736 171 -8752 170 -8768 173 -8784 169 -8800 171 -8816 168 -8832 170 -8848 170 -8864 171 -8880 171 -8896 169 -8912 171 -8928 166 -8944 170 -8960 166 -8976 169 -8992 172 -9008 173 -9024 173 -9040 172 -9056 172 -9072 173 -9088 172 -9104 172 -9120 173 -9136 172 -9152 172 -9168 172 -9184 173 -9200 173 -9216 172 -9232 172 -9248 170 -9264 173 -9280 174 -9296 175 -9312 174 -9328 173 -9344 173 -9360 173 -9376 240 -9392 244 -9408 244 -9424 243 -9440 249 -9456 250 -9472 247 -9488 244 -9504 251 -9520 250 -9536 250 -9552 259 -9568 252 -9584 250 -9600 251 -9616 250 -9632 251 -9648 250 -9664 251 -9680 250 -9696 250 -9712 251 -9728 250 -9744 251 -9760 251 -9776 251 -9792 251 -9808 250 -9824 250 -9840 252 -9856 251 -9872 251 -9888 251 -9904 251 -9920 251 -9936 252 -9952 251 -9968 251 -9984 251 -10000 251 -10016 251 -10032 251 -10048 251 -10064 251 -10080 251 -10096 250 -10112 251 -10128 277 -10144 274 -10160 276 -10176 275 -10192 275 -10208 275 -10224 278 -10240 276 -10256 274 -10272 277 -10288 279 -10304 277 -10320 275 -10336 277 -10352 280 -10368 277 -10384 272 -10400 275 -10416 281 -10432 279 -10448 278 -10464 279 -10480 279 -10496 275 -10512 277 -10528 278 -10544 279 -10560 280 -10576 282 -10592 281 -10608 277 -10624 278 -10640 281 -10656 279 -10672 280 -10688 277 -10704 277 -10720 279 -10736 280 -10752 277 -10768 279 -10784 274 -10800 278 -10816 282 -10832 277 -10848 276 -10864 283 -10880 283 -10896 282 -10912 280 -10928 281 -10944 283 -10960 281 -10976 283 -10992 282 -11008 280 -11024 282 -11040 280 -11056 285 -11072 283 -11088 369 -11104 279 -11120 282 -11136 280 -11152 279 -11168 281 -11184 285 -11200 283 -11216 277 -11232 283 -11248 284 -11264 282 -11280 280 -11296 280 -11312 284 -11328 279 -11344 284 -11360 281 -11376 282 -11392 281 -11408 280 -11424 278 -11440 282 -11456 283 -11472 282 -11488 280 -11504 281 -11520 284 -11536 282 -11552 293 -11568 283 -11584 296 -11600 279 -11616 277 -11632 282 -11648 302 -11664 293 -11680 285 -11696 279 -11712 285 -11728 280 -11744 279 -11760 282 -11776 278 -11792 282 -11808 285 -11824 281 -11840 281 -11856 280 -11872 281 -11888 281 -11904 307 -11920 281 -11936 283 -11952 286 -11968 281 -11984 283 -12000 296 -12016 279 -12032 285 -12048 286 -12064 294 -12080 297 -12096 307 -12112 277 -12128 277 -12144 281 -12160 283 -12176 308 -12192 286 -12208 281 -12224 291 -12240 286 -12256 279 -12272 304 -12288 290 -12304 298 -12320 282 -12336 278 -12352 290 -12368 278 -12384 281 -12400 281 -12416 288 -12432 280 -12448 298 -12464 302 -12480 310 -12496 280 -12512 282 -12528 302 -12544 304 -12560 306 -12576 278 -12592 279 -12608 301 -12624 286 -12640 283 -12656 280 -12672 286 -12688 280 -12704 286 -12720 313 -12736 279 -12752 281 -12768 307 -12784 294 -12800 304 -12816 285 -12832 280 -12848 316 -12864 302 -12880 289 -12896 286 -12912 328 -12928 294 -12944 281 -12960 312 -12976 294 -12992 335 -13008 298 -13024 320 -13040 292 -13056 319 -13072 282 -13088 307 -13104 285 -13120 283 -13136 290 -13152 293 -13168 325 -13184 281 -13200 310 -13216 284 -13232 286 -13248 284 -13264 301 -13280 309 -13296 286 -13312 285 -13328 316 -13344 309 -13360 287 -13376 298 -13392 292 -13408 319 -13424 300 -13440 284 -13456 320 -13472 304 -13488 332 -13504 312 -13520 303 -13536 293 -13552 321 -13568 288 -13584 296 -13600 286 -13616 311 -13632 322 -13648 287 -13664 324 -13680 313 -13696 334 -13712 319 -13728 288 -13744 287 -13760 340 -13776 297 -13792 284 -13808 322 -13824 339 -13840 328 -13856 288 -13872 335 -13888 297 -13904 286 -13920 294 -13936 285 -13952 290 -13968 332 -13984 286 -14000 338 -14016 290 -14032 297 -14048 348 -14064 290 -14080 288 -14096 340 -14112 332 -14128 291 -14144 330 -14160 327 -14176 307 -14192 311 -14208 294 -14224 338 -14240 342 -14256 356 -14272 321 -14288 330 -14304 321 -14320 289 -14336 330 -14352 287 -14368 288 -14384 288 -14400 330 -14416 347 -14432 288 -14448 316 -14464 299 -14480 311 -14496 298 -14512 295 -14528 328 -14544 319 -14560 338 -14576 341 -14592 326 -14608 313 -14624 334 -14640 320 -14656 315 -14672 318 -14688 314 -14704 361 -14720 352 -14736 296 -14752 307 -14768 325 -14784 363 -14800 340 -14816 363 -14832 301 -14848 326 -14864 366 -14880 323 -14896 341 -14912 359 -14928 356 -14944 334 -14960 337 -14976 371 -14992 319 -15008 287 -15024 344 -15040 322 -15056 366 -15072 346 -15088 317 -15104 301 -15120 330 -15136 345 -15152 324 -15168 346 -15184 352 -15200 327 -15216 334 -15232 344 -15248 334 -15264 367 -15280 338 -15296 338 -15312 364 -15328 368 -15344 315 -15360 357 -15376 348 -15392 325 -15408 334 -15424 374 -15440 358 -15456 360 -15472 351 -15488 356 -15504 372 -15520 346 -15536 363 -15552 334 -15568 352 -15584 369 -15600 359 -15616 326 -15632 341 -15648 372 -15664 370 -15680 374 -15696 366 -15712 368 -15728 369 -15744 349 -15760 355 -15776 368 -15792 354 -15808 366 -15824 346 -15840 342 -15856 363 -15872 371 -15888 347 -15904 324 -15920 368 -15936 367 -15952 373 -15968 367 -15984 372 -16000 364 -16016 372 -16032 356 -16048 372 -16064 371 -16080 372 -16096 366 -16112 370 -16128 363 -16144 371 -16160 374 -16176 352 -16192 359 -16208 364 -16224 359 -16240 362 -16256 330 -16272 369 -16288 322 -16304 362 -16320 381 -16336 370 -16352 375 -16368 374 -16384 372 -16416 378 -16448 373 -16480 373 -16512 372 -16544 380 -16576 377 -16608 372 -16640 371 -16672 376 -16704 374 -16736 363 -16768 372 -16800 373 -16832 375 -16864 379 -16896 383 -16928 381 -16960 376 -16992 374 -17024 373 -17056 381 -17088 373 -17120 385 -17152 373 -17184 383 -17216 378 -17248 376 -17280 376 -17312 385 -17344 384 -17376 383 -17408 383 -17440 387 -17472 379 -17504 393 -17536 382 -17568 379 -17600 391 -17632 390 -17664 383 -17696 384 -17728 388 -17760 388 -17792 382 -17824 388 -17856 394 -17888 388 -17920 388 -17952 383 -17984 385 -18016 379 -18048 390 -18080 394 -18112 387 -18144 392 -18176 385 -18208 396 -18240 388 -18272 393 -18304 386 -18336 480 -18368 402 -18400 398 -18432 395 -18464 399 -18496 390 -18528 392 -18560 388 -18592 392 -18624 391 -18656 389 -18688 393 -18720 385 -18752 395 -18784 390 -18816 393 -18848 393 -18880 389 -18912 392 -18944 391 -18976 390 -19008 392 -19040 396 -19072 389 -19104 389 -19136 393 -19168 394 -19200 390 -19232 390 -19264 399 -19296 392 -19328 394 -19360 397 -19392 396 -19424 389 -19456 392 -19488 395 -19520 397 -19552 399 -19584 395 -19616 403 -19648 397 -19680 396 -19712 396 -19744 397 -19776 398 -19808 389 -19840 396 -19872 401 -19904 401 -19936 399 -19968 398 -20000 401 -20032 395 -20064 399 -20096 395 -20128 401 -20160 394 -20192 396 -20224 397 -20256 394 -20288 396 -20320 396 -20352 392 -20384 402 -20416 409 -20448 392 -20480 396 -20512 390 -20544 392 -20576 394 -20608 397 -20640 393 -20672 399 -20704 393 -20736 411 -20768 396 -20800 400 -20832 394 -20864 399 -20896 398 -20928 398 -20960 400 -20992 413 -21024 398 -21056 396 -21088 416 -21120 397 -21152 395 -21184 411 -21216 400 -21248 396 -21280 397 -21312 398 -21344 393 -21376 400 -21408 418 -21440 401 -21472 396 -21504 399 -21536 398 -21568 397 -21600 399 -21632 396 -21664 399 -21696 399 -21728 410 -21760 412 -21792 415 -21824 410 -21856 405 -21888 409 -21920 411 -21952 408 -21984 415 -22016 396 -22048 409 -22080 412 -22112 411 -22144 415 -22176 412 -22208 410 -22240 412 -22272 414 -22304 415 -22336 412 -22368 417 -22400 411 -22432 413 -22464 419 -22496 413 -22528 415 -22560 409 -22592 414 -22624 413 -22656 421 -22688 411 -22720 408 -22752 414 -22784 414 -22816 400 -22848 395 -22880 413 -22912 421 -22944 416 -22976 416 -23008 417 -23040 416 -23072 395 -23104 415 -23136 417 -23168 421 -23200 416 -23232 410 -23264 411 -23296 412 -23328 410 -23360 398 -23392 412 -23424 411 -23456 412 -23488 412 -23520 407 -23552 412 -23584 415 -23616 411 -23648 411 -23680 413 -23712 409 -23744 411 -23776 418 -23808 414 -23840 410 -23872 410 -23904 417 -23936 414 -23968 414 -24000 413 -24032 412 -24064 419 -24096 411 -24128 421 -24160 416 -24192 417 -24224 414 -24256 413 -24288 414 -24320 418 -24352 416 -24384 409 -24416 418 -24448 412 -24480 421 -24512 417 -24544 421 -24576 418 -24608 434 -24640 428 -24672 430 -24704 430 -24736 434 -24768 438 -24800 432 -24832 434 -24864 429 -24896 432 -24928 430 -24960 434 -24992 428 -25024 432 -25056 435 -25088 434 -25120 424 -25152 429 -25184 433 -25216 433 -25248 426 -25280 430 -25312 434 -25344 429 -25376 439 -25408 432 -25440 440 -25472 434 -25504 431 -25536 436 -25568 441 -25600 436 -25632 449 -25664 449 -25696 443 -25728 437 -25760 439 -25792 441 -25824 441 -25856 442 -25888 451 -25920 448 -25952 450 -25984 443 -26016 434 -26048 457 -26080 461 -26112 456 -26144 457 -26176 464 -26208 450 -26240 465 -26272 451 -26304 455 -26336 467 -26368 463 -26400 453 -26432 456 -26464 456 -26496 455 -26528 463 -26560 447 -26592 455 -26624 455 -26656 462 -26688 457 -26720 466 -26752 465 -26784 460 -26816 458 -26848 454 -26880 458 -26912 463 -26944 453 -26976 477 -27008 455 -27040 460 -27072 471 -27104 475 -27136 459 -27168 488 -27200 464 -27232 459 -27264 472 -27296 469 -27328 461 -27360 476 -27392 465 -27424 473 -27456 472 -27488 484 -27520 482 -27552 491 -27584 482 -27616 471 -27648 480 -27680 481 -27712 482 -27744 484 -27776 476 -27808 486 -27840 484 -27872 485 -27904 494 -27936 478 -27968 478 -28000 490 -28032 478 -28064 481 -28096 480 -28128 478 -28160 487 -28192 487 -28224 481 -28256 491 -28288 479 -28320 495 -28352 486 -28384 480 -28416 480 -28448 501 -28480 478 -28512 491 -28544 489 -28576 472 -28608 497 -28640 483 -28672 494 -28704 474 -28736 491 -28768 494 -28800 503 -28832 490 -28864 503 -28896 500 -28928 493 -28960 495 -28992 492 -29024 496 -29056 487 -29088 498 -29120 491 -29152 491 -29184 502 -29216 489 -29248 489 -29280 488 -29312 497 -29344 506 -29376 495 -29408 494 -29440 491 -29472 504 -29504 498 -29536 501 -29568 512 -29600 496 -29632 488 -29664 489 -29696 503 -29728 502 -29760 490 -29792 502 -29824 494 -29856 510 -29888 501 -29920 1673 -29952 506 -29984 490 -30016 504 -30048 497 -30080 491 -30112 509 -30144 489 -30176 495 -30208 500 -30240 502 -30272 508 -30304 498 -30336 527 -30368 517 -30400 514 -30432 509 -30464 524 -30496 520 -30528 527 -30560 520 -30592 510 -30624 525 -30656 524 -30688 509 -30720 518 -30752 533 -30784 525 -30816 515 -30848 520 -30880 525 -30912 519 -30944 502 -30976 516 -31008 510 -31040 518 -31072 526 -31104 533 -31136 513 -31168 519 -31200 513 -31232 519 -31264 518 -31296 535 -31328 519 -31360 549 -31392 527 -31424 527 -31456 518 -31488 544 -31520 527 -31552 518 -31584 515 -31616 527 -31648 510 -31680 525 -31712 539 -31744 519 -31776 532 -31808 516 -31840 560 -31872 534 -31904 575 -31936 555 -31968 547 -32000 526 -32032 515 -32064 545 -32096 551 -32128 543 -32160 532 -32192 522 -32224 524 -32256 565 -32288 520 -32320 527 -32352 525 -32384 548 -32416 537 -32448 514 -32480 545 -32512 536 -32544 527 -32576 551 -32608 549 -32640 573 -32672 525 -32704 537 -32736 545 -32768 524 -32832 538 -32896 538 -32960 534 -33024 563 -33088 528 -33152 567 -33216 528 -33280 566 -33344 574 -33408 569 -33472 549 -33536 572 -33600 571 -33664 520 -33728 585 -33792 570 -33856 582 -33920 544 -33984 581 -34048 551 -34112 572 -34176 578 -34240 571 -34304 590 -34368 581 -34432 585 -34496 582 -34560 568 -34624 584 -34688 587 -34752 591 -34816 591 -34880 584 -34944 581 -35008 586 -35072 562 -35136 573 -35200 587 -35264 593 -35328 594 -35392 600 -35456 568 -35520 589 -35584 586 -35648 591 -35712 591 -35776 595 -35840 589 -35904 600 -35968 608 -36032 600 -36096 612 -36160 599 -36224 612 -36288 602 -36352 611 -36416 607 -36480 602 -36544 606 -36608 605 -36672 603 -36736 591 -36800 608 -36864 612 -36928 610 -36992 604 -37056 615 -37120 613 -37184 619 -37248 613 -37312 607 -37376 611 -37440 615 -37504 611 -37568 626 -37632 618 -37696 619 -37760 623 -37824 618 -37888 630 -37952 615 -38016 622 -38080 624 -38144 622 -38208 616 -38272 629 -38336 623 -38400 616 -38464 625 -38528 614 -38592 626 -38656 635 -38720 624 -38784 624 -38848 623 -38912 615 -38976 622 -39040 629 -39104 635 -39168 623 -39232 639 -39296 634 -39360 629 -39424 642 -39488 637 -39552 637 -39616 637 -39680 648 -39744 640 -39808 647 -39872 636 -39936 632 -40000 645 -40064 638 -40128 645 -40192 640 -40256 644 -40320 635 -40384 629 -40448 641 -40512 647 -40576 648 -40640 646 -40704 640 -40768 643 -40832 657 -40896 638 -40960 647 -41024 648 -41088 649 -41152 644 -41216 642 -41280 644 -41344 648 -41408 648 -41472 663 -41536 646 -41600 666 -41664 651 -41728 656 -41792 650 -41856 647 -41920 653 -41984 667 -42048 664 -42112 672 -42176 670 -42240 660 -42304 667 -42368 673 -42432 659 -42496 674 -42560 675 -42624 670 -42688 673 -42752 662 -42816 666 -42880 670 -42944 664 -43008 673 -43072 675 -43136 680 -43200 680 -43264 672 -43328 671 -43392 678 -43456 680 -43520 689 -43584 683 -43648 697 -43712 699 -43776 685 -43840 675 -43904 680 -43968 685 -44032 681 -44096 683 -44160 688 -44224 681 -44288 702 -44352 705 -44416 685 -44480 689 -44544 694 -44608 692 -44672 688 -44736 688 -44800 694 -44864 708 -44928 702 -44992 700 -45056 707 -45120 704 -45184 707 -45248 707 -45312 702 -45376 707 -45440 709 -45504 710 -45568 710 -45632 710 -45696 714 -45760 710 -45824 701 -45888 709 -45952 712 -46016 706 -46080 714 -46144 712 -46208 711 -46272 716 -46336 715 -46400 724 -46464 726 -46528 720 -46592 713 -46656 713 -46720 710 -46784 719 -46848 716 -46912 715 -46976 725 -47040 725 -47104 715 -47168 725 -47232 718 -47296 719 -47360 725 -47424 728 -47488 715 -47552 721 -47616 718 -47680 712 -47744 735 -47808 727 -47872 737 -47936 742 -48000 736 -48064 738 -48128 740 -48192 728 -48256 732 -48320 729 -48384 743 -48448 736 -48512 733 -48576 739 -48640 741 -48704 742 -48768 741 -48832 742 -48896 735 -48960 735 -49024 740 -49088 738 -49152 737 -49216 747 -49280 739 -49344 740 -49408 744 -49472 749 -49536 756 -49600 744 -49664 733 -49728 748 -49792 744 -49856 743 -49920 752 -49984 748 -50048 750 -50112 741 -50176 752 -50240 745 -50304 751 -50368 741 -50432 748 -50496 742 -50560 751 -50624 751 -50688 747 -50752 764 -50816 749 -50880 759 -50944 752 -51008 757 -51072 760 -51136 759 -51200 755 -51264 759 -51328 748 -51392 758 -51456 760 -51520 747 -51584 755 -51648 761 -51712 764 -51776 763 -51840 761 -51904 782 -51968 766 -52032 764 -52096 761 -52160 759 -52224 772 -52288 773 -52352 764 -52416 768 -52480 779 -52544 770 -52608 757 -52672 779 -52736 773 -52800 769 -52864 778 -52928 773 -52992 786 -53056 778 -53120 772 -53184 771 -53248 771 -53312 771 -53376 772 -53440 776 -53504 800 -53568 792 -53632 791 -53696 783 -53760 801 -53824 798 -53888 795 -53952 786 -54016 796 -54080 783 -54144 792 -54208 788 -54272 802 -54336 787 -54400 782 -54464 779 -54528 794 -54592 794 -54656 785 -54720 789 -54784 791 -54848 808 -54912 798 -54976 799 -55040 805 -55104 791 -55168 803 -55232 812 -55296 805 -55360 812 -55424 814 -55488 802 -55552 810 -55616 798 -55680 806 -55744 807 -55808 803 -55872 811 -55936 814 -56000 807 -56064 799 -56128 804 -56192 816 -56256 805 -56320 805 -56384 820 -56448 821 -56512 823 -56576 808 -56640 810 -56704 809 -56768 826 -56832 831 -56896 812 -56960 823 -57024 825 -57088 820 -57152 812 -57216 822 -57280 809 -57344 832 -57408 811 -57472 824 -57536 810 -57600 821 -57664 821 -57728 817 -57792 819 -57856 835 -57920 833 -57984 838 -58048 823 -58112 826 -58176 830 -58240 844 -58304 828 -58368 828 -58432 821 -58496 825 -58560 839 -58624 850 -58688 829 -58752 838 -58816 826 -58880 838 -58944 835 -59008 828 -59072 830 -59136 838 -59200 847 -59264 829 -59328 851 -59392 847 -59456 837 -59520 838 -59584 835 -59648 842 -59712 846 -59776 849 -59840 854 -59904 848 -59968 856 -60032 859 -60096 838 -60160 848 -60224 849 -60288 858 -60352 846 -60416 849 -60480 848 -60544 855 -60608 847 -60672 870 -60736 857 -60800 858 -60864 882 -60928 862 -60992 853 -61056 857 -61120 851 -61184 866 -61248 848 -61312 872 -61376 873 -61440 881 -61504 864 -61568 878 -61632 880 -61696 871 -61760 877 -61824 863 -61888 879 -61952 861 -62016 867 -62080 877 -62144 876 -62208 884 -62272 866 -62336 860 -62400 882 -62464 874 -62528 865 -62592 867 -62656 886 -62720 875 -62784 877 -62848 872 -62912 861 -62976 899 -63040 870 -63104 885 -63168 889 -63232 863 -63296 876 -63360 868 -63424 866 -63488 879 -63552 885 -63616 869 -63680 878 -63744 885 -63808 884 -63872 878 -63936 882 -64000 889 -64064 878 -64128 895 -64192 875 -64256 889 -64320 882 -64384 880 -64448 889 -64512 883 -64576 886 -64640 879 -64704 892 -64768 880 -64832 890 -64896 908 -64960 919 -65024 882 -65088 896 -65152 895 -65216 894 -65280 891 -65344 889 -65408 891 -65472 1164 -65536 1148 -65664 1172 -65792 1171 -65920 1164 -66048 1162 -66176 1176 -66304 1169 -66432 1184 -66560 1171 -66688 1198 -66816 1176 -66944 1169 -67072 1185 -67200 1180 -67328 1186 -67456 1170 -67584 1191 -67712 1171 -67840 1170 -67968 1194 -68096 1186 -68224 1175 -68352 1188 -68480 1190 -68608 1181 -68736 1195 -68864 1192 -68992 1198 -69120 1195 -69248 1198 -69376 1189 -69504 1196 -69632 1199 -69760 1201 -69888 1209 -70016 1208 -70144 1217 -70272 1213 -70400 1197 -70528 1209 -70656 1215 -70784 1221 -70912 1215 -71040 1218 -71168 1223 -71296 1213 -71424 1257 -71552 1225 -71680 1228 -71808 1207 -71936 1225 -72064 1239 -72192 1213 -72320 1230 -72448 1229 -72576 1229 -72704 1232 -72832 1260 -72960 1218 -73088 1225 -73216 1227 -73344 1231 -73472 1253 -73600 1238 -73728 1242 -73856 1240 -73984 1236 -74112 1245 -74240 1249 -74368 1242 -74496 1226 -74624 1264 -74752 1237 -74880 1257 -75008 1253 -75136 1257 -75264 1258 -75392 1260 -75520 1272 -75648 1263 -75776 1267 -75904 1258 -76032 1275 -76160 1269 -76288 1281 -76416 1271 -76544 1267 -76672 1277 -76800 1264 -76928 1275 -77056 1267 -77184 1272 -77312 1284 -77440 1275 -77568 1305 -77696 1308 -77824 1303 -77952 1284 -78080 1284 -78208 1280 -78336 1314 -78464 1286 -78592 1291 -78720 1278 -78848 1300 -78976 1280 -79104 1272 -79232 1270 -79360 1300 -79488 1323 -79616 1289 -79744 1310 -79872 1298 -80000 1345 -80128 1333 -80256 1302 -80384 1306 -80512 1334 -80640 1318 -80768 1304 -80896 1303 -81024 1347 -81152 1326 -81280 1303 -81408 1323 -81536 1316 -81664 1315 -81792 1335 -81920 1347 -82048 1316 -82176 1328 -82304 1315 -82432 1342 -82560 1338 -82688 1322 -82816 1320 -82944 1329 -83072 1366 -83200 1323 -83328 1356 -83456 1367 -83584 1338 -83712 1369 -83840 1369 -83968 1341 -84096 1343 -84224 1364 -84352 1345 -84480 1349 -84608 1348 -84736 1335 -84864 1337 -84992 1365 -85120 1355 -85248 1361 -85376 1348 -85504 1345 -85632 1329 -85760 1343 -85888 1365 -86016 1367 -86144 1333 -86272 1357 -86400 1349 -86528 1360 -86656 1393 -86784 1364 -86912 1385 -87040 1401 -87168 1368 -87296 1364 -87424 1378 -87552 1354 -87680 1400 -87808 1368 -87936 1372 -88064 1383 -88192 1399 -88320 1376 -88448 1418 -88576 1388 -88704 1382 -88832 1386 -88960 1408 -89088 1377 -89216 1383 -89344 1376 -89472 1389 -89600 1376 -89728 1417 -89856 1380 -89984 1402 -90112 1394 -90240 1389 -90368 1419 -90496 1393 -90624 1386 -90752 1388 -90880 1402 -91008 1382 -91136 1403 -91264 1379 -91392 1431 -91520 1432 -91648 1435 -91776 1404 -91904 1402 -92032 1434 -92160 1431 -92288 1402 -92416 1401 -92544 1412 -92672 1418 -92800 1423 -92928 1389 -93056 1442 -93184 1425 -93312 1428 -93440 1403 -93568 1430 -93696 1452 -93824 1401 -93952 1414 -94080 1415 -94208 1414 -94336 1421 -94464 1444 -94592 1421 -94720 1462 -94848 1457 -94976 1422 -95104 1423 -95232 1432 -95360 1416 -95488 1447 -95616 1442 -95744 1446 -95872 1444 -96000 1443 -96128 1426 -96256 1437 -96384 1442 -96512 1423 -96640 1457 -96768 1464 -96896 1454 -97024 1439 -97152 1464 -97280 1447 -97408 1437 -97536 1417 -97664 1430 -97792 1475 -97920 1446 -98048 1450 -98176 1445 -98304 1421 -98432 1445 -98560 1443 -98688 1441 -98816 1482 -98944 1447 -99072 1466 -99200 1449 -99328 1455 -99456 1467 -99584 1489 -99712 1461 -99840 1452 -99968 1466 -100096 1465 -100224 1458 -100352 1451 -100480 1510 -100608 1448 -100736 1468 -100864 1489 -100992 1480 -101120 1445 -101248 1487 -101376 1476 -101504 1475 -101632 1466 -101760 1455 -101888 1505 -102016 1465 -102144 1462 -102272 1488 -102400 1483 -102528 1514 -102656 1489 -102784 1491 -102912 1478 -103040 1474 -103168 1498 -103296 1497 -103424 1526 -103552 1521 -103680 1461 -103808 1532 -103936 1493 -104064 1469 -104192 1481 -104320 1482 -104448 1522 -104576 1515 -104704 1537 -104832 1504 -104960 1537 -105088 1500 -105216 1478 -105344 1514 -105472 1472 -105600 1483 -105728 1555 -105856 1481 -105984 1504 -106112 1537 -106240 1502 -106368 1530 -106496 1518 -106624 1506 -106752 1517 -106880 1543 -107008 1550 -107136 1506 -107264 1525 -107392 1548 -107520 1564 -107648 1549 -107776 1514 -107904 1526 -108032 1522 -108160 1557 -108288 1532 -108416 1531 -108544 1538 -108672 1544 -108800 1568 -108928 1550 -109056 1540 -109184 1527 -109312 1541 -109440 1519 -109568 1579 -109696 1532 -109824 1598 -109952 1547 -110080 1573 -110208 1545 -110336 1566 -110464 1553 -110592 1547 -110720 1566 -110848 1582 -110976 1568 -111104 1557 -111232 1559 -111360 1590 -111488 1561 -111616 1547 -111744 1574 -111872 1572 -112000 1542 -112128 1611 -112256 1554 -112384 1579 -112512 1581 -112640 1563 -112768 1592 -112896 1593 -113024 1553 -113152 1592 -113280 1590 -113408 1569 -113536 1596 -113664 1606 -113792 1594 -113920 1642 -114048 1570 -114176 1642 -114304 1648 -114432 1570 -114560 1630 -114688 1649 -114816 1581 -114944 1628 -115072 1573 -115200 1628 -115328 1631 -115456 1576 -115584 1635 -115712 1624 -115840 1592 -115968 1634 -116096 1614 -116224 1661 -116352 1609 -116480 1662 -116608 1577 -116736 1662 -116864 1647 -116992 1617 -117120 1627 -117248 1657 -117376 1631 -117504 1598 -117632 1681 -117760 1643 -117888 1634 -118016 1618 -118144 1639 -118272 1651 -118400 1605 -118528 1591 -118656 1655 -118784 1631 -118912 1622 -119040 1624 -119168 1629 -119296 1598 -119424 1665 -119552 1676 -119680 1620 -119808 1616 -119936 1624 -120064 1669 -120192 1673 -120320 1638 -120448 1627 -120576 1611 -120704 1700 -120832 1653 -120960 1715 -121088 1661 -121216 1659 -121344 1640 -121472 1666 -121600 1662 -121728 1680 -121856 1679 -121984 1707 -122112 1640 -122240 1626 -122368 1684 -122496 1666 -122624 1652 -122752 1633 -122880 1674 -123008 1676 -123136 1665 -123264 1687 -123392 1664 -123520 1659 -123648 1643 -123776 1672 -123904 1694 -124032 1641 -124160 1752 -124288 1648 -124416 1658 -124544 1720 -124672 1711 -124800 1723 -124928 1662 -125056 1647 -125184 1772 -125312 1671 -125440 1647 -125568 1719 -125696 1636 -125824 1694 -125952 1648 -126080 1750 -126208 1713 -126336 1771 -126464 1748 -126592 1655 -126720 1720 -126848 1720 -126976 1675 -127104 1662 -127232 1722 -127360 1675 -127488 1667 -127616 1671 -127744 1668 -127872 1659 -128000 1701 -128128 1667 -128256 1731 -128384 1671 -128512 1670 -128640 1675 -128768 1688 -128896 1690 -129024 1714 -129152 1761 -129280 1761 -129408 1684 -129536 1685 -129664 1774 -129792 1751 -129920 1679 -130048 1678 -130176 1712 -130304 1688 -130432 1810 -130560 1756 -130688 1684 -130816 1686 -130944 1688 -131072 1680 -131328 1750 -131584 1683 -131840 1697 -132096 1687 -132352 1694 -132608 1683 -132864 1683 -133120 1760 -133376 1718 -133632 1687 -133888 1707 -134144 1754 -134400 1761 -134656 1705 -134912 1695 -135168 1758 -135424 1697 -135680 1761 -135936 1754 -136192 1730 -136448 1725 -136704 1838 -136960 1743 -137216 1741 -137472 1739 -137728 1798 -137984 1737 -138240 1846 -138496 1744 -138752 1761 -139008 1755 -139264 1837 -139520 1776 -139776 1749 -140032 1832 -140288 1777 -140544 1792 -140800 1839 -141056 1777 -141312 1830 -141568 1787 -141824 1793 -142080 1798 -142336 1779 -142592 1806 -142848 1856 -143104 1804 -143360 1793 -143616 1798 -143872 1810 -144128 1805 -144384 1820 -144640 1808 -144896 1823 -145152 1812 -145408 1810 -145664 1840 -145920 1829 -146176 1826 -146432 1931 -146688 1889 -146944 1892 -147200 1816 -147456 1832 -147712 1873 -147968 1831 -148224 1836 -148480 1856 -148736 1846 -148992 1851 -149248 1902 -149504 1842 -149760 1846 -150016 1849 -150272 1867 -150528 1909 -150784 1846 -151040 1852 -151296 1859 -151552 1891 -151808 1845 -152064 1895 -152320 1857 -152576 1846 -152832 1929 -153088 1850 -153344 1859 -153600 1923 -153856 1868 -154112 1930 -154368 1867 -154624 1873 -154880 1921 -155136 1881 -155392 1879 -155648 1932 -155904 1874 -156160 1867 -156416 1984 -156672 1882 -156928 1872 -157184 1876 -157440 1948 -157696 1893 -157952 1886 -158208 1892 -158464 1890 -158720 1955 -158976 1893 -159232 1901 -159488 1881 -159744 1971 -160000 1891 -160256 1972 -160512 1904 -160768 1982 -161024 1934 -161280 1924 -161536 1925 -161792 1978 -162048 1915 -162304 1944 -162560 1937 -162816 1933 -163072 1929 -163328 2001 -163584 1934 -163840 1947 -164096 1949 -164352 1947 -164608 2008 -164864 1944 -165120 1964 -165376 1960 -165632 1947 -165888 1953 -166144 1971 -166400 2006 -166656 1964 -166912 1970 -167168 1968 -167424 1963 -167680 2001 -167936 1972 -168192 1989 -168448 1980 -168704 1980 -168960 2002 -169216 2061 -169472 1998 -169728 1991 -169984 2017 -170240 2036 -170496 2083 -170752 2016 -171008 2007 -171264 2009 -171520 2023 -171776 2027 -172032 2024 -172288 2022 -172544 2052 -172800 2031 -173056 2039 -173312 2042 -173568 2101 -173824 2042 -174080 2039 -174336 2045 -174592 2048 -174848 2049 -175104 2065 -175360 2056 -175616 2068 -175872 2073 -176128 2062 -176384 2073 -176640 2072 -176896 2061 -177152 2059 -177408 2093 -177664 2085 -177920 2085 -178176 2149 -178432 2084 -178688 2068 -178944 2124 -179200 2074 -179456 2088 -179712 2140 -179968 2088 -180224 2138 -180480 2088 -180736 2094 -180992 2069 -181248 2065 -181504 2084 -181760 2080 -182016 2058 -182272 2078 -182528 2069 -182784 2067 -183040 2084 -183296 2082 -183552 2079 -183808 2075 -184064 2081 -184320 2076 -184576 2092 -184832 2085 -185088 2163 -185344 2083 -185600 2092 -185856 2094 -186112 2091 -186368 2105 -186624 2080 -186880 2115 -187136 2093 -187392 2084 -187648 2170 -187904 2106 -188160 2096 -188416 2116 -188672 2117 -188928 2105 -189184 2109 -189440 2122 -189696 2121 -189952 2103 -190208 2107 -190464 2123 -190720 2123 -190976 2115 -191232 2137 -191488 2129 -191744 2136 -192000 2125 -192256 2135 -192512 2130 -192768 2134 -193024 2141 -193280 2135 -193536 2156 -193792 2142 -194048 2148 -194304 2163 -194560 2154 -194816 2156 -195072 2171 -195328 2233 -195584 2186 -195840 2179 -196096 2171 -196352 2190 -196608 2201 -196864 2216 -197120 2219 -197376 2203 -197632 2211 -197888 2198 -198144 2219 -198400 2222 -198656 2239 -198912 2235 -199168 2224 -199424 2234 -199680 2229 -199936 2218 -200192 2236 -200448 2268 -200704 2284 -200960 2240 -201216 2282 -201472 2252 -201728 2269 -201984 2277 -202240 2264 -202496 2277 -202752 2278 -203008 2279 -203264 2262 -203520 2286 -203776 2299 -204032 2283 -204288 2294 -204544 2283 -204800 2278 -205056 2299 -205312 2298 -205568 2317 -205824 2298 -206080 2311 -206336 2286 -206592 2300 -206848 2306 -207104 2301 -207360 2367 -207616 2308 -207872 2312 -208128 2305 -208384 2327 -208640 2307 -208896 2324 -209152 2312 -209408 2315 -209664 2331 -209920 2317 -210176 2409 -210432 2321 -210688 2322 -210944 2319 -211200 2322 -211456 2319 -211712 2336 -211968 2331 -212224 2323 -212480 2322 -212736 2345 -212992 2334 -213248 2335 -213504 2339 -213760 2344 -214016 2324 -214272 2328 -214528 2343 -214784 2326 -215040 2343 -215296 2345 -215552 2333 -215808 2341 -216064 2353 -216320 2341 -216576 2340 -216832 2346 -217088 2354 -217344 2344 -217600 2351 -217856 2344 -218112 2353 -218368 2350 -218624 2347 -218880 2359 -219136 2360 -219392 2361 -219648 2365 -219904 2359 -220160 2366 -220416 2372 -220672 2369 -220928 2359 -221184 2386 -221440 2389 -221696 2379 -221952 2384 -222208 2382 -222464 2396 -222720 2394 -222976 2402 -223232 2403 -223488 2407 -223744 2400 -224000 2409 -224256 2421 -224512 2427 -224768 2430 -225024 2405 -225280 2420 -225536 2435 -225792 2487 -226048 2449 -226304 2457 -226560 2544 -226816 2462 -227072 2440 -227328 2469 -227584 2456 -227840 2456 -228096 2472 -228352 2483 -228608 2478 -228864 2476 -229120 2473 -229376 2484 -229632 2483 -229888 2495 -230144 2496 -230400 2499 -230656 2505 -230912 2513 -231168 2505 -231424 2510 -231680 2516 -231936 2521 -232192 2509 -232448 2522 -232704 2531 -232960 2509 -233216 2525 -233472 2524 -233728 2525 -233984 2528 -234240 2520 -234496 2547 -234752 2534 -235008 2544 -235264 2532 -235520 2545 -235776 2549 -236032 2537 -236288 2554 -236544 2537 -236800 2539 -237056 2546 -237312 2550 -237568 2559 -237824 2560 -238080 2553 -238336 2549 -238592 2557 -238848 2557 -239104 2556 -239360 2569 -239616 2563 -239872 2557 -240128 2565 -240384 2567 -240640 2557 -240896 2562 -241152 2563 -241408 2584 -241664 2563 -241920 2582 -242176 2568 -242432 2554 -242688 2571 -242944 2586 -243200 2553 -243456 2574 -243712 2589 -243968 2581 -244224 2586 -244480 2581 -244736 2585 -244992 2583 -245248 2595 -245504 2575 -245760 2601 -246016 2606 -246272 2569 -246528 2564 -246784 2565 -247040 2567 -247296 2577 -247552 2584 -247808 2585 -248064 2649 -248320 2590 -248576 2574 -248832 2578 -249088 2592 -249344 2600 -249600 2598 -249856 2612 -250112 2599 -250368 2603 -250624 2602 -250880 2601 -251136 2614 -251392 2620 -251648 2619 -251904 2618 -252160 2636 -252416 2624 -252672 2633 -252928 2619 -253184 2631 -253440 2633 -253696 2647 -253952 2662 -254208 2662 -254464 2668 -254720 2668 -254976 2659 -255232 2681 -255488 2678 -255744 2684 -256000 2691 -256256 2712 -256512 2702 -256768 2693 -257024 2693 -257280 2712 -257536 2709 -257792 2712 -258048 2709 -258304 2723 -258560 2720 -258816 2717 -259072 2734 -259328 2728 -259584 2728 -259840 2739 -260096 2742 -260352 2739 -260608 2747 -260864 2751 -261120 2746 -261376 2742 -261632 2740 -261888 2757 -262144 2754 -262656 2768 -263168 2764 -263680 2773 -264192 2765 -264704 2773 -265216 2779 -265728 2788 -266240 2778 -266752 2788 -267264 2796 -267776 2791 -268288 2800 -268800 2814 -269312 2805 -269824 2808 -270336 2821 -270848 2805 -271360 2813 -271872 2812 -272384 2808 -272896 2816 -273408 2819 -273920 2832 -274432 2842 -274944 2829 -275456 2844 -275968 2850 -276480 2858 -276992 2857 -277504 2862 -278016 2871 -278528 2873 -279040 2883 -279552 2892 -280064 2891 -280576 2890 -281088 2914 -281600 2965 -282112 2929 -282624 2910 -283136 2912 -283648 2924 -284160 2927 -284672 2935 -285184 2945 -285696 2957 -286208 2965 -286720 2966 -287232 2983 -287744 2989 -288256 2979 -288768 2982 -289280 2976 -289792 2991 -290304 3011 -290816 3017 -291328 3018 -291840 3029 -292352 3027 -292864 3014 -293376 3018 -293888 3033 -294400 3025 -294912 3022 -295424 3028 -295936 3064 -296448 3033 -296960 3035 -297472 3037 -297984 3039 -298496 3058 -299008 3037 -299520 3064 -300032 3094 -300544 3065 -301056 3070 -301568 3076 -302080 3060 -302592 3076 -303104 3077 -303616 3076 -304128 3091 -304640 3085 -305152 3092 -305664 3100 -306176 3090 -306688 3113 -307200 3119 -307712 3110 -308224 3133 -308736 3118 -309248 3121 -309760 3152 -310272 3140 -310784 3135 -311296 3140 -311808 3143 -312320 3150 -312832 3149 -313344 3136 -313856 3154 -314368 3166 -314880 3177 -315392 3180 -315904 3192 -316416 3190 -316928 3205 -317440 3212 -317952 3219 -318464 3221 -318976 3217 -319488 3229 -320000 3235 -320512 3239 -321024 3251 -321536 3236 -322048 3239 -322560 3360 -323072 3269 -323584 3252 -324096 3257 -324608 3337 -325120 3280 -325632 3277 -326144 3274 -326656 3310 -327168 3289 -327680 3294 -328192 3299 -328704 3293 -329216 3396 -329728 3299 -330240 3317 -330752 3360 -331264 3320 -331776 3333 -332288 3335 -332800 3327 -333312 3328 -333824 3352 -334336 3353 -334848 3388 -335360 3361 -335872 3354 -336384 3357 -336896 3373 -337408 3423 -337920 3391 -338432 3407 -338944 3409 -339456 3413 -339968 3407 -340480 3402 -340992 3515 -341504 3404 -342016 3425 -342528 3444 -343040 3437 -343552 3435 -344064 3463 -344576 3446 -345088 3481 -345600 3560 -346112 3488 -346624 3484 -347136 3468 -347648 3502 -348160 3485 -348672 3475 -349184 3503 -349696 3498 -350208 3557 -350720 3493 -351232 3511 -351744 3549 -352256 3519 -352768 3499 -353280 3527 -353792 3523 -354304 3568 -354816 3526 -355328 3574 -355840 3648 -356352 3556 -356864 3571 -357376 3614 -357888 3582 -358400 3574 -358912 3543 -359424 3562 -359936 3603 -360448 3595 -360960 3577 -361472 3565 -361984 3600 -362496 3570 -363008 3601 -363520 3590 -364032 3589 -364544 3613 -365056 3668 -365568 3611 -366080 3619 -366592 3626 -367104 3641 -367616 3620 -368128 3654 -368640 3672 -369152 3652 -369664 3675 -370176 3691 -370688 3719 -371200 3671 -371712 3747 -372224 3697 -372736 3679 -373248 3692 -373760 3735 -374272 3750 -374784 3714 -375296 3787 -375808 3711 -376320 3714 -376832 3735 -377344 3746 -377856 3739 -378368 3719 -378880 3741 -379392 3779 -379904 3809 -380416 3768 -380928 3811 -381440 3777 -381952 3763 -382464 3835 -382976 3780 -383488 3780 -384000 3873 -384512 3785 -385024 3785 -385536 3823 -386048 3784 -386560 3796 -387072 3823 -387584 3827 -388096 3824 -388608 3900 -389120 3822 -389632 3886 -390144 3880 -390656 3830 -391168 3928 -391680 3857 -392192 3854 -392704 3943 -393216 3897 -393728 3867 -394240 3850 -394752 3912 -395264 3969 -395776 3880 -396288 3877 -396800 3866 -397312 3889 -397824 3903 -398336 3922 -398848 3935 -399360 3917 -399872 3919 -400384 3941 -400896 3938 -401408 3935 -401920 3936 -402432 3991 -402944 3929 -403456 4009 -403968 4012 -404480 3963 -404992 4051 -405504 3991 -406016 4029 -406528 3987 -407040 4075 -407552 4063 -408064 4041 -408576 4026 -409088 4079 -409600 4005 -410112 4002 -410624 4025 -411136 4006 -411648 4062 -412160 4019 -412672 4037 -413184 4008 -413696 4042 -414208 4047 -414720 4051 -415232 4110 -415744 4088 -416256 4094 -416768 4112 -417280 4155 -417792 4156 -418304 4077 -418816 4140 -419328 4063 -419840 4093 -420352 4114 -420864 4140 -421376 4148 -421888 4116 -422400 4094 -422912 4117 -423424 4087 -423936 4115 -424448 4141 -424960 4122 -425472 4143 -425984 4161 -426496 4141 -427008 4250 -427520 4203 -428032 4191 -428544 4153 -429056 4179 -429568 4264 -430080 4168 -430592 4189 -431104 4217 -431616 4217 -432128 4258 -432640 4193 -433152 4228 -433664 4224 -434176 4210 -434688 4296 -435200 4226 -435712 4293 -436224 4235 -436736 4390 -437248 4369 -437760 4275 -438272 4279 -438784 4281 -439296 4308 -439808 4285 -440320 4272 -440832 4353 -441344 4329 -441856 4307 -442368 4276 -442880 4308 -443392 4289 -443904 4293 -444416 4303 -444928 4300 -445440 4366 -445952 4312 -446464 4399 -446976 4304 -447488 4405 -448000 4355 -448512 4330 -449024 4332 -449536 4408 -450048 4334 -450560 4415 -451072 4360 -451584 4363 -452096 4401 -452608 4342 -453120 4359 -453632 4506 -454144 4385 -454656 4446 -455168 4374 -455680 4451 -456192 4468 -456704 4416 -457216 4400 -457728 4403 -458240 4403 -458752 4402 -459264 4411 -459776 4409 -460288 4428 -460800 4416 -461312 4492 -461824 4432 -462336 4461 -462848 4459 -463360 4451 -463872 4480 -464384 4481 -464896 4559 -465408 4569 -465920 4469 -466432 4498 -466944 4485 -467456 4502 -467968 4481 -468480 4564 -468992 4498 -469504 4530 -470016 4531 -470528 4511 -471040 4582 -471552 4508 -472064 4563 -472576 4537 -473088 4533 -473600 4611 -474112 4530 -474624 4578 -475136 4581 -475648 4554 -476160 4548 -476672 4547 -477184 4643 -477696 4598 -478208 4571 -478720 4626 -479232 4668 -479744 4572 -480256 4610 -480768 4598 -481280 4612 -481792 4676 -482304 4614 -482816 4693 -483328 4697 -483840 4626 -484352 4620 -484864 4645 -485376 4699 -485888 4663 -486400 4653 -486912 4640 -487424 4795 -487936 4687 -488448 4703 -488960 4710 -489472 4698 -489984 4790 -490496 4708 -491008 4748 -491520 4683 -492032 4771 -492544 4782 -493056 4799 -493568 4753 -494080 4741 -494592 4709 -495104 4726 -495616 4713 -496128 4735 -496640 4781 -497152 4788 -497664 4770 -498176 4763 -498688 4799 -499200 4764 -499712 4814 -500224 4824 -500736 4765 -501248 4835 -501760 4787 -502272 4862 -502784 4894 -503296 4855 -503808 4813 -504320 4826 -504832 4817 -505344 4810 -505856 4800 -506368 4888 -506880 4806 -507392 4814 -507904 4875 -508416 4842 -508928 4895 -509440 4876 -509952 4828 -510464 4911 -510976 4908 -511488 4908 -512000 4888 -512512 4881 -513024 4862 -513536 4889 -514048 4925 -514560 4880 -515072 4927 -515584 4874 -516096 4891 -516608 4950 -517120 4975 -517632 4906 -518144 4968 -518656 4944 -519168 4946 -519680 4925 -520192 4917 -520704 4964 -521216 5071 -521728 5075 -522240 5015 -522752 5026 -523264 5012 -523776 4997 -524288 4981 -525312 5057 -526336 4977 -527360 4990 -528384 5117 -529408 5119 -530432 5079 -531456 5086 -532480 5128 -533504 5029 -534528 5157 -535552 5060 -536576 5054 -537600 5049 -538624 5079 -539648 5093 -540672 5132 -541696 5146 -542720 5117 -543744 5128 -544768 5169 -545792 5181 -546816 5171 -547840 5296 -548864 5163 -549888 5211 -550912 5240 -551936 5208 -552960 5407 -553984 5274 -555008 5300 -556032 5382 -557056 5325 -558080 5242 -559104 5310 -560128 5295 -561152 5369 -562176 5294 -563200 5313 -564224 5315 -565248 5310 -566272 5326 -567296 5377 -568320 5376 -569344 5452 -570368 5340 -571392 5413 -572416 5478 -573440 5441 -574464 5477 -575488 5435 -576512 5469 -577536 5476 -578560 5496 -579584 5498 -580608 5531 -581632 5451 -582656 5485 -583680 5559 -584704 5487 -585728 5536 -586752 5572 -587776 5557 -588800 5512 -589824 5559 -590848 5581 -591872 5534 -592896 5714 -593920 5768 -594944 6079 -595968 5834 -596992 5649 -598016 5585 -599040 5638 -600064 5668 -601088 5621 -602112 5645 -603136 5698 -604160 5646 -605184 5676 -606208 5697 -607232 5683 -608256 5774 -609280 5773 -610304 5828 -611328 5792 -612352 5868 -613376 5794 -614400 5781 -615424 5808 -616448 5811 -617472 5814 -618496 5799 -619520 5818 -620544 5876 -621568 5862 -622592 5788 -623616 5935 -624640 5899 -625664 5921 -626688 5895 -627712 5841 -628736 5864 -629760 6007 -630784 5937 -631808 5892 -632832 5983 -633856 5906 -634880 6000 -635904 6005 -636928 5995 -637952 6018 -638976 6042 -640000 5948 -641024 6030 -642048 6051 -643072 6053 -644096 5970 -645120 5991 -646144 6129 -647168 6057 -648192 6173 -649216 6088 -650240 6092 -651264 6037 -652288 6026 -653312 6208 -654336 6090 -655360 6174 -656384 6140 -657408 6124 -658432 6106 -659456 6114 -660480 6114 -661504 6183 -662528 6204 -663552 6257 -664576 6276 -665600 6139 -666624 6243 -667648 6217 -668672 6315 -669696 6280 -670720 6201 -671744 6294 -672768 6294 -673792 6382 -674816 6267 -675840 6303 -676864 6245 -677888 6285 -678912 6279 -679936 6318 -680960 6370 -681984 6371 -683008 6305 -684032 6325 -685056 6300 -686080 6379 -687104 6402 -688128 6456 -689152 6421 -690176 6408 -691200 6367 -692224 6454 -693248 6386 -694272 6385 -695296 6512 -696320 6477 -697344 6444 -698368 6524 -699392 6545 -700416 6665 -701440 6561 -702464 6567 -703488 6595 -704512 6569 -705536 6568 -706560 6595 -707584 6516 -708608 6614 -709632 6599 -710656 6627 -711680 6660 -712704 6642 -713728 6581 -714752 6688 -715776 6675 -716800 6677 -717824 6733 -718848 6614 -719872 6796 -720896 6697 -721920 6747 -722944 6775 -723968 6838 -724992 6770 -726016 6775 -727040 6720 -728064 6789 -729088 6869 -730112 6782 -731136 6785 -732160 6826 -733184 6775 -734208 6846 -735232 6829 -736256 6852 -737280 6949 -738304 6820 -739328 6786 -740352 6881 -741376 6906 -742400 6802 -743424 6864 -744448 6816 -745472 6859 -746496 6902 -747520 6839 -748544 6924 -749568 6969 -750592 6960 -751616 6970 -752640 6953 -753664 6898 -754688 6902 -755712 6930 -756736 6926 -757760 6981 -758784 7012 -759808 7089 -760832 7108 -761856 7017 -762880 7071 -763904 7065 -764928 7063 -765952 7143 -766976 7113 -768000 7131 -769024 7114 -770048 7053 -771072 7097 -772096 7143 -773120 7092 -774144 7088 -775168 7117 -776192 7140 -777216 7117 -778240 7222 -779264 7209 -780288 7221 -781312 7172 -782336 7336 -783360 7239 -784384 7265 -785408 7261 -786432 7332 -787456 7277 -788480 7211 -789504 7350 -790528 7319 -791552 7237 -792576 7289 -793600 7266 -794624 7342 -795648 7337 -796672 7348 -797696 7447 -798720 7367 -799744 7319 -800768 7321 -801792 7342 -802816 7339 -803840 7417 -804864 7346 -805888 7434 -806912 7385 -807936 7500 -808960 7389 -809984 7477 -811008 7484 -812032 7503 -813056 7499 -814080 7433 -815104 7577 -816128 7538 -817152 7549 -818176 7579 -819200 7535 -820224 7580 -821248 7500 -822272 7557 -823296 7610 -824320 7569 -825344 7538 -826368 7549 -827392 7558 -828416 7546 -829440 7674 -830464 7653 -831488 7633 -832512 7665 -833536 7651 -834560 7641 -835584 7695 -836608 7675 -837632 7622 -838656 7692 -839680 7721 -840704 7734 -841728 7702 -842752 7650 -843776 7683 -844800 7724 -845824 7853 -846848 7689 -847872 7718 -848896 7773 -849920 7781 -850944 7791 -851968 7822 -852992 7868 -854016 7833 -855040 7753 -856064 7791 -857088 7875 -858112 7811 -859136 7776 -860160 7855 -861184 7798 -862208 7918 -863232 7846 -864256 7928 -865280 8029 -866304 7870 -867328 7996 -868352 7878 -869376 7874 -870400 7981 -871424 7975 -872448 7918 -873472 7997 -874496 7942 -875520 7953 -876544 8077 -877568 7981 -878592 8030 -879616 8048 -880640 8078 -881664 8105 -882688 8133 -883712 8025 -884736 8176 -885760 8036 -886784 8111 -887808 8136 -888832 8104 -889856 8210 -890880 8178 -891904 8107 -892928 8249 -893952 8192 -894976 8209 -896000 8115 -897024 8127 -898048 8143 -899072 8229 -900096 8259 -901120 8246 -902144 8222 -903168 8329 -904192 8276 -905216 8183 -906240 8307 -907264 8208 -908288 8279 -909312 8220 -910336 8335 -911360 8281 -912384 8250 -913408 8250 -914432 8275 -915456 8267 -916480 8423 -917504 8285 -918528 8282 -919552 8325 -920576 8340 -921600 8411 -922624 8467 -923648 8423 -924672 8379 -925696 8403 -926720 8454 -927744 8369 -928768 8379 -929792 8543 -930816 8396 -931840 8455 -932864 8409 -933888 8503 -934912 8435 -935936 8543 -936960 8455 -937984 8480 -939008 8469 -940032 8594 -941056 8493 -942080 8689 -943104 8512 -944128 8509 -945152 8524 -946176 8553 -947200 8541 -948224 8542 -949248 8554 -950272 8561 -951296 8584 -952320 8583 -953344 8593 -954368 8600 -955392 8622 -956416 8616 -957440 8721 -958464 8649 -959488 8637 -960512 8654 -961536 8669 -962560 8688 -963584 8690 -964608 8715 -965632 8813 -966656 8763 -967680 8829 -968704 8801 -969728 8754 -970752 8778 -971776 8802 -972800 8769 -973824 8792 -974848 8802 -975872 8808 -976896 8909 -977920 8848 -978944 8841 -979968 8953 -980992 8902 -982016 8865 -983040 8878 -984064 8885 -985088 8888 -986112 8897 -987136 8914 -988160 8960 -989184 8922 -990208 8937 -991232 8943 -992256 8986 -993280 8982 -994304 8984 -995328 8976 -996352 8976 -997376 8995 -998400 9005 -999424 9006 -1000448 9021 -1001472 9019 -1002496 9055 -1003520 9059 -1004544 9062 -1005568 9069 -1006592 9127 -1007616 9073 -1008640 9146 -1009664 9084 -1010688 9097 -1011712 9098 -1012736 9101 -1013760 9124 -1014784 9123 -1015808 9129 -1016832 9135 -1017856 9238 -1018880 9204 -1019904 9173 -1020928 9219 -1021952 9192 -1022976 9204 -1024000 9262 -1025024 9220 -1026048 9257 -1027072 9271 -1028096 9332 -1029120 9270 -1030144 9269 -1031168 9380 -1032192 9341 -1033216 9294 -1034240 9334 -1035264 9385 -1036288 9343 -1037312 9363 -1038336 9411 -1039360 9336 -1040384 9363 -1041408 9413 -1042432 9377 -1043456 9356 -1044480 9417 -1045504 9414 -1046528 9392 -1047552 9444 -1048576 9497 -1050624 9501 -1052672 9456 -1054720 9487 -1056768 9553 -1058816 9524 -1060864 9609 -1062912 9643 -1064960 9658 -1067008 9673 -1069056 9597 -1071104 9651 -1073152 9649 -1075200 9663 -1077248 9750 -1079296 9728 -1081344 9819 -1083392 9813 -1085440 9830 -1087488 9823 -1089536 9792 -1091584 9881 -1093632 9793 -1095680 9875 -1097728 9830 -1099776 9927 -1101824 9920 -1103872 9975 -1105920 9888 -1107968 10016 -1110016 9945 -1112064 10008 -1114112 10061 -1116160 9981 -1118208 9999 -1120256 10028 -1122304 10055 -1124352 10140 -1126400 10070 -1128448 10092 -1130496 10116 -1132544 10129 -1134592 10139 -1136640 10168 -1138688 10275 -1140736 10201 -1142784 10311 -1144832 10249 -1146880 10268 -1148928 10295 -1150976 10381 -1153024 10326 -1155072 10332 -1157120 10360 -1159168 10447 -1161216 10375 -1163264 10403 -1165312 10424 -1167360 10434 -1169408 10450 -1171456 10460 -1173504 10574 -1175552 10490 -1177600 10500 -1179648 10529 -1181696 10547 -1183744 10553 -1185792 10580 -1187840 10586 -1189888 10597 -1191936 10625 -1193984 10632 -1196032 10649 -1198080 10679 -1200128 10697 -1202176 10715 -1204224 10735 -1206272 10754 -1208320 10758 -1210368 10769 -1212416 10803 -1214464 10819 -1216512 10828 -1218560 10836 -1220608 10878 -1222656 10879 -1224704 10907 -1226752 10934 -1228800 10964 -1230848 10980 -1232896 10996 -1234944 11025 -1236992 11036 -1239040 11055 -1241088 11072 -1243136 11081 -1245184 11101 -1247232 11131 -1249280 11143 -1251328 11172 -1253376 11183 -1255424 11189 -1257472 11210 -1259520 11217 -1261568 11233 -1263616 11241 -1265664 11292 -1267712 11280 -1269760 11301 -1271808 11311 -1273856 11322 -1275904 11338 -1277952 11385 -1280000 11387 -1282048 11402 -1284096 11419 -1286144 11418 -1288192 11462 -1290240 11477 -1292288 11509 -1294336 11528 -1296384 11550 -1298432 11669 -1300480 11565 -1302528 11574 -1304576 11586 -1306624 11613 -1308672 11646 -1310720 11652 -1312768 11676 -1314816 11700 -1316864 11786 -1318912 11739 -1320960 11742 -1323008 11771 -1325056 11782 -1327104 11805 -1329152 11825 -1331200 11829 -1333248 11876 -1335296 11876 -1337344 11884 -1339392 11938 -1341440 11934 -1343488 11938 -1345536 11950 -1347584 11981 -1349632 12002 -1351680 12012 -1353728 12026 -1355776 12047 -1357824 12068 -1359872 12069 -1361920 12118 -1363968 12116 -1366016 12161 -1368064 12142 -1370112 12159 -1372160 12174 -1374208 12316 -1376256 12230 -1378304 12312 -1380352 12329 -1382400 12262 -1384448 12307 -1386496 12339 -1388544 12315 -1390592 12373 -1392640 12442 -1394688 12346 -1396736 12440 -1398784 12459 -1400832 12451 -1402880 12531 -1404928 12461 -1406976 12465 -1409024 12560 -1411072 12530 -1413120 12542 -1415168 12550 -1417216 12672 -1419264 12634 -1421312 12655 -1423360 12715 -1425408 12736 -1427456 12758 -1429504 12673 -1431552 12773 -1433600 12760 -1435648 12732 -1437696 12825 -1439744 12785 -1441792 12770 -1443840 12791 -1445888 12843 -1447936 12823 -1449984 12892 -1452032 12889 -1454080 12953 -1456128 12936 -1458176 13531 -1460224 12912 -1462272 13011 -1464320 13012 -1466368 13054 -1468416 12992 -1470464 13056 -1472512 13066 -1474560 13048 -1476608 13143 -1478656 13058 -1480704 13082 -1482752 13101 -1484800 13159 -1486848 13138 -1488896 13221 -1490944 13176 -1492992 13208 -1495040 13225 -1497088 13252 -1499136 13360 -1501184 13284 -1503232 13307 -1505280 13385 -1507328 13451 -1509376 13352 -1511424 13388 -1513472 13385 -1515520 13415 -1517568 13540 -1519616 13448 -1521664 13447 -1523712 13468 -1525760 13490 -1527808 13606 -1529856 13556 -1531904 13535 -1533952 13558 -1536000 13558 -1538048 13571 -1540096 13613 -1542144 13605 -1544192 13637 -1546240 13646 -1548288 13654 -1550336 13684 -1552384 13701 -1554432 13724 -1556480 13745 -1558528 13760 -1560576 13773 -1562624 13801 -1564672 13810 -1566720 13815 -1568768 13842 -1570816 13885 -1572864 13901 -1574912 13895 -1576960 13993 -1579008 13931 -1581056 13970 -1583104 13990 -1585152 14002 -1587200 14023 -1589248 14035 -1591296 14150 -1593344 14110 -1595392 14132 -1597440 14193 -1599488 14220 -1601536 14155 -1603584 14199 -1605632 14175 -1607680 14229 -1609728 14211 -1611776 14222 -1613824 14240 -1615872 14263 -1617920 14284 -1619968 14294 -1622016 14293 -1624064 14306 -1626112 14352 -1628160 14337 -1630208 14362 -1632256 14382 -1634304 14384 -1636352 14425 -1638400 14420 -1640448 14460 -1642496 14470 -1644544 14552 -1646592 14498 -1648640 14522 -1650688 14532 -1652736 14572 -1654784 14577 -1656832 14589 -1658880 14649 -1660928 14632 -1662976 14757 -1665024 14763 -1667072 14737 -1669120 14715 -1671168 14849 -1673216 14759 -1675264 14791 -1677312 14812 -1679360 14803 -1681408 14885 -1683456 14837 -1685504 14980 -1687552 14958 -1689600 14905 -1691648 14958 -1693696 14962 -1695744 14953 -1697792 14961 -1699840 14968 -1701888 14990 -1703936 15125 -1705984 15062 -1708032 15060 -1710080 15039 -1712128 15120 -1714176 15193 -1716224 15234 -1718272 15166 -1720320 15179 -1722368 15274 -1724416 15216 -1726464 15241 -1728512 15303 -1730560 15287 -1732608 15372 -1734656 15310 -1736704 15284 -1738752 15364 -1740800 15357 -1742848 15337 -1744896 15420 -1746944 15460 -1748992 15521 -1751040 15518 -1753088 15560 -1755136 15452 -1757184 15456 -1759232 15567 -1761280 15497 -1763328 15607 -1765376 15619 -1767424 15680 -1769472 15642 -1771520 15590 -1773568 15675 -1775616 15716 -1777664 15761 -1779712 15777 -1781760 15795 -1783808 15825 -1785856 15819 -1787904 15798 -1789952 15855 -1792000 15803 -1794048 15862 -1796096 15776 -1798144 15909 -1800192 15871 -1802240 15857 -1804288 15840 -1806336 15848 -1808384 15951 -1810432 15904 -1812480 15920 -1814528 16019 -1816576 15958 -1818624 16075 -1820672 15989 -1822720 16010 -1824768 16032 -1826816 16031 -1828864 16062 -1830912 16063 -1832960 16242 -1835008 16175 -1837056 16134 -1839104 16313 -1841152 16150 -1843200 16191 -1845248 16368 -1847296 16221 -1849344 16359 -1851392 16273 -1853440 16285 -1855488 16299 -1857536 16322 -1859584 16334 -1861632 16360 -1863680 16376 -1865728 16391 -1867776 16398 -1869824 16433 -1871872 16458 -1873920 16466 -1875968 16482 -1878016 16498 -1880064 16498 -1882112 16517 -1884160 16536 -1886208 16535 -1888256 16575 -1890304 16594 -1892352 16592 -1894400 16618 -1896448 16633 -1898496 16662 -1900544 16674 -1902592 16676 -1904640 16703 -1906688 16708 -1908736 16738 -1910784 16750 -1912832 16768 -1914880 16787 -1916928 16813 -1918976 16805 -1921024 16843 -1923072 16855 -1925120 16876 -1927168 16890 -1929216 16903 -1931264 16932 -1933312 16949 -1935360 16960 -1937408 16996 -1939456 17016 -1941504 17042 -1943552 17061 -1945600 17085 -1947648 17102 -1949696 17112 -1951744 17134 -1953792 17138 -1955840 17155 -1957888 17174 -1959936 17192 -1961984 17209 -1964032 17220 -1966080 17245 -1968128 17266 -1970176 17292 -1972224 17297 -1974272 17310 -1976320 17315 -1978368 17323 -1980416 17347 -1982464 17362 -1984512 17400 -1986560 17412 -1988608 17427 -1990656 17423 -1992704 17451 -1994752 17476 -1996800 17527 -1998848 17549 -2000896 17522 -2002944 17537 -2004992 17571 -2007040 17590 -2009088 17596 -2011136 17685 -2013184 17652 -2015232 17652 -2017280 17660 -2019328 17709 -2021376 17750 -2023424 17726 -2025472 17758 -2027520 17792 -2029568 17792 -2031616 17862 -2033664 17881 -2035712 17843 -2037760 17863 -2039808 17909 -2041856 17922 -2043904 17963 -2045952 17982 -2048000 17964 -2050048 17954 -2052096 17982 -2054144 17996 -2056192 18006 -2058240 18085 -2060288 18087 -2062336 18141 -2064384 18061 -2066432 18081 -2068480 18079 -2070528 18220 -2072576 18193 -2074624 18205 -2076672 18184 -2078720 18283 -2080768 18288 -2082816 18224 -2084864 18316 -2086912 18319 -2088960 18280 -2091008 18310 -2093056 18307 -2095104 18429 -2097152 18422 -2101248 18392 -2105344 18478 -2109440 18458 -2113536 18517 -2117632 18554 -2121728 18587 -2125824 18691 -2129920 18648 -2134016 18840 -2138112 18724 -2142208 18819 -2146304 18804 -2150400 18896 -2154496 18904 -2158592 18879 -2162688 18922 -2166784 18939 -2170880 18979 -2174976 19076 -2179072 19136 -2183168 19066 -2187264 19153 -2191360 19264 -2195456 19223 -2199552 19247 -2203648 19274 -2207744 19314 -2211840 19344 -2215936 19378 -2220032 19425 -2224128 19491 -2228224 19469 -2232320 19507 -2236416 19551 -2240512 19577 -2244608 19633 -2248704 19634 -2252800 19685 -2256896 19723 -2260992 19759 -2265088 19774 -2269184 19847 -2273280 19861 -2277376 19957 -2281472 19930 -2285568 20058 -2289664 20033 -2293760 20039 -2297856 20148 -2301952 20202 -2306048 20179 -2310144 20190 -2314240 20211 -2318336 20245 -2322432 20273 -2326528 20376 -2330624 20433 -2334720 20451 -2338816 20401 -2342912 20474 -2347008 20475 -2351104 20582 -2355200 20537 -2359296 20587 -2363392 20661 -2367488 20730 -2371584 20765 -2375680 20863 -2379776 20782 -2383872 20882 -2387968 20994 -2392064 20901 -2396160 20945 -2400256 20947 -2404352 21040 -2408448 21035 -2412544 21101 -2416640 21159 -2420736 21201 -2424832 21165 -2428928 21219 -2433024 21231 -2437120 21346 -2441216 21331 -2445312 21327 -2449408 21368 -2453504 21583 -2457600 21468 -2461696 21622 -2465792 21549 -2469888 21604 -2473984 21664 -2478080 21648 -2482176 21640 -2486272 21707 -2490368 21722 -2494464 21878 -2498560 21841 -2502656 21820 -2506752 21871 -2510848 21908 -2514944 21966 -2519040 21952 -2523136 22027 -2527232 22014 -2531328 22132 -2535424 22083 -2539520 22126 -2543616 22172 -2547712 22224 -2551808 22259 -2555904 22339 -2560000 22404 -2564096 22338 -2568192 22379 -2572288 22466 -2576384 22437 -2580480 22495 -2584576 22515 -2588672 22551 -2592768 22579 -2596864 22599 -2600960 22672 -2605056 22683 -2609152 22728 -2613248 22812 -2617344 22772 -2621440 22804 -2625536 22873 -2629632 22876 -2633728 22931 -2637824 22966 -2641920 22992 -2646016 23031 -2650112 23143 -2654208 23112 -2658304 23156 -2662400 23181 -2666496 23216 -2670592 23310 -2674688 23399 -2678784 23419 -2682880 23432 -2686976 23466 -2691072 23389 -2695168 23469 -2699264 23486 -2703360 23528 -2707456 23561 -2711552 23590 -2715648 23613 -2719744 23650 -2723840 23724 -2727936 23818 -2732032 23785 -2736128 23805 -2740224 23972 -2744320 23883 -2748416 23951 -2752512 23987 -2756608 24052 -2760704 24046 -2764800 24047 -2768896 24153 -2772992 24137 -2777088 24151 -2781184 24275 -2785280 24208 -2789376 24352 -2793472 24297 -2797568 24389 -2801664 24358 -2805760 24408 -2809856 24556 -2813952 24535 -2818048 24554 -2822144 24611 -2826240 24580 -2830336 24644 -2834432 24676 -2838528 24769 -2842624 24787 -2846720 24805 -2850816 24778 -2854912 24832 -2859008 24929 -2863104 24928 -2867200 25037 -2871296 24939 -2875392 25035 -2879488 25115 -2883584 25048 -2887680 25115 -2891776 25177 -2895872 25156 -2899968 25209 -2904064 25303 -2908160 25335 -2912256 25330 -2916352 26120 -2920448 25459 -2924544 25501 -2928640 25514 -2932736 25508 -2936832 25549 -2940928 25557 -2945024 25649 -2949120 25629 -2953216 25699 -2957312 25788 -2961408 25751 -2965504 25778 -2969600 25866 -2973696 25964 -2977792 25853 -2981888 25972 -2985984 25972 -2990080 25980 -2994176 26013 -2998272 26099 -3002368 26099 -3006464 26186 -3010560 26221 -3014656 26279 -3018752 26300 -3022848 26393 -3026944 26365 -3031040 26451 -3035136 26419 -3039232 26484 -3043328 26384 -3047424 26490 -3051520 26576 -3055616 26600 -3059712 26669 -3063808 26633 -3067904 26710 -3072000 26765 -3076096 26766 -3080192 26820 -3084288 26807 -3088384 26846 -3092480 26976 -3096576 26999 -3100672 27065 -3104768 26957 -3108864 27018 -3112960 27099 -3117056 27131 -3121152 27169 -3125248 27101 -3129344 27227 -3133440 27165 -3137536 27273 -3141632 27329 -3145728 27462 -3149824 27395 -3153920 27337 -3158016 27482 -3162112 27401 -3166208 27571 -3170304 27483 -3174400 27526 -3178496 27567 -3182592 27596 -3186688 27635 -3190784 27657 -3194880 27714 -3198976 27744 -3203072 27770 -3207168 27916 -3211264 27832 -3215360 27969 -3219456 27906 -3223552 27921 -3227648 27972 -3231744 28150 -3235840 28032 -3239936 28208 -3244032 28098 -3248128 28147 -3252224 28185 -3256320 28316 -3260416 28263 -3264512 28357 -3268608 28449 -3272704 28361 -3276800 28413 -3280896 28491 -3284992 28494 -3289088 28508 -3293184 28542 -3297280 28579 -3301376 28682 -3305472 28689 -3309568 28765 -3313664 28697 -3317760 28734 -3321856 28764 -3325952 28910 -3330048 28843 -3334144 28895 -3338240 28970 -3342336 28952 -3346432 29095 -3350528 29037 -3354624 29198 -3358720 29146 -3362816 29262 -3366912 29229 -3371008 29210 -3375104 29242 -3379200 29359 -3383296 29338 -3387392 29422 -3391488 29375 -3395584 29482 -3399680 29576 -3403776 29506 -3407872 29556 -3411968 29626 -3416064 29678 -3420160 29837 -3424256 29745 -3428352 29721 -3432448 29813 -3436544 29847 -3440640 29835 -3444736 29929 -3448832 29955 -3452928 29892 -3457024 30063 -3461120 30043 -3465216 30116 -3469312 30032 -3473408 30062 -3477504 30102 -3481600 30326 -3485696 30148 -3489792 30304 -3493888 30230 -3497984 30408 -3502080 30383 -3506176 30338 -3510272 30496 -3514368 30413 -3518464 30453 -3522560 30486 -3526656 30516 -3530752 30564 -3534848 30642 -3538944 30774 -3543040 30658 -3547136 30696 -3551232 30751 -3555328 30835 -3559424 30786 -3563520 30826 -3567616 30851 -3571712 30897 -3575808 30932 -3579904 30957 -3584000 31000 -3588096 31038 -3592192 31062 -3596288 31100 -3600384 31138 -3604480 31168 -3608576 31206 -3612672 31251 -3616768 31287 -3620864 31332 -3624960 31354 -3629056 31400 -3633152 31613 -3637248 31463 -3641344 31511 -3645440 31530 -3649536 31585 -3653632 31754 -3657728 31627 -3661824 31693 -3665920 31767 -3670016 31727 -3674112 31775 -3678208 31807 -3682304 31836 -3686400 31877 -3690496 31906 -3694592 31983 -3698688 32019 -3702784 32051 -3706880 32118 -3710976 32099 -3715072 32150 -3719168 32153 -3723264 32246 -3727360 32242 -3731456 32272 -3735552 32336 -3739648 32340 -3743744 32378 -3747840 32441 -3751936 32473 -3756032 32476 -3760128 32576 -3764224 32524 -3768320 32566 -3772416 32706 -3776512 32695 -3780608 32672 -3784704 32772 -3788800 32752 -3792896 32786 -3796992 32919 -3801088 32863 -3805184 32961 -3809280 33032 -3813376 32962 -3817472 33026 -3821568 33123 -3825664 33074 -3829760 33216 -3833856 33127 -3837952 33151 -3842048 33208 -3846144 33322 -3850240 33269 -3854336 33301 -3858432 33333 -3862528 33366 -3866624 33401 -3870720 33436 -3874816 33471 -3878912 33515 -3883008 33544 -3887104 33581 -3891200 33619 -3895296 33668 -3899392 33695 -3903488 33733 -3907584 33759 -3911680 33790 -3915776 33855 -3919872 33868 -3923968 33884 -3928064 33920 -3932160 33971 -3936256 33998 -3940352 34038 -3944448 34055 -3948544 34106 -3952640 34145 -3956736 34163 -3960832 34236 -3964928 34269 -3969024 34283 -3973120 34321 -3977216 34350 -3981312 34392 -3985408 34483 -3989504 34469 -3993600 34494 -3997696 34558 -4001792 34564 -4005888 34611 -4009984 34645 -4014080 34681 -4018176 34690 -4022272 34749 -4026368 34759 -4030464 34787 -4034560 34869 -4038656 34913 -4042752 34891 -4046848 34962 -4050944 34996 -4055040 35014 -4059136 35069 -4063232 35179 -4067328 35116 -4071424 35231 -4075520 35264 -4079616 35297 -4083712 35258 -4087808 35371 -4091904 35326 -4096000 35422 -4100096 35463 -4104192 35421 -4108288 35520 -4112384 35550 -4116480 35526 -4120576 35632 -4124672 35634 -4128768 35731 -4132864 35766 -4136960 35717 -4141056 35741 -4145152 35780 -4149248 35834 -4153344 35868 -4157440 35893 -4161536 35932 -4165632 35956 -4169728 36094 -4173824 36030 -4177920 36175 -4182016 36082 -4186112 36226 -4190208 36138 -4194304 36181 -4202496 36269 -4210688 36332 -4218880 36487 -4227072 36555 -4235264 36544 -4243456 36627 -4251648 36708 -4259840 36762 -4268032 36823 -4276224 36908 -4284416 37036 -4292608 37039 -4300800 37088 -4308992 37166 -4317184 37336 -4325376 37330 -4333568 37385 -4341760 37469 -4349952 37537 -4358144 37602 -4366336 37667 -4374528 37763 -4382720 37834 -4390912 37944 -4399104 38028 -4407296 38040 -4415488 38112 -4423680 38167 -4431872 38302 -4440064 38298 -4448256 38376 -4456448 38441 -4464640 38598 -4472832 38576 -4481024 38667 -4489216 38757 -4497408 38786 -4505600 38941 -4513792 39008 -4521984 39005 -4530176 39088 -4538368 39186 -4546560 39317 -4554752 39254 -4562944 39343 -4571136 39397 -4579328 39489 -4587520 39603 -4595712 39647 -4603904 39685 -4612096 39778 -4620288 39966 -4628480 39917 -4636672 40109 -4644864 40114 -4653056 40090 -4661248 40341 -4669440 40316 -4677632 40319 -4685824 40420 -4694016 40456 -4702208 40539 -4710400 40625 -4718592 40646 -4726784 40828 -4734976 40786 -4743168 40940 -4751360 41034 -4759552 41072 -4767744 41126 -4775936 41193 -4784128 41333 -4792320 41324 -4800512 41346 -4808704 41487 -4816896 41525 -4825088 41600 -4833280 41830 -4841472 41748 -4849664 41856 -4857856 41909 -4866048 42064 -4874240 42031 -4882432 42148 -4890624 42171 -4898816 42181 -4907008 42330 -4915200 42434 -4923392 42500 -4931584 42475 -4939776 42627 -4947968 42755 -4956160 42677 -4964352 42826 -4972544 42943 -4980736 42974 -4988928 43017 -4997120 43038 -5005312 43194 -5013504 43282 -5021696 43227 -5029888 43320 -5038080 43376 -5046272 43443 -5054464 43537 -5062656 43606 -5070848 43744 -5079040 43803 -5087232 43855 -5095424 43931 -5103616 44021 -5111808 44198 -5120000 44157 -5128192 44207 -5136384 44307 -5144576 44372 -5152768 44557 -5160960 44414 -5169152 44479 -5177344 44551 -5185536 44790 -5193728 44673 -5201920 44763 -5210112 44844 -5218304 44914 -5226496 44968 -5234688 45244 -5242880 45222 -5251072 45205 -5259264 45299 -5267456 45311 -5275648 45389 -5283840 45463 -5292032 45532 -5300224 45605 -5308416 45751 -5316608 45736 -5324800 45848 -5332992 45878 -5341184 46057 -5349376 46007 -5357568 46092 -5365760 46157 -5373952 46228 -5382144 46309 -5390336 46373 -5398528 46451 -5406720 46507 -5414912 46586 -5423104 46662 -5431296 46781 -5439488 46809 -5447680 46975 -5455872 47039 -5464064 46988 -5472256 47098 -5480448 47214 -5488640 47193 -5496832 47272 -5505024 47447 -5513216 47495 -5521408 47534 -5529600 47550 -5537792 47719 -5545984 47685 -5554176 47764 -5562368 47824 -5570560 47899 -5578752 47958 -5586944 48036 -5595136 48115 -5603328 48171 -5611520 48323 -5619712 48306 -5627904 48381 -5636096 48512 -5644288 48534 -5652480 48588 -5660672 48681 -5668864 48740 -5677056 48800 -5685248 48893 -5693440 48971 -5701632 49021 -5709824 49080 -5718016 49226 -5726208 49220 -5734400 49298 -5742592 49370 -5750784 49435 -5758976 49503 -5767168 49619 -5775360 49646 -5783552 49836 -5791744 49871 -5799936 49869 -5808128 49915 -5816320 50040 -5824512 50099 -5832704 50154 -5840896 50229 -5849088 50275 -5857280 50374 -5865472 50494 -5873664 50581 -5881856 50609 -5890048 50671 -5898240 50747 -5906432 50956 -5914624 50933 -5922816 50957 -5931008 51067 -5939200 51193 -5947392 51219 -5955584 51261 -5963776 51268 -5971968 51311 -5980160 51587 -5988352 51564 -5996544 51673 -6004736 51599 -6012928 51769 -6021120 51733 -6029312 51803 -6037504 51888 -6045696 51937 -6053888 52008 -6062080 52093 -6070272 52143 -6078464 52238 -6086656 52306 -6094848 52355 -6103040 52446 -6111232 52529 -6119424 52558 -6127616 52665 -6135808 52698 -6144000 52791 -6152192 52901 -6160384 53014 -6168576 53078 -6176768 53043 -6184960 53127 -6193152 53192 -6201344 53271 -6209536 53388 -6217728 53402 -6225920 53464 -6234112 53649 -6242304 53607 -6250496 53671 -6258688 53738 -6266880 53821 -6275072 54005 -6283264 53971 -6291456 54020 -6299648 54232 -6307840 54161 -6316032 54252 -6324224 54299 -6332416 54372 -6340608 54441 -6348800 54509 -6356992 54595 -6365184 54652 -6373376 54731 -6381568 54795 -6389760 54857 -6397952 54960 -6406144 55015 -6414336 55067 -6422528 55170 -6430720 55203 -6438912 55270 -6447104 55427 -6455296 55439 -6463488 55573 -6471680 55578 -6479872 55636 -6488064 55692 -6496256 55757 -6504448 55877 -6512640 55900 -6520832 56069 -6529024 56044 -6537216 56112 -6545408 56177 -6553600 56265 -6561792 56319 -6569984 56390 -6578176 56455 -6586368 56533 -6594560 56596 -6602752 56668 -6610944 56736 -6619136 56806 -6627328 56885 -6635520 56948 -6643712 57027 -6651904 57092 -6660096 57175 -6668288 57237 -6676480 57315 -6684672 57374 -6692864 57429 -6701056 57596 -6709248 57589 -6717440 57687 -6725632 57720 -6733824 57835 -6742016 58421 -6750208 57959 -6758400 58019 -6766592 58061 -6774784 58167 -6782976 58200 -6791168 58279 -6799360 58451 -6807552 58539 -6815744 58489 -6823936 58548 -6832128 58673 -6840320 58737 -6848512 58788 -6856704 58829 -6864896 58894 -6873088 58989 -6881280 59034 -6889472 59179 -6897664 59197 -6905856 59278 -6914048 59382 -6922240 59427 -6930432 59459 -6938624 59528 -6946816 59577 -6955008 59659 -6963200 59872 -6971392 59846 -6979584 59880 -6987776 60074 -6995968 60140 -7004160 60144 -7012352 60197 -7020544 60250 -7028736 60291 -7036928 60361 -7045120 60466 -7053312 60580 -7061504 60585 -7069696 60671 -7077888 60756 -7086080 60820 -7094272 60847 -7102464 61022 -7110656 61083 -7118848 61077 -7127040 61168 -7135232 61199 -7143424 61286 -7151616 61511 -7159808 61394 -7168000 61571 -7176192 61543 -7184384 61625 -7192576 61701 -7200768 61750 -7208960 61823 -7217152 61928 -7225344 61967 -7233536 62064 -7241728 62128 -7249920 62169 -7258112 62245 -7266304 62309 -7274496 62430 -7282688 62476 -7290880 62516 -7299072 62597 -7307264 62684 -7315456 62763 -7323648 62836 -7331840 62876 -7340032 62967 -7348224 63038 -7356416 63084 -7364608 63181 -7372800 63334 -7380992 63344 -7389184 63410 -7397376 63483 -7405568 63611 -7413760 63586 -7421952 63683 -7430144 63767 -7438336 63904 -7446528 63912 -7454720 64098 -7462912 64003 -7471104 64179 -7479296 64316 -7487488 64268 -7495680 64271 -7503872 64369 -7512064 64491 -7520256 64510 -7528448 64535 -7536640 64610 -7544832 64776 -7553024 64832 -7561216 64854 -7569408 64921 -7577600 64949 -7585792 65096 -7593984 65189 -7602176 65220 -7610368 65257 -7618560 65348 -7626752 65439 -7634944 65547 -7643136 65533 -7651328 65663 -7659520 65758 -7667712 65902 -7675904 66435 -7684096 65998 -7692288 65999 -7700480 66194 -7708672 66211 -7716864 66230 -7725056 66221 -7733248 66303 -7741440 66387 -7749632 66529 -7757824 66514 -7766016 66621 -7774208 66643 -7782400 66687 -7790592 66861 -7798784 66862 -7806976 67003 -7815168 67037 -7823360 67020 -7831552 67118 -7839744 67195 -7847936 67350 -7856128 67324 -7864320 67390 -7872512 67560 -7880704 67523 -7888896 67586 -7897088 67654 -7905280 67749 -7913472 67822 -7921664 67880 -7929856 67938 -7938048 68013 -7946240 68085 -7954432 68153 -7962624 68225 -7970816 68304 -7979008 68361 -7987200 68429 -7995392 68512 -8003584 68591 -8011776 68641 -8019968 68722 -8028160 68788 -8036352 68887 -8044544 69110 -8052736 69085 -8060928 69196 -8069120 69131 -8077312 69237 -8085504 69357 -8093696 69368 -8101888 69643 -8110080 69597 -8118272 69609 -8126464 69648 -8134656 69748 -8142848 69919 -8151040 69898 -8159232 69981 -8167424 70067 -8175616 70028 -8183808 70218 -8192000 70272 -8200192 70357 -8208384 70410 -8216576 70514 -8224768 70503 -8232960 70623 -8241152 70720 -8249344 70659 -8257536 70779 -8265728 70792 -8273920 70978 -8282112 71039 -8290304 71013 -8298496 71213 -8306688 71203 -8314880 71231 -8323072 71298 -8331264 71347 -8339456 71517 -8347648 71609 -8355840 71575 -8364032 71642 -8372224 71709 -8380416 71824 -8388608 71855 diff --git a/contrib/network_model/regress.py b/contrib/network_model/regress.py deleted file mode 100755 index 6df8e71784..0000000000 --- a/contrib/network_model/regress.py +++ /dev/null @@ -1,354 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2010-2011, 2014. The SimGrid Team. -# All rights reserved. - -# This program is free software; you can redistribute it and/or modify it -# under the terms of the license (GNU LGPL) which comes with this package. - -#--------------------------------------------------------------------------------------------------- -# Example invokation: -# % ./regress.py griffon_skampi_pt2pt.ski.dat 65536 120832 -# -# -# Given two vectors of same length n: message size S(.. s_i ..), and communication time T( .. t_i .. ) -# where t_i is the time associated to a mesage size s_i, computes the segmentation of the vectors -# in 3 segments such that linear regressions on the 3 segments maximize correlation. -# The metric for correlation is now the cumulative, log error of the estimated time value given -# by regression, to the real time value. -# -# Call r(X[i:j],Y[i:j]) = ax + b the regression line for data of X,Y between indices i and j -# Call E[i:j] = E( e_i, .., e_j) the vector of estimates from the regression, where e_i = a*S[i] + b -# Call mean_logerr( T,T' ) the average log error of paired elements t_i and t'_i, of vectors len n T and T' resp. -# i.e mean_logerr( T,T' ) = 1/n * Sum_i^n ( exp(| ln(t_i)-ln(t'_i)|) - 1 ) -# -# The script computes indices k and l, s.t. -# mean_logerr( r(S[0:k],T[0:k]) , E[0,k] ) + -# mean_logerr( r(S[k:l],T[k:l]) , E[k,l] ) + -# mean_logerr( r(S[l:n],T[l:n]) , E[l,n] ) -# is minimum. -#--------------------------------------------------------------------------------------------------- - -import sys -from math import sqrt,log,exp - - -if len(sys.argv) != 2 and len(sys.argv) != 4: - print("Usage : {} datafile".format(sys.argv[0])) - print("or : {0} datafile p1 p2".format(sys.argv[0])) - print("where : p1 < p2 belongs to sizes in datafiles") - sys.exit(-1) - -if len(sys.argv) == 4: - p1=int(sys.argv[2]) - p2=int(sys.argv[3]) - -##----------------------------------------- -## avg : return average of a list of values -## param l list of values -##----------------------------------------- -def avg (l): - sum=0 - for e in l: - sum=sum+e; - return sum/len(l) - -##------------------------------------------------- -## cov : covariance -## param X first data vector (..x_i..) -## param Y second data vector (..y_i..) -## = 1/n \Sum_{i=1}^n (x_i - avg(x)) * (y_i - avg(y)) -##-------------------------------------------------- -def cov(X,Y): - assert(len(X)==len(Y)) - n=len(X) # n=len(X)=len(Y) - avg_X = avg( X ) - avg_Y = avg( Y ) - S_XY=0 - for i in range(n): - S_XY = S_XY + ((X[i]-avg_X)*(Y[i]-avg_Y)) - - return (S_XY/n) - - -##---------------------------------- -## variance : variance -## param X data vector ( ..x_i.. ) -## (S_X)^2 = (Sum ( x_i - avg(X) )^2 ) / n -##---------------------------------- -def variance( X ): - S_X2 = 0 - n = len( X ) - avg_X = avg ( X ) - for i in range(n): - S_X2 = S_X2 + ((X[i] - avg_X)**2) - - return (S_X2/n) - -##---------------------------------- -## mean log_error -## param X data vector ( ..x_i.. ), length n -## param Y data vector ( ..y_i.. ), length n -## return mean( 1/n * Sum_i^n ( exp(| ln(x_i)-ln(y_i)|) - 1 ) -##---------------------------------- -def mean_logerr( X,Y ): - assert( len(X) == len(Y) ) - E = list(); # the list of errors - for i in range(len(X)): - E.append( exp(abs(log(X[i])-log(Y[i])))-1 ) - return (avg( E )) - - -##----------------------------------------------------------------------------------------------- -## correl_split_weighted_logerr : compute regression on each segment and -## return the weigthed sum of correlation coefficients -## param X first data vector (..x_i..) -## param Y second data vector (..x_i..) -## param segments list of pairs (i,j) where i refers to the ith value in X, and jth value in X -## return (C,[(i1,j1,X[i1],X[j1]), (i2,j2,X[i2],X[j2]), ....] -## where i1,j1 is the first segment, c1 the correlation coef on this segment, n1 the number of values -## i2,j2 is the second segment, c2 the correlation coef on this segment, n2 the number of values -## ... -## and C=c1/n1+c2/n2+... -##----------------------------------------------------------------------------------------------- -def correl_split_weighted_logerr( X , Y , segments ): - # expects segments = [(0,i1-1),(i1-1,i2-1),(i2,len-1)] - correl = list() - interv = list() # regr. line coeffs and range - glob_err=0 - for (start,stop) in segments: - #if start==stop : - # return 0 - S_XY= cov( X [start:stop+1], Y [start:stop+1] ) - S_X2 = variance( X [start:stop+1] ) - a = S_XY/S_X2 # regr line coeffs - b = avg ( Y[start:stop+1] ) - a * avg( X[start:stop+1] ) - # fill a vector (Z) with predicted values from regression - Z=list() - for i in range(start,stop+1): - Z.append( a * X[i] + b ) - # compare real values and computed values - e = mean_logerr( Y[start:stop+1] , Z ) - correl.append( (e, stop-start+1) ); # store correl. coef + number of values (segment length) - interv.append( (a,b, X[start],X[stop],e) ); - - for (e,l) in correl: - glob_err = glob_err + (e*l/len( X )) # the average log err for this segment (e) is - # weighted by the number of values of the segment (l) out of the total number of values - - #print("-> glob_corr={}\n".format(glob_corr)) - return (glob_err,interv); - -##----------------------------------------------------------------------------------------------- -## correl_split_weighted : compute regression on each segment and -## return the weigthed sum of correlation coefficients -## param X first data vector (..x_i..) -## param Y second data vector (..x_i..) -## param segments list of pairs (i,j) where i refers to the ith value in X, and jth value in X -## return (C,[(i1,j1,X[i1],X[j1]), (i2,j2,X[i2],X[j2]), ....] -## where i1,j1 is the first segment, c1 the correlation coef on this segment, n1 the number of values -## i2,j2 is the second segment, c2 the correlation coef on this segment, n2 the number of values -## ... -## and C=c1/n1+c2/n2+... -##----------------------------------------------------------------------------------------------- -def correl_split_weighted( X , Y , segments ): - # expects segments = [(0,i1-1),(i1-1,i2-1),(i2,len-1)] - correl = list(); - interv = list(); # regr. line coeffs and range - glob_corr=0 - sum_nb_val=0 - for (start,stop) in segments: - sum_nb_val = sum_nb_val + stop - start; - #if start==stop : - # return 0 - S_XY= cov( X [start:stop+1], Y [start:stop+1] ) - S_X2 = variance( X [start:stop+1] ) - S_Y2 = variance( Y [start:stop+1] ) # to compute correlation - if S_X2*S_Y2 == 0: - return (0,[]) - c = S_XY/(sqrt(S_X2)*sqrt(S_Y2)) - a = S_XY/S_X2 # regr line coeffs - b= avg ( Y[start:stop+1] ) - a * avg( X[start:stop+1] ) - #print(" range [%d,%d] corr=%f, coeff det=%f [a=%f, b=%f]" % (X[start],X[stop],c,c**2,a, b)) - correl.append( (c, stop-start) ); # store correl. coef + number of values (segment length) - interv.append( (a,b, X[start],X[stop]) ); - - for (c,l) in correl: - glob_corr = glob_corr + (l/sum_nb_val)*c # weighted product of correlation - #print('-- %f * %f' % (c,l/sum_nb_val)) - - #print("-> glob_corr={}\n".format(glob_corr)) - return (glob_corr,interv); - - - - -##----------------------------------------------------------------------------------------------- -## correl_split : compute regression on each segment and -## return the product of correlation coefficient -## param X first data vector (..x_i..) -## param Y second data vector (..x_i..) -## param segments list of pairs (i,j) where i refers to the ith value in X, and jth value in X -## return (C,[(i1,j1,X[i1],X[j1]), (i2,j2,X[i2],X[j2]), ....] -## where i1,j1 is the first segment, c1 the correlation coef on this segment, -## i2,j2 is the second segment, c2 the correlation coef on this segment, -## ... -## and C=c1*c2*... -##----------------------------------------------------------------------------------------------- -def correl_split( X , Y , segments ): - # expects segments = [(0,i1-1),(i1-1,i2-1),(i2,len-1)] - correl = list(); - interv = list(); # regr. line coeffs and range - glob_corr=1 - for (start,stop) in segments: - #if start==stop : - # return 0 - S_XY= cov( X [start:stop+1], Y [start:stop+1] ) - S_X2 = variance( X [start:stop+1] ) - S_Y2 = variance( Y [start:stop+1] ) # to compute correlation - if S_X2*S_Y2 == 0: - return (0,[]) - c = S_XY/(sqrt(S_X2)*sqrt(S_Y2)) - a = S_XY/S_X2 # regr line coeffs - b= avg ( Y[start:stop+1] ) - a * avg( X[start:stop+1] ) - #print(" range [%d,%d] corr=%f, coeff det=%f [a=%f, b=%f]" % (X[start],X[stop],c,c**2,a, b)) - correl.append( (c, stop-start) ); # store correl. coef + number of values (segment length) - interv.append( (a,b, X[start],X[stop]) ); - - for (c,l) in correl: - glob_corr = glob_corr * c # product of correlation coeffs - return (glob_corr,interv); - - - -##----------------------------------------------------------------------------------------------- -## main -##----------------------------------------------------------------------------------------------- -sum=0 -nblines=0 -skampidat = open(sys.argv[1], "r") - - -## read data from skampi logs. -timings = [] -sizes = [] -readdata =[] -for line in skampidat: - l = line.split(); - if line[0] != '#' and len(l) >= 3: # is it a comment ? - ## expected format - ## --------------- - #count= 8388608 8388608 144916.1 7.6 32 144916.1 143262.0 - #("%s %d %d %f %f %d %f %f\n" % (countlbl, count, countn, time, stddev, iter, mini, maxi) - readdata.append( (int(l[1]),float(l[3])) ); - nblines=nblines+1 - -## These may not be sorted so sort it by message size before processing. -sorteddata = sorted( readdata, key=lambda pair: pair[0]) -sizes,timings = zip(*sorteddata); - -# zip makes tuples; cast to lists for backward compatibility with python2.X -sizes = list(sizes) -timings = list(timings) - -##----------------------- search for best break points----------------- -## example -## p1=2048 -> p1inx=11 delta=3 -> [8;14] -## 8 : segments[(0,7),(8,13),(13,..)] -## .... -## p2=65536 -> p2inx=16 delta=3 -> [13;19] - -if len(sys.argv) == 4: - - p1inx = sizes.index( p1 ); - p2inx = sizes.index( p2 ); - max_glob_corr = 999990; - max_p1inx = p1inx - max_p2inx = p2inx - - ## tweak parameters here to extend/reduce search - search_p1 = 70 # number of values to search +/- around p1 - search_p2 = 70 # number of values to search +/- around p2 - min_seg_size = 3 - if (search_p2 + min_seg_size > len(sizes)): # reduce min segment sizes when points close to data extrema - min_seg_size = len(sizes)-search_p2 - if (search_p1 - min_seg_size < 0): - min_seg_size = search_p1 - - lb1 = max( 1, p1inx-search_p1 ) - ub1 = min( p1inx+search_p1, p2inx); - lb2 = max( p1inx, p2inx-search_p2) # breakpoint +/- delta - ub2 = min( p2inx+search_p2, len(sizes)-1); - - print("** evaluating over \n"); - print("interv1:\t %d <--- %d ---> %d" % (sizes[lb1],p1,sizes[ub1])) - print("rank: \t (%d)<---(%d)--->(%d)\n" % (lb1,p1inx,ub1)) - print("interv2:\t\t %d <--- %d ---> %d" % (sizes[lb2],p2,sizes[ub2])) - print("rank: \t\t(%d)<---(%d)--->(%d)\n" % (lb2,p2inx,ub2)) - - result = list() - for i in range(lb1,ub1+1): - for j in range(lb2,ub2+1): - if i=min_seg_size and j-i+1 >= min_seg_size and len(sizes)-1-j >= min_seg_size : # not too small segments - #print("** i=%d,j=%d" % (i,j)) - segments = [(0,i),(i,j),(j,len(sizes)-1)] - result.append( correl_split_weighted_logerr( sizes, timings, segments) ) # add pair (metric,interval) - - # sort results on ascending metric: ok for logerr. Add "reverse=true" for desc sort if you use a correlation metric - result = sorted( result, key=lambda pair: pair[0]) - - - top_n_sol=5; # tweak to display top best n solution - - print("#-------------------- result summary ---------------------------------------------------------------------\n"); - - for k in range(top_n_sol): - (err,interval) = result[k] - print(k) - print("\n RANK {0}\n-------".format(k)) - print("** overall metric = {0}".format(err)) - for (a,b,i,j,e) in interval: - print("** OPT: [{0} .. {1}] segment_metric={2} slope: {3} x + {4}".format(i,j,e,a,b)) - - - print("\n\n\n") - - print("#-------------------- Best Solution : cut here the gnuplot code -----------------------------------------------------------\n"); - preamble='set output "regr.eps"\n\ -set terminal postscript eps color\n\ -set key left\n\ -set xlabel "Each message size in bytes"\n\ -set ylabel "Time in us"\n\ -set logscale x\n\ -set logscale y\n\ -set grid' - - print(preamble); - print('plot "%s" u 3:4:($5) with errorbars title "skampi traces %s",\\' % (sys.argv[1],sys.argv[1])); - (err,interval) = result[0] - for (a,b,i,j,e) in interval: - print('"%s" u (%d<=$3 && $3<=%d? $3:0/0):(%f*($3)+%f) w linespoints title "regress. %s-%s bytes",\\' % (sys.argv[1],i,j,a,b,i,j)) - - print("#-------------------- /cut here the gnuplot code -----------------------------------------------------------\n"); - - -else: - print('\n** Linear regression on %d values **\n' % (nblines)) - print('\n sizes=',sizes,'\n\n') - avg_sizes = avg( sizes ) - avg_timings = avg( timings ) - print("avg_timings=%f, avg_sizes=%f, nblines=%d\n" % (avg_timings,avg_sizes,nblines)) - - S_XY= cov( sizes, timings ) - S_X2 = variance( sizes ) - S_Y2 = variance( timings ) # to compute correlation - - a = S_XY/S_X2 - correl = S_XY/(sqrt(S_X2)*sqrt(S_Y2)) # corealation coeff (Bravais-Pearson) - - - b= avg_timings - a * avg_sizes - print("[S_XY=%f, S_X2=%f]\n[correlation=%f, coeff det=%f]\n[a=%f, b=%f]\n" % (S_XY, S_X2, correl,correl**2,a, b)) - - diff --git a/contrib/network_model/regression2.py b/contrib/network_model/regression2.py deleted file mode 100755 index fc4e84ba7a..0000000000 --- a/contrib/network_model/regression2.py +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2011, 2014. The SimGrid Team. -# All rights reserved. - -# This program is free software; you can redistribute it and/or modify it -# under the terms of the license (GNU LGPL) which comes with this package. - -# This script takes the following command line parameters -# 1) an input file containing 2 columns: message size and 1-way trip time -# 2) the maximum relative error for a line segment -# 3) the minimum number of points needed to justify adding a line segment -# 4) the number of links -# 5) the latency -# 6) the bandwidth - -import sys - -def compute_regression(points): - N = len(points) - - if N < 1: - return None - - if N < 2: - return (0, points[0][1]) - - Sx = Sy = Sxx = Syy = Sxy = 0.0 - - for x, y in points: - Sx += x - Sy += y - Sxx += x*x - Syy += y*y - Sxy += x*y - denom = Sxx * N - Sx * Sx - # don't return 0 or negative values as a matter of principle... - m = max(sys.float_info.min, (Sxy * N - Sy * Sx) / denom) - b = max(sys.float_info.min, (Sxx * Sy - Sx * Sxy) / denom) - return (m, b) - -def compute_error(m, b, x, y): - yp = m*x+b - return abs(yp - y) / max(min(yp, y), sys.float_info.min) - -def compute_max_error(m, b, points): - max_error = 0.0 - for x, y in points: - max_error = max(max_error, compute_error(m, b, x, y)) - return max_error - -def get_max_error_point(m, b, points): - max_error_index = -1 - max_error = 0.0 - - i = 0 - while i < len(points): - x, y = points[i] - error = compute_error(m, b, x, y) - if error > max_error: - max_error_index = i - max_error = error - i += 1 - - return (max_error_index, max_error) - -infile_name = sys.argv[1] -error_bound = float(sys.argv[2]) -min_seg_points = int(sys.argv[3]) -links = int(sys.argv[4]) -latency = float(sys.argv[5]) -bandwidth = float(sys.argv[6]) - -infile = open(infile_name, 'r') - -# read datafile -points = [] -for line in infile: - fields = line.split() - points.append((int(fields[0]), int(fields[1]))) -infile.close() - -# should sort points by x values -points.sort() - -# break points up into segments -pointsets = [] -lbi = 0 -while lbi < len(points): - min_ubi = lbi - max_ubi = len(points) - 1 - while max_ubi - min_ubi > 1: - ubi = (min_ubi + max_ubi) / 2 - m, b = compute_regression(points[lbi:ubi+1]) - max_error = compute_max_error(m, b, points[lbi:ubi+1]) - if max_error > error_bound: - max_ubi = ubi - 1 - else: - min_ubi = ubi - ubi = max_ubi - if min_ubi < max_ubi: - m, b = compute_regression(points[lbi:max_ubi+1]) - max_error = compute_max_error(m, b, points[lbi:max_ubi+1]) - if max_error > error_bound: - ubi = min_ubi - pointsets.append(points[lbi:ubi+1]) - lbi = ubi+1 - -# try to merge larger segments if possible and compute piecewise regression -i = 0 -segments = [] -notoutliers = 0 -while i < len(pointsets): - currpointset = [] - j = i - while j < len(pointsets): - newpointset = currpointset + pointsets[j] - # if joining a small segment, we can delete bad points - if len(pointsets[j]) < min_seg_points: - k = 0 - while k < len(pointsets[j]): - m, b = compute_regression(newpointset) - max_error_index, max_error = get_max_error_point(m, b, newpointset) - if max_error <= error_bound: - break - del newpointset[max_error_index] - k += 1 - # only add new pointset if we had to delete fewer than its length - # points - if k < len(pointsets[j]): - i = j - currpointset = newpointset - # otherwise, we just see if it works... - else: - m, b = compute_regression(newpointset) - max_error = compute_max_error(m, b, newpointset) - if max_error > error_bound: - break - i = j - currpointset = newpointset - j += 1 - i += 1 - # outliers are ignored when constructing the piecewise funciton - if len(currpointset) < min_seg_points: - continue - notoutliers += len(currpointset) - m, b = compute_regression(currpointset) - lb = min(x for x, y in currpointset) - lat_factor = b / (1.0e6 * links * latency) - bw_factor = 1.0e6 / (m * bandwidth) - segments.append((lb, m, b, lat_factor, bw_factor)) - -outliers = len(points) - notoutliers -segments.sort() -segments.reverse() - -print "/**--------- -------------" -print " * produced by:" -print " *", " ".join(sys.argv) -print " * outliers:", outliers -print " * gnuplot: " -print " plot \"%s\" using 1:2 with lines title \"data\", \\" % (infile_name) -for lb, m, b, lat_factor, bw_factor in segments: - print " (x >= %d) ? %g*x+%g : \\" % (lb, m, b) -print " 1.0 with lines title \"piecewise function\"" -print " *-------------------------------------------------------------------*/" -print -print "static double smpi_bandwidth_factor(double size)\n{\n" -for lb, m, b, lat_factor, bw_factor in segments: - print " if (size >= %d) return %g;" % (lb, bw_factor) -print " return 1.0;\n}\n" -print "static double smpi_latency_factor(double size)\n{\n" -for lb, m, b, lat_factor, bw_factor in segments: - print " if (size >= %d) return %g;" % (lb, lat_factor) -print " return 1.0;\n}\n" -print "/**--------- -----------*/" diff --git a/contrib/network_model/smpi_calibration.c b/contrib/network_model/smpi_calibration.c deleted file mode 100644 index 7c1abb6eaa..0000000000 --- a/contrib/network_model/smpi_calibration.c +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (c) 2011, 2014. The SimGrid Team. - * All rights reserved. */ - -/* This program is free software; you can redistribute it and/or modify it - * under the terms of the license (GNU LGPL) which comes with this package. */ - -/**--------- ------------- - * produced by: - * ./regression2.py ./pingpong-in.dat 0.15 30 2 2.4e-5 1.25e8 - * outliers: 66 - * gnuplot: - plot "./pingpong-in.dat" using 1:2 with lines title "data", \ - (x >= 65472) ? 0.00850436*x+558.894 : \ - (x >= 15424) ? 0.0114635*x+167.446 : \ - (x >= 9376) ? 0.0136219*x+124.464 : \ - (x >= 5776) ? 0.00735707*x+105.022 : \ - (x >= 3484) ? 0.0103235*x+90.2886 : \ - (x >= 1426) ? 0.0131384*x+77.3159 : \ - (x >= 732) ? 0.0233927*x+93.6146 : \ - (x >= 257) ? 0.0236608*x+93.7637 : \ - (x >= 127) ? 0.0246645*x+94.0447 : \ - (x >= 64) ? 0.037963*x+93.0877 : \ - (x >= 0) ? 2.22507e-308*x+98.0633 : \ - 1.0 with lines title "piecewise function" - *-------------------------------------------------------------------*/ - -static double smpi_bandwidth_factor(double size) -{ - - if (size >= 65472) return 0.940694; - if (size >= 15424) return 0.697866; - if (size >= 9376) return 0.58729; - if (size >= 5776) return 1.08739; - if (size >= 3484) return 0.77493; - if (size >= 1426) return 0.608902; - if (size >= 732) return 0.341987; - if (size >= 257) return 0.338112; - if (size >= 127) return 0.324353; - if (size >= 64) return 0.210731; - if (size >= 0) return 3.59539e+305; - return 1.0; -} - -static double smpi_latency_factor(double size) -{ - - if (size >= 65472) return 11.6436; - if (size >= 15424) return 3.48845; - if (size >= 9376) return 2.59299; - if (size >= 5776) return 2.18796; - if (size >= 3484) return 1.88101; - if (size >= 1426) return 1.61075; - if (size >= 732) return 1.9503; - if (size >= 257) return 1.95341; - if (size >= 127) return 1.95926; - if (size >= 64) return 1.93933; - if (size >= 0) return 2.04299; - return 1.0; -} - -/**--------- -----------*/