diff --git a/src/HogProf.egg-info/PKG-INFO b/src/HogProf.egg-info/PKG-INFO index 38ed72e..847d953 100644 --- a/src/HogProf.egg-info/PKG-INFO +++ b/src/HogProf.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: HogProf -Version: 0.0.8 +Version: 0.0.9 Summary: Phylogenetic Profiling with OMA and minhashing Author-email: Dave Moi License: MIT License diff --git a/src/HogProf/lshbuilder.py b/src/HogProf/lshbuilder.py index 36517bc..afd1fa0 100755 --- a/src/HogProf/lshbuilder.py +++ b/src/HogProf/lshbuilder.py @@ -40,7 +40,7 @@ class LSHBuilder: with a list of taxonomic codes for all the species in your db """ - def __init__(self,h5_oma=None,fileglob = None, taxa=None,masterTree=None, saving_name=None , numperm = 256, treeweights= None , taxfilter = None, taxmask= None , lossonly = False, duplonly = False, verbose = False , use_taxcodes = False , datetime = datetime.now()): + def __init__(self,h5_oma=None,fileglob = None, taxa=None,masterTree=None, saving_name=None , numperm = 256, treeweights= None , taxfilter = None, taxmask= None , lossonly = False, duplonly = False, verbose = False , use_taxcodes = False , datetime = datetime.now() , reformat_names = False): """ Initializes the LSHBuilder class with the specified parameters and sets up the necessary objects. @@ -67,11 +67,14 @@ def __init__(self,h5_oma=None,fileglob = None, taxa=None,masterTree=None, saving self.db_obj = None self.oma_id_obj = None + self.reformat_names = reformat_names self.tax_filter = taxfilter self.tax_mask = taxmask self.verbose = verbose self.datetime = datetime + self.use_phyloxml = False self.fileglob = fileglob + self.idmapper = None self.date_string = "{:%B_%d_%Y_%H_%M}".format(datetime.now()) if saving_name: self.saving_name= saving_name @@ -82,6 +85,7 @@ def __init__(self,h5_oma=None,fileglob = None, taxa=None,masterTree=None, saving os.mkdir(path=self.saving_path) else: raise Exception( 'please specify an output location' ) + self.errorfile = self.saving_path + 'errors.txt' if masterTree is None: if h5_oma: @@ -102,19 +106,37 @@ def __init__(self,h5_oma=None,fileglob = None, taxa=None,masterTree=None, saving trees = [t for t in project.get_phylogeny()] self.tree_ete3 = [ n for n in trees[0] ][0] print( self.tree_ete3 ) - + self.use_phyloxml = True + print('using phyloxml') + print( self.tree_ete3 ) + self.tree_string = masterTree else: - try: self.tree_ete3 = ete3.Tree(masterTree, format=1 , quoted_node_names= True) print( self.tree_ete3 ) except: self.tree_ete3 = ete3.Tree(masterTree, format=0) - with open(masterTree) as treein: self.tree_string = treein.read() #self.tree_string = self.tree_ete3.write(format=0) - + else: + raise Exception( 'please specify a tree' ) + + if self.reformat_names: + self.tree_ete3, self.idmapper = pyhamutils.tree2numerical(self.tree_ete3) + with open( self.saving_path + 'reformatted_tree.nw', 'w') as treeout: + treeout.write(self.tree_ete3.write(format=0 )) + with open( self.saving_path + 'idmapper.pkl', 'wb') as idout: + idout.write( pickle.dumps(self.idmapper)) + print('reformatted tree') + print( self.tree_ete3 ) + self.tree_string = self.tree_ete3.write(format=1) + #remap taxfilter and taxmask + if taxfilter: + self.tax_filter = [ self.idmapper[tax] for tax in taxfilter ] + if taxmask: + self.tax_mask = self.idmapper[taxmask] + self.swap2taxcode = use_taxcodes self.taxaIndex, self.reverse = files_utils.generate_taxa_index(self.tree_ete3 , self.tax_filter, self.tax_mask) with open( self.saving_path + 'taxaIndex.pkl', 'wb') as taxout: @@ -137,14 +159,21 @@ def __init__(self,h5_oma=None,fileglob = None, taxa=None,masterTree=None, saving print('swapping ids') else: print('not swapping ids') - - - - if self.h5OMA: - self.HAM_PIPELINE = functools.partial( pyhamutils.get_ham_treemap_from_row, tree=self.tree_string , swap_ids=self.swap2taxcode ) + print( 'configuring pyham functions') + print( 'swap ids', self.swap2taxcode) + print( 'reformat names', self.reformat_names) + print( 'use phyloxml', self.use_phyloxml) + print( 'use taxcodes', self.swap2taxcode) + + if self.h5OMA: + self.HAM_PIPELINE = functools.partial( pyhamutils.get_ham_treemap_from_row, tree=self.tree_string , swap_ids=self.swap2taxcode , reformat_names = self.reformat_names , + orthoXML_as_string = True , use_phyloxml = self.use_phyloxml , orthomapper = self.idmapper ) else: - self.HAM_PIPELINE = functools.partial( pyhamutils.get_ham_treemap_from_row, tree=self.tree_string , swap_ids=self.swap2taxcode , orthoXML_as_string = False ) + self.HAM_PIPELINE = functools.partial( pyhamutils.get_ham_treemap_from_row, tree=self.tree_string , swap_ids=self.swap2taxcode , + orthoXML_as_string = False , reformat_names = self.reformat_names , use_phyloxml = self.use_phyloxml , orthomapper = self.idmapper ) + + self.HASH_PIPELINE = functools.partial( hashutils.row2hash , taxaIndex=self.taxaIndex, treeweights=self.treeweights, wmg=wmg , lossonly = lossonly, duplonly = duplonly) if self.h5OMA: @@ -236,9 +265,18 @@ def worker(self, i, q, retq, matq, l): while True: df = q.get() if df is not None : - df['tree'] = df[['Fam', 'ortho']].apply(self.HAM_PIPELINE, axis=1) - df[['hash','rows']] = df[['Fam', 'tree']].apply(self.HASH_PIPELINE, axis=1) - retq.put(df[['Fam', 'hash']]) + + try: + df['tree'] = df[['Fam', 'ortho']].apply(self.HAM_PIPELINE, axis=1) + df[['hash','rows']] = df[['Fam', 'tree']].apply(self.HASH_PIPELINE, axis=1) + retq.put(df[['Fam', 'hash']]) + except Exception as e: + print('error in worker' + str(i)) + print(e) + with open(self.errorfile, 'a') as errorfile: + errorfile.write(str(e)) + errorfile.write(str(df)) + #matq.put(df[['Fam', 'rows']]) else: if self.verbose == True: @@ -287,8 +325,9 @@ def saver(self, i, q, retq, matq, l ): h5hashes[taxstr][fam, :] = hashes[fam].hashvalues.ravel() count += 1 if t.time() - save_start > 200: - print( t.time() - global_time ) + print( 'saving at :' , t.time() - global_time ) forest.index() + print( 'testing forest' ) print(forest.query( hashes[fam] , k = 10 ) ) h5flush() save_start = t.time() @@ -412,13 +451,14 @@ def main(): parser.add_argument('--OrthoGlob', help='a glob expression for orthoxml files ' , type = str) parser.add_argument('--tarfile', help='use tarfile with orthoxml data ' , type = str) parser.add_argument('--nperm', help='number of hash functions to use when constructing profiles' , type = int) - parser.add_argument('--mastertree', help='master taxonomic tree. should use ncbi taxonomic id numbers as leaf names' , type = str) + parser.add_argument('--mastertree', help='master taxonomic tree. nodes should correspond to orthoxml' , type = str) + parser.add_argument('--nthreads', help='nthreads for multiprocessing' , type = int) - parser.add_argument('--outfolder', help='folder for storing hash, db and tree objects' , type = str) parser.add_argument('--lossonly', help='only compile loss events' , type = bool) parser.add_argument('--duplonly', help='only compile duplication events' , type = bool) parser.add_argument('--taxcodes', help='use taxid info in HOGs' , type = str) parser.add_argument('--verbose', help='print verbose output' , type = bool) + parser.add_argument('--reformat_names', help='try to correct broken species trees by replacing all names with numbers.' , type = bool) dbdict = { 'all': { 'taxfilter': None , 'taxmask': None }, 'plants': { 'taxfilter': None , 'taxmask': 33090 }, @@ -439,10 +479,10 @@ def main(): if 'OrthoGlob' in args: if args['OrthoGlob']: - orthoglob = glob.glob(args['OrthoGlob']+ '*') + orthoglob = glob.glob(args['OrthoGlob']) else: orthoglob = None - + if 'outpath' in args: dbname = args['outpath'] else: @@ -467,6 +507,9 @@ def main(): else: raise Exception(' please specify input data ') + + + if args['lossonly']: lossonly = args['lossonly'] else: @@ -488,7 +531,10 @@ def main(): else: verbose = False - + if args['reformat_names']: + reformat_names = True + else: + reformat_names = False threads = 4 if args['nthreads']: @@ -514,11 +560,13 @@ def main(): if omafile: with open_file( omafile , mode="r") as h5_oma: lsh_builder = LSHBuilder(h5_oma = h5_oma, fileglob=orthoglob ,saving_name=dbname , numperm = nperm , - treeweights= weights , taxfilter = taxfilter, taxmask=taxmask , masterTree =mastertree , lossonly = lossonly , duplonly = duplonly , use_taxcodes = taxcodes , verbose=verbose) + treeweights= weights , taxfilter = taxfilter, taxmask=taxmask , masterTree =mastertree , + lossonly = lossonly , duplonly = duplonly , use_taxcodes = taxcodes , reformat_names=reformat_names, verbose=verbose ) lsh_builder.run_pipeline(threads) else: lsh_builder = LSHBuilder(h5_oma = None, fileglob=orthoglob ,saving_name=dbname , numperm = nperm , - treeweights= weights , taxfilter = taxfilter, taxmask=taxmask , masterTree =mastertree , lossonly = lossonly , duplonly = duplonly , use_taxcodes = taxcodes , verbose=verbose) + treeweights= weights , taxfilter = taxfilter, taxmask=taxmask , + masterTree =mastertree , lossonly = lossonly , duplonly = duplonly , use_taxcodes = taxcodes , reformat_names=reformat_names, verbose=verbose) lsh_builder.run_pipeline(threads) print(time.time() - start) print('DONE') diff --git a/src/HogProf/utils/hashutils.py b/src/HogProf/utils/hashutils.py index 8c97548..3583662 100755 --- a/src/HogProf/utils/hashutils.py +++ b/src/HogProf/utils/hashutils.py @@ -50,6 +50,8 @@ def hash_tree(tp , taxaIndex , treeweights , wmg , lossonly = False , duplonly = :return weighted_hash: a weighted minhash of a HOG """ + if not tp: + return None, None hog_matrix_weighted = np.zeros((1, 3*len(taxaIndex))) hog_matrix_binary = np.zeros((1, 3*len(taxaIndex))) diff --git a/src/HogProf/utils/pyhamutils.py b/src/HogProf/utils/pyhamutils.py index a4df5ca..6681c06 100755 --- a/src/HogProf/utils/pyhamutils.py +++ b/src/HogProf/utils/pyhamutils.py @@ -1,5 +1,6 @@ import pyham import xml.etree.cElementTree as ET +import ete3 import pickle import traceback @@ -34,23 +35,94 @@ def switch_name_ncbi_id(orthoxml , mapdict = None ): orthoxml = ET.tostring(root, encoding='unicode', method='xml') return orthoxml -def get_ham_treemap_from_row(row, tree , level = None , swap_ids = True , orthoXML_as_string = True ): +def reformat_treenames( tree , mapdict = None ): + #tree is an ete3 tree instance + #replace ( ) - / . and spaces with underscores + + #iterate over all nodes + for node in tree.traverse(): + if mapdict: + node.name = mapdict[node.name] + else: + node.name = node.name.replace('(', '').replace(')', '').replace('-', '_').replace('/', '_') + return tree + +def reformat_names_orthoxml(orthoxml , mapdict = None ): + #replace ( ) - / . and spaces with underscores + root = ET.fromstring(orthoxml) + for child in root: + if 'species' in child.tag: + child.attrib['name'] = child.attrib['name'].replace('(', '').replace(')', '').replace('-', '_').replace('/', '_') + elif mapdict: + child.attrib['name'] = mapdict[child.attrib['name']] + orthoxml = ET.tostring(root, encoding='unicode', method='xml') + return orthoxml + +def create_nodemapping(tree): + #create a mapping from node name to node + nodemapping = {} + for i,node in enumerate(tree.traverse()): + nodemapping[node.name] = str(i) + + #assert number of nodes is equal to number of unique names + assert len([n for n in tree.traverse()]) == len(set(nodemapping.values())) + + return nodemapping + +def tree2numerical(tree): + mapper = create_nodemapping(tree) + for i,node in enumerate(tree.traverse()): + node.name = mapper[node.name] + return tree , mapper + +def orthoxml2numerical(orthoxml , mapper): + root = ET.fromstring(orthoxml) + for child in root: + if 'name' in child.attrib: + child.attrib['name'] = mapper[child.attrib['name']] + orthoxml = ET.tostring(root, encoding='unicode', method='xml') + return orthoxml + +def get_ham_treemap_from_row(row, tree , level = None , swap_ids = True , orthoXML_as_string = True , use_phyloxml = False , use_internal_name = True ,reformat_names= False, orthomapper = None ): fam, orthoxml = row + format = 'newick_string' + if use_phyloxml: + format = 'phyloxml' if orthoxml: + if swap_ids == True and orthoXML_as_string == True: + orthoxml = switch_name_ncbi_id(orthoxml) + quoted = False + elif reformat_names == True and orthoXML_as_string == True: + orthoxml = orthoxml2numerical(orthoxml , orthomapper) + quoted = False + else: + quoted = True try: - if swap_ids == True and orthoXML_as_string == True: - orthoxml = switch_name_ncbi_id(orthoxml) - quoted = False - else: - quoted = True - ham_obj = pyham.Ham(tree, orthoxml, type_hog_file="orthoxml" , tree_format = 'newick_string' ,use_internal_name=True, orthoXML_as_string=orthoXML_as_string ) - + ham_obj = pyham.Ham(tree, orthoxml, type_hog_file="orthoxml" , tree_format = format , use_internal_name=use_internal_name, orthoXML_as_string=orthoXML_as_string ) tp = ham_obj.create_tree_profile(hog=ham_obj.get_list_top_level_hogs()[0]) return tp.treemap - except: - print('error' , traceback.format_exc()) - return None - + except Exception as e: + # Capture the exception and format the traceback + full_error_message = str(e) + if 'TypeError: species name ' in full_error_message and 'maps to an ancestral name, not a leaf' in full_error_message: + print('error' , full_error_message) + #species name from bullshit error + #TypeError: species name '3515' maps to an ancestral name, not a leaf of the taxono + species = full_error_message.split('species name ')[1].split(' ')[0].replace('\'','') + print( 'trim tree'+species) + tree = ete3.Tree(tree , format = 1) + #select all nodes with name = species + nodes = tree.search_nodes(name = species) + #get the first node + node = nodes[0] + for c in node.children: + #delete all children + c.delete() + #rerun with trimmed tree + ham_obj = pyham.Ham(tree.write(format=1), orthoxml, type_hog_file="orthoxml" , tree_format = format , use_internal_name=use_internal_name, orthoXML_as_string=orthoXML_as_string ) + else: + print('error' , full_error_message) + return None def yield_families(h5file, start_fam): """ diff --git a/test/reformatted_tree.nw b/test/reformatted_tree.nw new file mode 100644 index 0000000..7414626 --- /dev/null +++ b/test/reformatted_tree.nw @@ -0,0 +1 @@ +((4:1,5:1,(175:1,176:1,177:1,178:1)1:1,7:1,8:1,((507:1,508:1,509:1,510:1)1:1,(511:1,((1224:1,1225:1)1:1,778:1,779:1,(1226:1,1227:1)1:1)1:1,(781:1,782:1)1:1,((1228:1,1229:1)1:1,784:1,(1230:1,1231:1)1:1,(1232:1,1233:1)1:1)1:1,(787:1,788:1,789:1,(1234:1,1235:1)1:1,(1236:1,1237:1)1:1,792:1)1:1)1:1,((793:1,794:1)1:1,517:1)1:1,182:1,(518:1,(795:1,796:1)1:1,520:1,(797:1,798:1)1:1,522:1,523:1)1:1,184:1,((799:1,800:1,801:1,802:1,803:1,(1238:1,1239:1,1240:1)1:1)1:1,(805:1,806:1,807:1)1:1)1:1,186:1)1:1,10:1,11:1,((526:1,527:1,528:1,529:1,530:1)1:1,188:1,(531:1,532:1)1:1)1:1,((((1241:1,1242:1,1243:1,1244:1)1:1,809:1)1:1,(((1926:1,1927:1)1:1,1246:1,1247:1,1248:1,1249:1,1250:1)1:1,(1251:1,1252:1)1:1,812:1)1:1)1:1,191:1)1:1,((535:1,536:1,537:1,538:1,539:1)1:1,(540:1,541:1,542:1,543:1)1:1,(544:1,545:1)1:1,195:1)1:1,15:1,((546:1,547:1)1:1,197:1,198:1)1:1,(199:1,200:1)1:1,18:1,(201:1,202:1,203:1,204:1,205:1,((813:1,814:1)1:1,(815:1,(1253:1,1254:1)1:1)1:1,(817:1,(1255:1,1256:1)1:1)1:1)1:1)1:1,(207:1,208:1,209:1,((819:1,820:1)1:1,552:1)1:1,211:1,212:1,(553:1,((1257:1,1258:1,1259:1)1:1,((1928:1,1929:1)1:1,(1930:1,1931:1)1:1,1262:1,1263:1)1:1,823:1,824:1,825:1,(1264:1,1265:1,1266:1)1:1,(1267:1,(1932:1,1933:1)1:1,((2628:1,2629:1,2630:1,2631:1,2632:1,2633:1,2634:1,2635:1,2636:1)1:1,(2637:1,2638:1)1:1)1:1,1270:1,1271:1)1:1)1:1,555:1,((1272:1,(1936:1,1937:1)1:1)1:1,((1938:1,1939:1,1940:1,1941:1,1942:1,1943:1)1:1,(1944:1,1945:1)1:1)1:1)1:1)1:1)1:1,21:1)1:1,(22:1,23:1,(214:1,215:1,216:1,217:1,218:1)1:1,25:1,26:1,((((1276:1,1277:1,1278:1,(1946:1,1947:1)1:1)1:1,831:1)1:1,558:1)1:1,220:1,221:1,222:1,223:1,224:1,225:1,226:1,227:1)1:1,(228:1,(559:1,((1280:1,1281:1)1:1,833:1,(1282:1,(1948:1,1949:1,1950:1,1951:1,1952:1,1953:1)1:1,1284:1,(1954:1,1955:1)1:1,1286:1,1287:1,1288:1,(1956:1,1957:1,1958:1,1959:1,1960:1,1961:1)1:1,1290:1,(1962:1,1963:1)1:1)1:1,835:1,((1964:1,1965:1,1966:1)1:1,1293:1,1294:1,1295:1,1296:1)1:1,837:1,(1297:1,1298:1)1:1,839:1,((1967:1,1968:1)1:1,1300:1,1301:1,(1969:1,1970:1)1:1)1:1,(1303:1,1304:1,1305:1,1306:1,1307:1,(1971:1,1972:1)1:1,1309:1,(1973:1,1974:1)1:1)1:1)1:1,((1311:1,1312:1,1313:1,1314:1)1:1,(1315:1,1316:1,1317:1)1:1,((1975:1,1976:1,1977:1)1:1,(1978:1,(2639:1,2640:1)1:1,1980:1,1981:1,1982:1)1:1,1320:1)1:1,((1983:1,(2641:1,2642:1,2643:1,2644:1,2645:1,2646:1,2647:1,2648:1,2649:1,2650:1,2651:1)1:1,1985:1,(2652:1,2653:1,2654:1)1:1,1987:1,1988:1,1989:1,(2655:1,2656:1,2657:1,2658:1)1:1,1991:1,1992:1,1993:1,1994:1)1:1,(1995:1,1996:1)1:1,1323:1,((2659:1,2660:1)1:1,1998:1,1999:1,(2661:1,2662:1)1:1,2001:1,2002:1,2003:1,2004:1,(2663:1,2664:1)1:1,2006:1,2007:1,2008:1,2009:1,(2665:1,2666:1)1:1,(2667:1,2668:1)1:1,(2669:1,2670:1,2671:1)1:1,2013:1,2014:1,2015:1,2016:1,2017:1,(2672:1,2673:1,2674:1,2675:1,2676:1,2677:1,2678:1,2679:1,2680:1,2681:1,2682:1)1:1)1:1,(2019:1,2020:1)1:1,(2021:1,2022:1,2023:1,2024:1)1:1,1327:1,1328:1)1:1,846:1,((2025:1,2026:1)1:1,(2027:1,2028:1)1:1,1331:1,1332:1,1333:1,1334:1)1:1)1:1,(848:1,(1335:1,1336:1)1:1,(1337:1,1338:1,(2029:1,2030:1)1:1,1340:1,1341:1)1:1)1:1,(851:1,((2031:1,2032:1,2033:1)1:1,(2034:1,2035:1,2036:1,2037:1,2038:1,2039:1,2040:1,2041:1,2042:1,2043:1,2044:1,2045:1,2046:1,2047:1,2048:1,2049:1,2050:1,2051:1,2052:1,2053:1,2054:1,2055:1,2056:1,2057:1,2058:1)1:1)1:1)1:1,((1344:1,1345:1)1:1,854:1,855:1,856:1,857:1)1:1)1:1,230:1,((858:1,859:1)1:1,566:1,(860:1,861:1,862:1,863:1)1:1)1:1,232:1,233:1,234:1,235:1)1:1,29:1,((((1346:1,1347:1,1348:1)1:1,865:1)1:1,(866:1,(1349:1,1350:1)1:1)1:1)1:1,(570:1,571:1)1:1)1:1,(238:1,239:1,240:1,241:1,242:1,243:1,244:1,245:1)1:1,(246:1,247:1)1:1,33:1,34:1,35:1,36:1,(248:1,((868:1,(((2683:1,2684:1,2685:1)1:1,2060:1,2061:1,2062:1)1:1,(2063:1,2064:1)1:1,(2065:1,2066:1,2067:1,2068:1,2069:1)1:1)1:1,870:1,871:1,((2070:1,2071:1,(2686:1,2687:1)1:1)1:1,1355:1)1:1,873:1,(1356:1,1357:1)1:1)1:1,((1358:1,1359:1,1360:1)1:1,(1361:1,1362:1)1:1)1:1,(877:1,878:1,(1363:1,1364:1,1365:1,1366:1,1367:1)1:1,880:1,(1368:1,1369:1,1370:1,1371:1,1372:1)1:1)1:1,(((2073:1,2074:1)1:1,1374:1)1:1,883:1,(1375:1,(2075:1,2076:1,2077:1)1:1,(2078:1,2079:1)1:1,1378:1,1379:1,(2080:1,2081:1,2082:1,2083:1,2084:1,2085:1,2086:1)1:1,1381:1,1382:1,1383:1,1384:1,1385:1,1386:1,1387:1,(2087:1,2088:1)1:1,1389:1,1390:1,1391:1,1392:1)1:1,885:1,(1393:1,1394:1,1395:1,1396:1,1397:1)1:1)1:1,(887:1,888:1,889:1,890:1)1:1)1:1,(((1398:1,1399:1)1:1,(1400:1,1401:1,1402:1,1403:1,1404:1,1405:1)1:1,893:1,894:1)1:1,578:1)1:1,(579:1,580:1)1:1,252:1,253:1,254:1,(581:1,(895:1,896:1)1:1)1:1,256:1,257:1)1:1,(258:1,259:1,260:1,261:1,(583:1,584:1)1:1,263:1,264:1,265:1)1:1,39:1,40:1,41:1,42:1,(266:1,267:1)1:1,44:1,45:1,46:1,(268:1,269:1,270:1)1:1,48:1,49:1,50:1,((((1406:1,1407:1)1:1,(1408:1,(2089:1,2090:1)1:1,1410:1,((2688:1,2689:1,2690:1,2691:1,2692:1,2693:1,2694:1,2695:1,2696:1)1:1,2092:1)1:1)1:1,((2093:1,(2697:1,2698:1,2699:1,2700:1,2701:1,2702:1,2703:1,2704:1)1:1,(2705:1,2706:1,2707:1)1:1,(2708:1,2709:1,2710:1,2711:1,2712:1,2713:1,2714:1,2715:1,2716:1,2717:1,2718:1)1:1,2097:1)1:1,(2098:1,2099:1)1:1,(2100:1,2101:1)1:1,1415:1,1416:1)1:1,900:1,(1417:1,(2102:1,2103:1)1:1)1:1,(1419:1,1420:1)1:1,(1421:1,1422:1)1:1)1:1,586:1)1:1,272:1)1:1,(((904:1,(1423:1,1424:1,1425:1,1426:1,1427:1,1428:1,1429:1,1430:1,1431:1,1432:1,1433:1,1434:1,1435:1,1436:1,1437:1,1438:1,1439:1)1:1)1:1,(906:1,907:1,908:1,909:1,(1440:1,1441:1)1:1,(1442:1,1443:1)1:1)1:1)1:1,(589:1,590:1)1:1,275:1,276:1)1:1,((591:1,592:1)1:1,(((1444:1,(2104:1,2105:1)1:1)1:1,913:1,(1446:1,1447:1)1:1)1:1,594:1,(915:1,916:1)1:1)1:1,279:1,((917:1,918:1,(1448:1,1449:1,1450:1)1:1)1:1,597:1)1:1,281:1,282:1,283:1,284:1,285:1,286:1)1:1,54:1,55:1,56:1,(((920:1,921:1,(1451:1,1452:1,1453:1)1:1,(1454:1,1455:1,1456:1)1:1,((2106:1,2107:1)1:1,1458:1)1:1,(1459:1,1460:1,(2108:1,2109:1)1:1,1462:1)1:1,(1463:1,1464:1,(2110:1,2111:1,2112:1)1:1,1466:1)1:1,927:1,928:1)1:1,599:1,(929:1,930:1,(1467:1,1468:1,1469:1,1470:1,1471:1,1472:1)1:1,(1473:1,1474:1)1:1,(1475:1,1476:1)1:1,934:1,935:1,(1477:1,1478:1,1479:1)1:1,(1480:1,1481:1,1482:1)1:1)1:1,(938:1,939:1)1:1,602:1,(940:1,941:1)1:1,(942:1,943:1,944:1,945:1)1:1)1:1,288:1,289:1)1:1,58:1,59:1,(290:1,291:1,292:1,293:1)1:1,(((946:1,947:1,948:1,949:1,950:1)1:1,606:1,607:1)1:1,(608:1,609:1)1:1,(610:1,611:1,(951:1,952:1,953:1)1:1)1:1,297:1)1:1,62:1,63:1,(298:1,299:1,300:1,((954:1,955:1)1:1,(956:1,957:1)1:1,615:1)1:1,(616:1,(958:1,959:1)1:1,618:1)1:1,303:1,(619:1,(((2113:1,(2719:1,2720:1)1:1)1:1,(2115:1,2116:1,2117:1)1:1,(2118:1,2119:1)1:1)1:1,(1486:1,1487:1)1:1)1:1)1:1,305:1,306:1,307:1,308:1,309:1,310:1,311:1,312:1,(621:1,622:1)1:1,314:1,315:1)1:1,65:1,66:1,67:1,68:1,(316:1,317:1,(623:1,624:1,625:1,626:1,627:1,(962:1,963:1,964:1)1:1,629:1,(965:1,966:1)1:1,631:1)1:1)1:1,(319:1,320:1)1:1,71:1,72:1,(321:1,322:1,323:1)1:1,(324:1,325:1,326:1,327:1)1:1,75:1,76:1,77:1,(328:1,329:1)1:1,(((967:1,(1488:1,1489:1,1490:1,1491:1)1:1)1:1,(969:1,970:1,971:1)1:1,((1492:1,(2120:1,(2721:1,2722:1)1:1)1:1,((2723:1,2724:1)1:1,2123:1)1:1)1:1,(1495:1,1496:1,1497:1,1498:1,(2124:1,2125:1)1:1,(2126:1,2127:1)1:1,1501:1)1:1,((2128:1,2129:1,2130:1,2131:1,2132:1,2133:1,2134:1,2135:1,2136:1)1:1,(2137:1,2138:1,2139:1)1:1,1504:1,1505:1,(2140:1,2141:1,2142:1,2143:1)1:1,1507:1)1:1,(1508:1,1509:1)1:1)1:1,(976:1,977:1)1:1,(978:1,979:1)1:1,(980:1,981:1)1:1,((1510:1,1511:1,1512:1,1513:1)1:1,(1514:1,1515:1)1:1)1:1,639:1,640:1,(984:1,(1516:1,1517:1)1:1)1:1,642:1,(986:1,987:1,((2144:1,2145:1,2146:1)1:1,((2725:1,2726:1)1:1,2148:1)1:1,1520:1,(2149:1,2150:1)1:1,1522:1)1:1,(1523:1,((2727:1,2728:1)1:1,(2729:1,2730:1)1:1)1:1,(2153:1,2154:1,2155:1)1:1,(2156:1,(2731:1,2732:1)1:1,2158:1,(2733:1,2734:1,2735:1,2736:1)1:1,2160:1,2161:1,(2737:1,2738:1)1:1,2163:1)1:1,1527:1,1528:1,(2164:1,2165:1,2166:1,2167:1,2168:1,2169:1)1:1,1530:1,(2170:1,(2739:1,2740:1)1:1)1:1,((2741:1,2742:1)1:1,(2743:1,2744:1)1:1,2174:1)1:1,1533:1,(2175:1,2176:1)1:1,(2177:1,2178:1)1:1)1:1,(1536:1,1537:1,(2179:1,2180:1,2181:1)1:1,(2182:1,2183:1)1:1,(2184:1,2185:1,2186:1)1:1,1541:1,1542:1)1:1,(((2745:1,2746:1,2747:1)1:1,(2748:1,2749:1)1:1,(2750:1,2751:1,2752:1)1:1)1:1,((2753:1,2754:1,2755:1,2756:1)1:1,(2757:1,2758:1)1:1,(2759:1,2760:1,2761:1,2762:1)1:1,(2763:1,2764:1,2765:1)1:1,2194:1,2195:1,2196:1,2197:1,2198:1,(2766:1,2767:1)1:1,2200:1,2201:1,2202:1,(2768:1,2769:1,2770:1,2771:1,2772:1,2773:1,2774:1,2775:1,2776:1,2777:1,2778:1,2779:1,2780:1,2781:1,2782:1,2783:1,2784:1)1:1,2204:1,(2785:1,2786:1,2787:1,2788:1,2789:1,2790:1,2791:1,2792:1,2793:1,2794:1,2795:1,2796:1)1:1,(2797:1,2798:1,2799:1)1:1,2207:1,(2800:1,2801:1,2802:1,2803:1,2804:1,2805:1,2806:1)1:1,(2807:1,2808:1,2809:1,2810:1)1:1,2210:1)1:1)1:1)1:1,((((2811:1,2812:1,2813:1,2814:1)1:1,(2815:1,2816:1)1:1)1:1,(2213:1,2214:1)1:1,1547:1,(2215:1,(2817:1,2818:1)1:1,(2819:1,2820:1,2821:1)1:1)1:1,(2218:1,2219:1,2220:1)1:1,1550:1)1:1,(1551:1,(2221:1,(2822:1,2823:1)1:1,(2824:1,2825:1)1:1,2224:1)1:1)1:1,((2225:1,(2826:1,2827:1)1:1,2227:1)1:1,(2228:1,(2828:1,2829:1)1:1)1:1,1555:1,((2830:1,2831:1,2832:1)1:1,2231:1,(2833:1,2834:1)1:1)1:1,((2835:1,2836:1)1:1,2234:1)1:1)1:1)1:1,(995:1,((2235:1,2236:1,2237:1,2238:1)1:1,1559:1,1560:1)1:1)1:1,(997:1,((2239:1,2240:1,2241:1,2242:1,2243:1,2244:1,2245:1,2246:1,2247:1,2248:1,2249:1,2250:1,2251:1,2252:1,2253:1,2254:1,2255:1,2256:1,2257:1,2258:1,2259:1,2260:1,2261:1)1:1,1562:1,(2262:1,2263:1)1:1,1564:1,1565:1,1566:1,(2264:1,2265:1)1:1,1568:1)1:1)1:1,647:1)1:1,331:1)1:1,(332:1,(((1569:1,(2266:1,2267:1)1:1)1:1,1000:1)1:1,((1571:1,1572:1,1573:1)1:1,(1574:1,1575:1)1:1,(1576:1,1577:1,1578:1,1579:1,1580:1,1581:1,1582:1,1583:1,1584:1)1:1,1004:1,1005:1,1006:1,(1585:1,1586:1,1587:1)1:1,(1588:1,1589:1)1:1,1009:1)1:1,650:1,(1010:1,(1590:1,1591:1,1592:1,1593:1,1594:1,1595:1,1596:1,1597:1)1:1)1:1,652:1,(1012:1,1013:1,(1598:1,1599:1,1600:1)1:1)1:1,((1601:1,1602:1)1:1,(1603:1,1604:1)1:1,(1605:1,1606:1)1:1)1:1,655:1,(1018:1,(1607:1,1608:1)1:1)1:1)1:1,((1020:1,1021:1,1022:1,1023:1,1024:1,1025:1,1026:1)1:1,(1027:1,((2268:1,2269:1,2270:1)1:1,(2271:1,2272:1)1:1)1:1,(1611:1,1612:1,1613:1)1:1)1:1)1:1,(659:1,660:1)1:1)1:1,(((((2273:1,(2837:1,2838:1)1:1)1:1,(2275:1,2276:1,2277:1)1:1)1:1,1031:1)1:1,662:1)1:1,(663:1,(1032:1,(1616:1,1617:1,1618:1)1:1,1034:1,1035:1)1:1)1:1,338:1,(665:1,666:1)1:1,340:1,(667:1,668:1)1:1,342:1,343:1,344:1)1:1,(345:1,((1036:1,1037:1)1:1,(1038:1,1039:1)1:1,671:1)1:1)1:1,(347:1,348:1,349:1)1:1,(350:1,351:1,352:1,(672:1,673:1)1:1,354:1,355:1,356:1)1:1,(((1040:1,1041:1)1:1,675:1)1:1,(676:1,677:1)1:1)1:1,(359:1,360:1,361:1,362:1)1:1,((678:1,679:1)1:1,(680:1,681:1,682:1)1:1)1:1,88:1,(365:1,366:1)1:1,90:1,91:1,92:1,93:1,94:1,95:1,96:1,97:1,98:1,99:1,100:1,101:1,102:1,103:1,104:1,105:1,106:1,107:1,108:1,109:1,110:1,111:1,112:1,(367:1,368:1,369:1,370:1,371:1)1:1,114:1,(372:1,373:1,374:1)1:1,(375:1,376:1,377:1,378:1)1:1,117:1,118:1,119:1,120:1,(379:1,380:1,381:1,382:1,383:1,384:1,(((1619:1,1620:1)1:1,1043:1,1044:1)1:1,(1045:1,(1621:1,1622:1,1623:1)1:1,1047:1)1:1)1:1,(685:1,686:1)1:1,387:1,388:1,389:1,390:1,391:1,392:1,393:1)1:1,(394:1,395:1)1:1,123:1,(396:1,397:1,398:1,399:1,400:1)1:1,125:1,(401:1,402:1,403:1,404:1,405:1,406:1)1:1,(407:1,408:1)1:1,128:1,(409:1,410:1)1:1,(411:1,412:1,413:1,414:1,415:1,416:1,417:1,418:1,419:1,420:1,421:1,422:1,423:1,424:1,425:1,426:1,427:1,428:1,429:1,430:1,431:1)1:1,(432:1,433:1,434:1,435:1,436:1,437:1,438:1,439:1,440:1,441:1,442:1,443:1,444:1,445:1,((1048:1,1049:1)1:1,(1050:1,1051:1)1:1,(1052:1,1053:1)1:1)1:1,447:1,448:1,449:1,450:1)1:1,(451:1,452:1)1:1,(((1054:1,(1624:1,1625:1)1:1,1056:1,1057:1,1058:1,1059:1)1:1,(1060:1,1061:1)1:1,((1626:1,1627:1,(2278:1,2279:1,(2839:1,2840:1)1:1)1:1,1629:1)1:1,(1630:1,1631:1)1:1,1064:1,1065:1)1:1,693:1,694:1,(1066:1,1067:1)1:1,696:1,((1632:1,((2841:1,2842:1,2843:1,2844:1)1:1,2282:1,2283:1,2284:1,2285:1)1:1,1634:1,1635:1)1:1,1069:1,((2286:1,2287:1)1:1,1637:1)1:1,(1638:1,1639:1,1640:1,(2288:1,2289:1,2290:1)1:1,(2291:1,2292:1,2293:1,2294:1,2295:1,2296:1)1:1,(2297:1,2298:1,2299:1,(2845:1,2846:1,2847:1,2848:1)1:1)1:1)1:1,1072:1,(1644:1,1645:1)1:1,((2301:1,2302:1)1:1,1647:1,1648:1,(2303:1,2304:1,2305:1)1:1,(2306:1,2307:1)1:1,(2308:1,2309:1,(2849:1,2850:1)1:1,2311:1,2312:1,2313:1)1:1,1652:1,1653:1)1:1)1:1,((1654:1,1655:1,1656:1,1657:1,1658:1,1659:1,1660:1)1:1,(1661:1,1662:1,1663:1,1664:1,1665:1,1666:1,1667:1,1668:1,1669:1,1670:1,1671:1)1:1,1077:1,1078:1)1:1,(1079:1,(1672:1,(2314:1,2315:1,2316:1)1:1)1:1,1081:1,1082:1,(1674:1,1675:1)1:1,1084:1,1085:1,1086:1,1087:1,1088:1,(1676:1,1677:1)1:1,1090:1)1:1,(1091:1,1092:1,1093:1)1:1,((((2851:1,2852:1)1:1,2318:1)1:1,(2319:1,2320:1,(2853:1,2854:1)1:1)1:1,(2322:1,2323:1)1:1,((2855:1,2856:1)1:1,2325:1,2326:1,2327:1)1:1)1:1,1095:1,((2328:1,2329:1)1:1,(2330:1,2331:1,(2857:1,2858:1)1:1,2333:1,2334:1,(2859:1,2860:1)1:1,(2861:1,2862:1,2863:1,2864:1)1:1,(2865:1,2866:1,2867:1,2868:1,2869:1,2870:1,2871:1,2872:1,2873:1)1:1,2338:1)1:1)1:1)1:1,(1097:1,1098:1,1099:1,1100:1,(1684:1,1685:1)1:1,((2339:1,2340:1,2341:1)1:1,1687:1)1:1)1:1,703:1)1:1,(((1688:1,1689:1)1:1,1104:1)1:1,(1105:1,(1690:1,1691:1,(2342:1,2343:1)1:1,1693:1,1694:1,(2344:1,(2874:1,2875:1,2876:1,2877:1,2878:1,2879:1)1:1)1:1,1696:1,((2880:1,2881:1)1:1,2347:1,(2882:1,2883:1,2884:1)1:1,2349:1,2350:1,2351:1,(2885:1,2886:1,2887:1,2888:1,2889:1,2890:1,2891:1,2892:1)1:1,2353:1,2354:1,2355:1)1:1,1698:1,(2356:1,2357:1)1:1,(2358:1,(2893:1,2894:1)1:1,2360:1,2361:1)1:1,(2362:1,2363:1)1:1,1702:1,(2364:1,2365:1)1:1,1704:1,1705:1,1706:1,1707:1,(2366:1,2367:1,2368:1,2369:1)1:1,(2370:1,2371:1)1:1,(2372:1,2373:1)1:1,1711:1,((2895:1,2896:1)1:1,(2897:1,2898:1)1:1,2376:1)1:1,1713:1,1714:1,1715:1,1716:1,1717:1,(2377:1,2378:1)1:1)1:1,(1719:1,1720:1)1:1,(1721:1,1722:1)1:1,(1723:1,1724:1,(2379:1,2380:1)1:1)1:1,((2381:1,2382:1)1:1,(2383:1,2384:1,2385:1,2386:1,2387:1,2388:1,2389:1,2390:1,2391:1,2392:1,2393:1,2394:1,2395:1,2396:1)1:1)1:1,((2397:1,2398:1,2399:1)1:1,1729:1)1:1,(1730:1,1731:1,1732:1,1733:1,1734:1,1735:1)1:1,1113:1)1:1,(1114:1,1115:1)1:1,((1736:1,1737:1)1:1,1117:1)1:1,(1118:1,1119:1,1120:1,1121:1,1122:1)1:1,(1123:1,1124:1)1:1,(((2400:1,2401:1,2402:1)1:1,1739:1,1740:1)1:1,((2403:1,(2899:1,2900:1)1:1,2405:1,2406:1)1:1,1742:1,1743:1,1744:1,(2407:1,2408:1)1:1)1:1,(1746:1,1747:1,1748:1,(2409:1,2410:1)1:1,(2411:1,2412:1,2413:1,2414:1)1:1,(2415:1,(2901:1,2902:1)1:1)1:1,(2417:1,2418:1)1:1,1753:1,((2903:1,2904:1)1:1,2420:1,(2905:1,2906:1,2907:1)1:1,2422:1)1:1,((2908:1,2909:1,2910:1,2911:1,2912:1,2913:1,2914:1,2915:1,2916:1,2917:1,2918:1,2919:1,2920:1,2921:1,2922:1,2923:1,2924:1,2925:1,2926:1,2927:1,2928:1,2929:1,2930:1,2931:1,2932:1,2933:1,2934:1,2935:1,2936:1,2937:1,2938:1,2939:1,2940:1,2941:1,2942:1,2943:1,2944:1,2945:1,2946:1,2947:1,2948:1,2949:1,2950:1,2951:1,2952:1,2953:1,2954:1,2955:1)1:1,2424:1,2425:1)1:1,1756:1,(2426:1,2427:1,(2956:1,2957:1)1:1,(2958:1,2959:1)1:1)1:1,1758:1,1759:1,((2960:1,2961:1)1:1,2431:1,2432:1)1:1,(2433:1,2434:1,(2962:1,2963:1)1:1)1:1,(2436:1,2437:1)1:1,1763:1,(2438:1,2439:1)1:1,1765:1,(2440:1,2441:1)1:1,(2442:1,2443:1,(2964:1,2965:1,2966:1,2967:1,2968:1,2969:1,2970:1,2971:1,2972:1,2973:1,2974:1,2975:1,2976:1,2977:1,2978:1,2979:1,2980:1,2981:1,2982:1)1:1)1:1,(2445:1,2446:1)1:1,1769:1,1770:1,1771:1,(2447:1,2448:1)1:1,((2983:1,2984:1,2985:1)1:1,(2986:1,2987:1,2988:1,2989:1,2990:1,2991:1,2992:1,2993:1,2994:1,2995:1,2996:1,2997:1,2998:1)1:1,2451:1)1:1)1:1,1128:1,((2452:1,2453:1,2454:1)1:1,(2455:1,2456:1)1:1,1776:1,1777:1,1778:1,1779:1,1780:1,(2457:1,2458:1,2459:1,2460:1,2461:1,2462:1,2463:1)1:1,1782:1,1783:1,(2464:1,2465:1)1:1,(2466:1,2467:1)1:1)1:1,1130:1,(1786:1,(2468:1,(2999:1,3000:1,3001:1,3002:1,3003:1)1:1,2470:1,2471:1,2472:1,2473:1,2474:1,2475:1,2476:1,(3004:1,3005:1,3006:1)1:1,2478:1,(3007:1,3008:1)1:1,2480:1,2481:1,2482:1)1:1)1:1,(((3009:1,3010:1)1:1,2484:1)1:1,1789:1,(2485:1,2486:1,(3011:1,3012:1,3013:1,3014:1)1:1,2488:1,2489:1,2490:1,2491:1,2492:1,2493:1,(3015:1,3016:1,3017:1)1:1)1:1)1:1)1:1,((1791:1,1792:1,1793:1)1:1,(1794:1,1795:1,(2495:1,2496:1,2497:1,2498:1,2499:1,2500:1)1:1,1797:1,1798:1)1:1,1135:1,1136:1,1137:1)1:1,(1138:1,1139:1,(1799:1,1800:1,1801:1,1802:1,1803:1,1804:1,1805:1,1806:1,1807:1,1808:1)1:1)1:1,713:1,((1809:1,(2501:1,2502:1,2503:1,2504:1,2505:1)1:1)1:1,1142:1,1143:1)1:1,(1144:1,1145:1,(1811:1,1812:1,1813:1)1:1)1:1,716:1,(1147:1,1148:1)1:1,((1814:1,1815:1)1:1,(1816:1,1817:1,1818:1)1:1)1:1,(1151:1,1152:1)1:1,((1819:1,1820:1)1:1,(1821:1,1822:1,1823:1,1824:1)1:1,(1825:1,1826:1,1827:1)1:1,(1828:1,1829:1)1:1,(((3018:1,3019:1,3020:1,3021:1,3022:1,3023:1,3024:1,3025:1)1:1,2507:1,2508:1,2509:1)1:1,((3026:1,3027:1)1:1,2511:1)1:1,(2512:1,2513:1,2514:1)1:1)1:1,1158:1,(1833:1,(2515:1,2516:1)1:1)1:1,(1835:1,((3028:1,3029:1,3030:1)1:1,2518:1,2519:1)1:1,(2520:1,2521:1)1:1,(2522:1,2523:1,2524:1,2525:1,2526:1,2527:1,2528:1,(3031:1,3032:1,3033:1)1:1,2530:1,2531:1,2532:1,2533:1,2534:1,2535:1,2536:1)1:1)1:1)1:1,((1839:1,1840:1)1:1,1162:1)1:1,(1163:1,(1841:1,1842:1,1843:1,(2537:1,2538:1)1:1,((3034:1,3035:1,3036:1)1:1,2540:1,(3037:1,3038:1,3039:1)1:1,2542:1)1:1,1846:1,(2543:1,2544:1,2545:1,2546:1,2547:1)1:1)1:1)1:1)1:1,455:1,456:1)1:1,134:1,(457:1,458:1)1:1,136:1,137:1,138:1,139:1,140:1,(459:1,(723:1,724:1,725:1,726:1)1:1,461:1,462:1,463:1,464:1,((((2548:1,2549:1)1:1,(2550:1,2551:1,2552:1)1:1)1:1,(1850:1,1851:1)1:1)1:1,728:1)1:1,(((1852:1,(2553:1,2554:1,2555:1)1:1,1854:1)1:1,(1855:1,(2556:1,2557:1,2558:1)1:1,1857:1)1:1)1:1,730:1,731:1,((1858:1,1859:1)1:1,1170:1)1:1,(1171:1,1172:1)1:1,((1860:1,1861:1,1862:1)1:1,((2559:1,2560:1,2561:1,2562:1,2563:1,2564:1)1:1,1864:1,1865:1,1866:1)1:1)1:1)1:1,467:1,468:1)1:1,142:1,(469:1,470:1,471:1,472:1)1:1,144:1,145:1,146:1,147:1,148:1,((735:1,(1175:1,1176:1,1177:1)1:1)1:1,(737:1,((1867:1,1868:1)1:1,(1869:1,1870:1)1:1)1:1,((1871:1,1872:1)1:1,1181:1,(1873:1,1874:1)1:1)1:1)1:1)1:1,150:1,151:1,152:1,153:1,154:1,(475:1,476:1,477:1,478:1)1:1,156:1,157:1,158:1,159:1,160:1,(479:1,(740:1,(1183:1,1184:1)1:1,742:1,743:1)1:1)1:1,(481:1,482:1,483:1,484:1,485:1)1:1,163:1,164:1)1:1,(((744:1,(1185:1,1186:1)1:1,746:1)1:1,((1187:1,1188:1)1:1,((1875:1,1876:1)1:1,1190:1)1:1)1:1)1:1,166:1,(488:1,489:1)1:1,((749:1,((((3040:1,3041:1)1:1,2566:1,2567:1,2568:1)1:1,(2569:1,2570:1)1:1)1:1,(1879:1,1880:1,1881:1,1882:1,1883:1)1:1)1:1)1:1,491:1)1:1,169:1,((751:1,752:1,753:1)1:1,493:1)1:1,((754:1,755:1)1:1,495:1,((((2571:1,2572:1,(3042:1,3043:1,3044:1,3045:1)1:1,2574:1,2575:1)1:1,(((3124:1,3125:1)1:1,(3126:1,3127:1)1:1,((((3331:1,3332:1)1:1,3276:1)1:1,((((3467:1,3468:1,3469:1,3470:1,3471:1,((3619:1,3620:1)1:1,3555:1,3556:1,3557:1,3558:1)1:1,(3559:1,3560:1,3561:1)1:1,(3562:1,(3621:1,3622:1)1:1)1:1,3475:1,3476:1,3477:1)1:1,((3564:1,3565:1)1:1,3479:1,3480:1,3481:1,3482:1,3483:1,3484:1)1:1)1:1,(3399:1,3400:1)1:1)1:1,((3401:1,(3485:1,3486:1,3487:1)1:1)1:1,(3403:1,3404:1,(3488:1,3489:1,3490:1)1:1)1:1,((3491:1,3492:1)1:1,3407:1)1:1,(3408:1,3409:1)1:1)1:1)1:1)1:1,3129:1,((3279:1,3280:1)1:1,((3339:1,3340:1)1:1,((3410:1,3411:1,3412:1,(3493:1,3494:1)1:1)1:1,3342:1)1:1)1:1,(3283:1,3284:1,(3343:1,3344:1)1:1,(3345:1,(3414:1,3415:1)1:1,3347:1,3348:1)1:1)1:1)1:1,(((3349:1,3350:1)1:1,(3351:1,3352:1,(3416:1,3417:1)1:1)1:1,3289:1)1:1,((((3495:1,(3566:1,3567:1)1:1)1:1,(3497:1,(3568:1,3569:1)1:1)1:1)1:1,((3499:1,3500:1)1:1,(3501:1,3502:1,3503:1)1:1,(3504:1,3505:1,3506:1,3507:1)1:1,(3508:1,(3570:1,3571:1)1:1,(3572:1,3573:1,3574:1)1:1,(3575:1,3576:1)1:1)1:1,3424:1,3425:1)1:1,3356:1)1:1,(3357:1,(3426:1,(3512:1,3513:1)1:1)1:1,3359:1,(((3577:1,3578:1)1:1,(3579:1,3580:1)1:1)1:1,((3581:1,3582:1)1:1,3517:1)1:1)1:1)1:1,(3361:1,3362:1,3363:1)1:1)1:1)1:1)1:1)1:1,(((((3364:1,3365:1)1:1,3294:1)1:1,3218:1)1:1,3133:1,3134:1,3135:1,3136:1,3137:1,3138:1)1:1,3050:1,(3139:1,3140:1)1:1,((3219:1,3220:1)1:1,3142:1)1:1,(3143:1,3144:1)1:1,((3221:1,3222:1)1:1,3146:1,3147:1,(3223:1,3224:1)1:1,3149:1,(3225:1,3226:1)1:1,(3227:1,3228:1,3229:1,3230:1)1:1,(3231:1,3232:1)1:1,3153:1,3154:1)1:1,3055:1)1:1)1:1)1:1,((((3155:1,3156:1,3157:1,(3233:1,3234:1)1:1,3159:1,(3235:1,3236:1,3237:1,3238:1,(3295:1,3296:1)1:1,(3297:1,(3366:1,3367:1,3368:1)1:1)1:1)1:1,(3241:1,3242:1)1:1,3162:1)1:1,(((3299:1,3300:1)1:1,3244:1,(3301:1,3302:1)1:1,(3303:1,3304:1)1:1,(3305:1,3306:1)1:1,3248:1,3249:1)1:1,(3250:1,3251:1)1:1)1:1)1:1,2579:1,((((3307:1,3308:1)1:1,3253:1)1:1,3166:1)1:1,3059:1)1:1)1:1,((3060:1,(3167:1,3168:1)1:1)1:1,2582:1,((3169:1,3170:1)1:1,3063:1)1:1)1:1,(2584:1,(3064:1,3065:1)1:1,(3066:1,(3171:1,3172:1)1:1)1:1)1:1,(2587:1,2588:1,2589:1)1:1)1:1)1:1,(1195:1,(((3068:1,3069:1)1:1,(3070:1,3071:1)1:1)1:1,1891:1,1892:1)1:1,1197:1,((2592:1,((3173:1,3174:1)1:1,3073:1)1:1,2594:1,2595:1)1:1,(2596:1,(3074:1,3075:1)1:1)1:1,(2598:1,2599:1)1:1)1:1,(1896:1,(2600:1,((3175:1,3176:1)1:1,(3177:1,3178:1,3179:1)1:1)1:1,2602:1,2603:1)1:1)1:1,1200:1)1:1)1:1,497:1,((((((3180:1,3181:1)1:1,((3254:1,3255:1)1:1,(((3369:1,3370:1)1:1,3310:1)1:1,((3371:1,(3430:1,((((3672:1,((3764:1,3765:1)1:1,(3766:1,3767:1)1:1)1:1,(3718:1,3719:1,(3768:1,(3812:1,3813:1)1:1)1:1)1:1,(((3814:1,3815:1,3816:1)1:1,((3854:1,3855:1)1:1,(3856:1,(3894:1,(3929:1,3930:1)1:1,3896:1)1:1)1:1)1:1)1:1,3722:1,(((3858:1,3859:1)1:1,3820:1,(3860:1,3861:1)1:1)1:1,3773:1)1:1,(3774:1,3775:1)1:1)1:1,3676:1)1:1,3624:1)1:1,(3625:1,(3677:1,3678:1)1:1)1:1)1:1,(((3679:1,3680:1)1:1,3628:1,3629:1)1:1,(3630:1,3631:1)1:1)1:1)1:1)1:1)1:1,(3373:1,((((3632:1,3633:1)1:1,(((3725:1,3726:1,3727:1)1:1,((((3862:1,3863:1)1:1,(3864:1,((3931:1,3932:1)1:1,(3933:1,3934:1)1:1,3899:1,3900:1)1:1,(3901:1,(3935:1,(3956:1,3957:1)1:1,3937:1)1:1)1:1,3867:1)1:1)1:1,((((((3965:1,3966:1,(3974:1,3975:1,3976:1)1:1,3968:1,3969:1)1:1,(3970:1,(3977:1,3978:1)1:1)1:1)1:1,(((3979:1,3980:1,(3982:1,3983:1)1:1)1:1,3973:1)1:1,3961:1)1:1)1:1,(3940:1,(3962:1,3963:1,3964:1)1:1)1:1)1:1,3869:1)1:1,((3905:1,3906:1)1:1,3871:1)1:1)1:1,3778:1)1:1,((((3907:1,3908:1)1:1,(3909:1,3910:1)1:1)1:1,3827:1,3828:1,(3874:1,3875:1)1:1)1:1,(((3911:1,3912:1)1:1,3877:1,(3913:1,(3942:1,3943:1)1:1)1:1)1:1,(3879:1,3880:1)1:1)1:1,(3832:1,(3881:1,3882:1)1:1)1:1,(3834:1,3835:1)1:1,((3883:1,3884:1)1:1,3837:1)1:1,3784:1)1:1)1:1,(3730:1,3731:1)1:1)1:1,(3684:1,3685:1,(3732:1,3733:1,3734:1)1:1)1:1)1:1)1:1,(((3687:1,(3735:1,3736:1,((3838:1,3839:1)1:1,(3840:1,(3885:1,3886:1)1:1)1:1)1:1,(3787:1,3788:1,3789:1,3790:1,(3842:1,3843:1,3844:1)1:1)1:1,(3792:1,3793:1)1:1,(3794:1,3795:1)1:1)1:1)1:1,((3741:1,3742:1)1:1,3690:1)1:1)1:1,(3638:1,((3743:1,3744:1)1:1,(3745:1,3746:1,3747:1)1:1)1:1)1:1)1:1)1:1,(3522:1,(3591:1,3592:1)1:1)1:1)1:1)1:1)1:1)1:1)1:1,(3184:1,3185:1)1:1)1:1,((3186:1,(3258:1,3259:1)1:1)1:1,(3188:1,3189:1)1:1)1:1)1:1,((((((3375:1,(3434:1,3435:1,3436:1,3437:1,3438:1)1:1)1:1,(3377:1,((3524:1,3525:1,3526:1,3527:1)1:1,3440:1)1:1)1:1,(3379:1,3380:1)1:1)1:1,(3316:1,3317:1,((3441:1,3442:1)1:1,3382:1)1:1)1:1)1:1,(3262:1,3263:1)1:1)1:1,(((((3443:1,3444:1)1:1,(3445:1,3446:1)1:1)1:1,3320:1)1:1,(3321:1,((3447:1,(3528:1,3529:1)1:1)1:1,((3530:1,3531:1)1:1,(((3640:1,3641:1,((3748:1,3749:1,(3796:1,3797:1)1:1)1:1,3694:1)1:1)1:1,(3643:1,3644:1)1:1,((3695:1,(((3845:1,3846:1,(((3944:1,3945:1)1:1,3916:1,3917:1,3918:1,(3946:1,3947:1,3948:1,3949:1,3950:1)1:1,3920:1,3921:1,3922:1,3923:1)1:1,((3951:1,3952:1)1:1,(3953:1,3954:1,3955:1)1:1)1:1,3889:1)1:1,(3890:1,(3926:1,3927:1,3928:1)1:1)1:1,(3892:1,3893:1)1:1)1:1,3799:1)1:1,3752:1)1:1)1:1,(3697:1,(((3850:1,3851:1)1:1,3801:1,3802:1)1:1,((3852:1,3853:1)1:1,3804:1)1:1)1:1)1:1)1:1,(((3755:1,3756:1)1:1,(3757:1,3758:1,3759:1,(3805:1,3806:1)1:1,3761:1)1:1)1:1,(3701:1,3702:1)1:1)1:1)1:1,(((3703:1,3704:1)1:1,(3705:1,3706:1)1:1)1:1,3598:1)1:1,3534:1)1:1)1:1)1:1)1:1)1:1,3193:1)1:1,3085:1)1:1,((3194:1,(3266:1,3267:1)1:1)1:1,3087:1,(3196:1,3197:1,3198:1)1:1,(((3323:1,3324:1)1:1,3269:1)1:1,3200:1,3201:1)1:1)1:1)1:1)1:1,(1900:1,1901:1,1902:1)1:1,1203:1,1204:1)1:1,759:1)1:1,499:1)1:1,(((1205:1,1206:1)1:1,761:1)1:1,501:1)1:1,((((((3090:1,3091:1)1:1,(3092:1,3093:1,3094:1,3095:1,3096:1,3097:1)1:1,(3098:1,3099:1,3100:1,3101:1,3102:1,3103:1)1:1,(3104:1,3105:1)1:1)1:1,((3106:1,3107:1,3108:1)1:1,(3109:1,3110:1)1:1)1:1)1:1,(((3111:1,(3202:1,3203:1)1:1)1:1,(3113:1,3114:1,3115:1)1:1,(3116:1,(3204:1,3205:1)1:1)1:1)1:1,1906:1)1:1)1:1,((((3118:1,3119:1)1:1,2618:1)1:1,1908:1,1909:1)1:1,1210:1)1:1,764:1,765:1,766:1)1:1,(767:1,768:1,769:1)1:1,(770:1,((1910:1,(2619:1,2620:1)1:1)1:1,1212:1,1213:1,1214:1)1:1,((1912:1,(2621:1,2622:1,(3120:1,3121:1)1:1,2624:1,2625:1)1:1,1914:1)1:1,1216:1,(1915:1,1916:1)1:1)1:1)1:1)1:1,((((1917:1,1918:1)1:1,(1919:1,1920:1)1:1)1:1,((1921:1,1922:1)1:1,1221:1)1:1)1:1,(775:1,(1222:1,(1923:1,1924:1,((((3270:1,3271:1)1:1,3207:1)1:1,(3208:1,((3325:1,(3387:1,((((3651:1,3652:1,3653:1,3654:1,3655:1,3656:1,(3707:1,3708:1)1:1)1:1,(3658:1,(3709:1,((3807:1,3808:1)1:1,(3809:1,3810:1,3811:1)1:1)1:1)1:1)1:1)1:1,(3601:1,((3711:1,3712:1,3713:1)1:1,(3714:1,3715:1)1:1)1:1)1:1)1:1,3452:1)1:1)1:1)1:1,3273:1,((3389:1,3390:1)1:1,3328:1,(3391:1,(3453:1,(3537:1,3538:1)1:1)1:1,(3455:1,3456:1,((3603:1,3604:1)1:1,(3605:1,(3662:1,3663:1)1:1)1:1)1:1)1:1)1:1,((3458:1,(((3664:1,3665:1)1:1,(3666:1,3667:1,3668:1,3669:1)1:1)1:1,3542:1)1:1,3460:1,(3543:1,3544:1)1:1,(3545:1,((3670:1,3671:1)1:1,3610:1)1:1)1:1)1:1,((3547:1,(3611:1,3612:1,3613:1)1:1,(3614:1,3615:1)1:1,3550:1)1:1,(3551:1,3552:1,(3616:1,3617:1,3618:1)1:1)1:1,3465:1,3466:1)1:1,3396:1)1:1)1:1)1:1)1:1)1:1,2627:1)1:1)1:1)1:1)1:1)1:1)1:1); \ No newline at end of file