github.com/etsc3259/etsc@v0.0.0-20190109113336-a9c2c10f9c95/swarm/network/kademlia_test.go (about)

     1  // Copyright 2017 The go-etsc Authors
     2  // This file is part of the go-etsc library.
     3  //
     4  // The go-etsc library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-etsc library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-etsc library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package network
    18  
    19  import (
    20  	"bytes"
    21  	"fmt"
    22  	"os"
    23  	"testing"
    24  	"time"
    25  
    26  	"github.com/ETSC3259/etsc/common"
    27  	"github.com/ETSC3259/etsc/log"
    28  	"github.com/ETSC3259/etsc/swarm/pot"
    29  )
    30  
    31  func init() {
    32  	h := log.LvlFilterHandler(log.LvlWarn, log.StreamHandler(os.Stderr, log.TerminalFormat(true)))
    33  	log.Root().SetHandler(h)
    34  }
    35  
    36  func testKadPeerAddr(s string) *BzzAddr {
    37  	a := pot.NewAddressFromString(s)
    38  	return &BzzAddr{OAddr: a, UAddr: a}
    39  }
    40  
    41  func newTestKademlia(b string) *Kademlia {
    42  	params := NewKadParams()
    43  	params.MinBinSize = 1
    44  	params.MinProxBinSize = 2
    45  	base := pot.NewAddressFromString(b)
    46  	return NewKademlia(base, params)
    47  }
    48  
    49  func newTestKadPeer(k *Kademlia, s string, lightNode bool) *Peer {
    50  	return NewPeer(&BzzPeer{BzzAddr: testKadPeerAddr(s), LightNode: lightNode}, k)
    51  }
    52  
    53  func On(k *Kademlia, ons ...string) {
    54  	for _, s := range ons {
    55  		k.On(newTestKadPeer(k, s, false))
    56  	}
    57  }
    58  
    59  func Off(k *Kademlia, offs ...string) {
    60  	for _, s := range offs {
    61  		k.Off(newTestKadPeer(k, s, false))
    62  	}
    63  }
    64  
    65  func Register(k *Kademlia, regs ...string) {
    66  	var as []*BzzAddr
    67  	for _, s := range regs {
    68  		as = append(as, testKadPeerAddr(s))
    69  	}
    70  	err := k.Register(as...)
    71  	if err != nil {
    72  		panic(err.Error())
    73  	}
    74  }
    75  
    76  func testSuggestPeer(k *Kademlia, expAddr string, expPo int, expWant bool) error {
    77  	addr, o, want := k.SuggestPeer()
    78  	if binStr(addr) != expAddr {
    79  		return fmt.Errorf("incorrect peer address suggested. expected %v, got %v", expAddr, binStr(addr))
    80  	}
    81  	if o != expPo {
    82  		return fmt.Errorf("incorrect prox order suggested. expected %v, got %v", expPo, o)
    83  	}
    84  	if want != expWant {
    85  		return fmt.Errorf("expected SuggestPeer to want peers: %v", expWant)
    86  	}
    87  	return nil
    88  }
    89  
    90  func binStr(a *BzzAddr) string {
    91  	if a == nil {
    92  		return "<nil>"
    93  	}
    94  	return pot.ToBin(a.Address())[:8]
    95  }
    96  
    97  func TestSuggestPeerBug(t *testing.T) {
    98  	// 2 row gap, unsaturated proxbin, no callables -> want PO 0
    99  	k := newTestKademlia("00000000")
   100  	On(k,
   101  		"10000000", "11000000",
   102  		"01000000",
   103  
   104  		"00010000", "00011000",
   105  	)
   106  	Off(k,
   107  		"01000000",
   108  	)
   109  	err := testSuggestPeer(k, "01000000", 0, false)
   110  	if err != nil {
   111  		t.Fatal(err.Error())
   112  	}
   113  }
   114  
   115  func TestSuggestPeerFindPeers(t *testing.T) {
   116  	// 2 row gap, unsaturated proxbin, no callables -> want PO 0
   117  	k := newTestKademlia("00000000")
   118  	On(k, "00100000")
   119  	err := testSuggestPeer(k, "<nil>", 0, false)
   120  	if err != nil {
   121  		t.Fatal(err.Error())
   122  	}
   123  
   124  	// 2 row gap, saturated proxbin, no callables -> want PO 0
   125  	On(k, "00010000")
   126  	err = testSuggestPeer(k, "<nil>", 0, false)
   127  	if err != nil {
   128  		t.Fatal(err.Error())
   129  	}
   130  
   131  	// 1 row gap (1 less), saturated proxbin, no callables -> want PO 1
   132  	On(k, "10000000")
   133  	err = testSuggestPeer(k, "<nil>", 1, false)
   134  	if err != nil {
   135  		t.Fatal(err.Error())
   136  	}
   137  
   138  	// no gap (1 less), saturated proxbin, no callables -> do not want more
   139  	On(k, "01000000", "00100001")
   140  	err = testSuggestPeer(k, "<nil>", 0, false)
   141  	if err != nil {
   142  		t.Fatal(err.Error())
   143  	}
   144  
   145  	// oversaturated proxbin, > do not want more
   146  	On(k, "00100001")
   147  	err = testSuggestPeer(k, "<nil>", 0, false)
   148  	if err != nil {
   149  		t.Fatal(err.Error())
   150  	}
   151  
   152  	// reintroduce gap, disconnected peer callable
   153  	Off(k, "01000000")
   154  	err = testSuggestPeer(k, "01000000", 0, false)
   155  	if err != nil {
   156  		t.Fatal(err.Error())
   157  	}
   158  
   159  	// second time disconnected peer not callable
   160  	// with reasonably set Interval
   161  	err = testSuggestPeer(k, "<nil>", 1, true)
   162  	if err != nil {
   163  		t.Fatal(err.Error())
   164  	}
   165  
   166  	// on and off again, peer callable again
   167  	On(k, "01000000")
   168  	Off(k, "01000000")
   169  	err = testSuggestPeer(k, "01000000", 0, false)
   170  	if err != nil {
   171  		t.Fatal(err.Error())
   172  	}
   173  
   174  	On(k, "01000000")
   175  	// new closer peer appears, it is immediately wanted
   176  	Register(k, "00010001")
   177  	err = testSuggestPeer(k, "00010001", 0, false)
   178  	if err != nil {
   179  		t.Fatal(err.Error())
   180  	}
   181  
   182  	// PO1 disconnects
   183  	On(k, "00010001")
   184  	log.Info(k.String())
   185  	Off(k, "01000000")
   186  	log.Info(k.String())
   187  	// second time, gap filling
   188  	err = testSuggestPeer(k, "01000000", 0, false)
   189  	if err != nil {
   190  		t.Fatal(err.Error())
   191  	}
   192  
   193  	On(k, "01000000")
   194  	err = testSuggestPeer(k, "<nil>", 0, false)
   195  	if err != nil {
   196  		t.Fatal(err.Error())
   197  	}
   198  
   199  	k.MinBinSize = 2
   200  	err = testSuggestPeer(k, "<nil>", 0, true)
   201  	if err != nil {
   202  		t.Fatal(err.Error())
   203  	}
   204  
   205  	Register(k, "01000001")
   206  	err = testSuggestPeer(k, "01000001", 0, false)
   207  	if err != nil {
   208  		t.Fatal(err.Error())
   209  	}
   210  
   211  	On(k, "10000001")
   212  	log.Trace(fmt.Sprintf("Kad:\n%v", k.String()))
   213  	err = testSuggestPeer(k, "<nil>", 1, true)
   214  	if err != nil {
   215  		t.Fatal(err.Error())
   216  	}
   217  
   218  	On(k, "01000001")
   219  	err = testSuggestPeer(k, "<nil>", 0, false)
   220  	if err != nil {
   221  		t.Fatal(err.Error())
   222  	}
   223  
   224  	k.MinBinSize = 3
   225  	Register(k, "10000010")
   226  	err = testSuggestPeer(k, "10000010", 0, false)
   227  	if err != nil {
   228  		t.Fatal(err.Error())
   229  	}
   230  
   231  	On(k, "10000010")
   232  	err = testSuggestPeer(k, "<nil>", 1, false)
   233  	if err != nil {
   234  		t.Fatal(err.Error())
   235  	}
   236  
   237  	On(k, "01000010")
   238  	err = testSuggestPeer(k, "<nil>", 2, false)
   239  	if err != nil {
   240  		t.Fatal(err.Error())
   241  	}
   242  
   243  	On(k, "00100010")
   244  	err = testSuggestPeer(k, "<nil>", 3, false)
   245  	if err != nil {
   246  		t.Fatal(err.Error())
   247  	}
   248  
   249  	On(k, "00010010")
   250  	err = testSuggestPeer(k, "<nil>", 0, false)
   251  	if err != nil {
   252  		t.Fatal(err.Error())
   253  	}
   254  
   255  }
   256  
   257  // a node should stay in the address book if it's removed from the kademlia
   258  func TestOffEffectingAddressBookNormalNode(t *testing.T) {
   259  	k := newTestKademlia("00000000")
   260  	// peer added to kademlia
   261  	k.On(newTestKadPeer(k, "01000000", false))
   262  	// peer should be in the address book
   263  	if k.addrs.Size() != 1 {
   264  		t.Fatal("known peer addresses should contain 1 entry")
   265  	}
   266  	// peer should be among live connections
   267  	if k.conns.Size() != 1 {
   268  		t.Fatal("live peers should contain 1 entry")
   269  	}
   270  	// remove peer from kademlia
   271  	k.Off(newTestKadPeer(k, "01000000", false))
   272  	// peer should be in the address book
   273  	if k.addrs.Size() != 1 {
   274  		t.Fatal("known peer addresses should contain 1 entry")
   275  	}
   276  	// peer should not be among live connections
   277  	if k.conns.Size() != 0 {
   278  		t.Fatal("live peers should contain 0 entry")
   279  	}
   280  }
   281  
   282  // a light node should not be in the address book
   283  func TestOffEffectingAddressBookLightNode(t *testing.T) {
   284  	k := newTestKademlia("00000000")
   285  	// light node peer added to kademlia
   286  	k.On(newTestKadPeer(k, "01000000", true))
   287  	// peer should not be in the address book
   288  	if k.addrs.Size() != 0 {
   289  		t.Fatal("known peer addresses should contain 0 entry")
   290  	}
   291  	// peer should be among live connections
   292  	if k.conns.Size() != 1 {
   293  		t.Fatal("live peers should contain 1 entry")
   294  	}
   295  	// remove peer from kademlia
   296  	k.Off(newTestKadPeer(k, "01000000", true))
   297  	// peer should not be in the address book
   298  	if k.addrs.Size() != 0 {
   299  		t.Fatal("known peer addresses should contain 0 entry")
   300  	}
   301  	// peer should not be among live connections
   302  	if k.conns.Size() != 0 {
   303  		t.Fatal("live peers should contain 0 entry")
   304  	}
   305  }
   306  
   307  func TestSuggestPeerRetries(t *testing.T) {
   308  	k := newTestKademlia("00000000")
   309  	k.RetryInterval = int64(300 * time.Millisecond) // cycle
   310  	k.MaxRetries = 50
   311  	k.RetryExponent = 2
   312  	sleep := func(n int) {
   313  		ts := k.RetryInterval
   314  		for i := 1; i < n; i++ {
   315  			ts *= int64(k.RetryExponent)
   316  		}
   317  		time.Sleep(time.Duration(ts))
   318  	}
   319  
   320  	Register(k, "01000000")
   321  	On(k, "00000001", "00000010")
   322  	err := testSuggestPeer(k, "01000000", 0, false)
   323  	if err != nil {
   324  		t.Fatal(err.Error())
   325  	}
   326  
   327  	err = testSuggestPeer(k, "<nil>", 0, false)
   328  	if err != nil {
   329  		t.Fatal(err.Error())
   330  	}
   331  
   332  	sleep(1)
   333  	err = testSuggestPeer(k, "01000000", 0, false)
   334  	if err != nil {
   335  		t.Fatal(err.Error())
   336  	}
   337  
   338  	err = testSuggestPeer(k, "<nil>", 0, false)
   339  	if err != nil {
   340  		t.Fatal(err.Error())
   341  	}
   342  
   343  	sleep(1)
   344  	err = testSuggestPeer(k, "01000000", 0, false)
   345  	if err != nil {
   346  		t.Fatal(err.Error())
   347  	}
   348  
   349  	err = testSuggestPeer(k, "<nil>", 0, false)
   350  	if err != nil {
   351  		t.Fatal(err.Error())
   352  	}
   353  
   354  	sleep(2)
   355  	err = testSuggestPeer(k, "01000000", 0, false)
   356  	if err != nil {
   357  		t.Fatal(err.Error())
   358  	}
   359  
   360  	err = testSuggestPeer(k, "<nil>", 0, false)
   361  	if err != nil {
   362  		t.Fatal(err.Error())
   363  	}
   364  
   365  	sleep(2)
   366  	err = testSuggestPeer(k, "<nil>", 0, false)
   367  	if err != nil {
   368  		t.Fatal(err.Error())
   369  	}
   370  
   371  }
   372  
   373  func TestKademliaHiveString(t *testing.T) {
   374  	k := newTestKademlia("00000000")
   375  	On(k, "01000000", "00100000")
   376  	Register(k, "10000000", "10000001")
   377  	k.MaxProxDisplay = 8
   378  	h := k.String()
   379  	expH := "\n=========================================================================\nMon Feb 27 12:10:28 UTC 2017 KΛÐΞMLIΛ hive: queen's address: 000000\npopulation: 2 (4), MinProxBinSize: 2, MinBinSize: 1, MaxBinSize: 4\n000  0                              |  2 8100 (0) 8000 (0)\n============ DEPTH: 1 ==========================================\n001  1 4000                         |  1 4000 (0)\n002  1 2000                         |  1 2000 (0)\n003  0                              |  0\n004  0                              |  0\n005  0                              |  0\n006  0                              |  0\n007  0                              |  0\n========================================================================="
   380  	if expH[104:] != h[104:] {
   381  		t.Fatalf("incorrect hive output. expected %v, got %v", expH, h)
   382  	}
   383  }
   384  
   385  // testKademliaCase constructs the kademlia and PeerPot map to validate
   386  // the SuggestPeer and Healthy methods for provided hex-encoded addresses.
   387  // Argument pivotAddr is the address of the kademlia.
   388  func testKademliaCase(t *testing.T, pivotAddr string, addrs ...string) {
   389  	addr := common.FromHex(pivotAddr)
   390  	addrs = append(addrs, pivotAddr)
   391  
   392  	k := NewKademlia(addr, NewKadParams())
   393  
   394  	as := make([][]byte, len(addrs))
   395  	for i, a := range addrs {
   396  		as[i] = common.FromHex(a)
   397  	}
   398  
   399  	for _, a := range as {
   400  		if bytes.Equal(a, addr) {
   401  			continue
   402  		}
   403  		p := &BzzAddr{OAddr: a, UAddr: a}
   404  		if err := k.Register(p); err != nil {
   405  			t.Fatal(err)
   406  		}
   407  	}
   408  
   409  	ppmap := NewPeerPotMap(2, as)
   410  
   411  	pp := ppmap[pivotAddr]
   412  
   413  	for {
   414  		a, _, _ := k.SuggestPeer()
   415  		if a == nil {
   416  			break
   417  		}
   418  		k.On(NewPeer(&BzzPeer{BzzAddr: a}, k))
   419  	}
   420  
   421  	h := k.Healthy(pp)
   422  	if !(h.GotNN && h.KnowNN && h.Full) {
   423  		t.Fatalf("not healthy: %#v\n%v", h, k.String())
   424  	}
   425  }
   426  
   427  /*
   428  The regression test for the following invalid kademlia edge case.
   429  
   430  Addresses used in this test are discovered as part of the simulation network
   431  in higher level tests for streaming. They were generated randomly.
   432  
   433  =========================================================================
   434  Mon Apr  9 12:18:24 UTC 2018 KΛÐΞMLIΛ hive: queen's address: 7efef1
   435  population: 9 (49), MinProxBinSize: 2, MinBinSize: 2, MaxBinSize: 4
   436  000  2 d7e5 ec56                    | 18 ec56 (0) d7e5 (0) d9e0 (0) c735 (0)
   437  001  2 18f1 3176                    | 14 18f1 (0) 10bb (0) 10d1 (0) 0421 (0)
   438  002  2 52aa 47cd                    | 11 52aa (0) 51d9 (0) 5161 (0) 5130 (0)
   439  003  1 646e                         |  1 646e (0)
   440  004  0                              |  3 769c (0) 76d1 (0) 7656 (0)
   441  ============ DEPTH: 5 ==========================================
   442  005  1 7a48                         |  1 7a48 (0)
   443  006  1 7cbd                         |  1 7cbd (0)
   444  007  0                              |  0
   445  008  0                              |  0
   446  009  0                              |  0
   447  010  0                              |  0
   448  011  0                              |  0
   449  012  0                              |  0
   450  013  0                              |  0
   451  014  0                              |  0
   452  015  0                              |  0
   453  =========================================================================
   454  */
   455  func TestKademliaCase1(t *testing.T) {
   456  	testKademliaCase(t,
   457  		"7efef1c41d77f843ad167be95f6660567eb8a4a59f39240000cce2e0d65baf8e",
   458  		"ec560e6a4806aa37f147ee83687f3cf044d9953e61eedb8c34b6d50d9e2c5623",
   459  		"646e9540c84f6a2f9cf6585d45a4c219573b4fd1b64a3c9a1386fc5cf98c0d4d",
   460  		"18f13c5fba653781019025ab10e8d2fdc916d6448729268afe9e928ffcdbb8e8",
   461  		"317617acf99b4ffddda8a736f8fc6c6ede0bf690bc23d834123823e6d03e2f69",
   462  		"d7e52d9647a5d1c27a68c3ee65d543be3947ae4b68537b236d71ef9cb15fb9ab",
   463  		"7a48f75f8ca60487ae42d6f92b785581b40b91f2da551ae73d5eae46640e02e8",
   464  		"7cbd42350bde8e18ae5b955b5450f8e2cef3419f92fbf5598160c60fd78619f0",
   465  		"52aa3ddec61f4d48dd505a2385403c634f6ad06ee1d99c5c90a5ba6006f9af9c",
   466  		"47cdb6fa93eeb8bc91a417ff4e3b14a9c2ea85137462e2f575fae97f0c4be60d",
   467  		"5161943eb42e2a03e715fe8afa1009ff5200060c870ead6ab103f63f26cb107f",
   468  		"a38eaa1255f76bf883ca0830c86e8c4bb7eed259a8348aae9b03f21f90105bee",
   469  		"b2522bdf1ab26f324e75424fdf6e493b47e8a27687fe76347607b344fc010075",
   470  		"5bd7213964efb2580b91d02ac31ef126838abeba342f5dbdbe8d4d03562671a2",
   471  		"0b531adb82744768b694d7f94f73d4f0c9de591266108daeb8c74066bfc9c9ca",
   472  		"28501f59f70e888d399570145ed884353e017443c675aa12731ada7c87ea14f7",
   473  		"4a45f1fc63e1a9cb9dfa44c98da2f3d20c2923e5d75ff60b2db9d1bdb0c54d51",
   474  		"b193431ee35cd32de95805e7c1c749450c47486595aae7195ea6b6019a64fd61",
   475  		"baebf36a1e35a7ed834e1c72faf44ba16c159fa47d3289ceb3ca35fefa8739b5",
   476  		"a3659bd32e05fa36c8d20dbaaed8362bf1a8a7bd116aed62d8a43a2efbdf513f",
   477  		"10d1b50881a4770ebebdd0a75589dabb931e6716747b0f65fd6b080b88c4fdb6",
   478  		"3c76b8ca5c7ce6a03320646826213f59229626bf5b9d25da0c3ec0662dcb8ff3",
   479  		"4d72a04ddeb851a68cd197ef9a92a3e2ff01fbbff638e64929dd1a9c2e150112",
   480  		"c7353d320987956075b5bc1668571c7a36c800d5598fdc4832ec6569561e15d1",
   481  		"d9e0c7c90878c20ab7639d5954756f54775404b3483407fe1b483635182734f6",
   482  		"8fca67216b7939c0824fb06c5279901a94da41da9482b000f56df9906736ee75",
   483  		"460719d7f7aa7d7438f0eaf30333484fa3bd0f233632c10ba89e6e46dd3604be",
   484  		"0421d92c8a1c79ed5d01305a3d25aaf22a8f5f9e3d4bc80da47ee16ce20465fe",
   485  		"3441d9d9c0f05820a1bb6459fc7d8ef266a1bd929e7db939a10f544efe8261ea",
   486  		"ab198a66c293586746758468c610e5d3914d4ce629147eff6dd55a31f863ff8f",
   487  		"3a1c8c16b0763f3d2c35269f454ff779d1255e954d2deaf6c040fb3f0bcdc945",
   488  		"5561c0ea3b203e173b11e6aa9d0e621a4e10b1d8b178b8fe375220806557b823",
   489  		"7656caccdc79cd8d7ce66d415cc96a718e8271c62fb35746bfc2b49faf3eebf3",
   490  		"5130594fd54c1652cf2debde2c4204573ed76555d1e26757fe345b409af1544a",
   491  		"76d1e83c71ca246d042e37ff1db181f2776265fbcfdc890ce230bfa617c9c2f0",
   492  		"89580231962624c53968c1b0095b4a2732b2a2640a19fdd7d21fd064fcc0a5ef",
   493  		"3d10d001fff44680c7417dd66ecf2e984f0baa20a9bbcea348583ba5ff210c4f",
   494  		"43754e323f0f3a1155b1852bd6edd55da86b8c4cfe3df8b33733fca50fc202b8",
   495  		"a9e7b1bb763ae6452ddcacd174993f82977d81a85206bb2ae3c842e2d8e19b4c",
   496  		"10bb07da7bc7c7757f74149eff167d528a94a253cdc694a863f4d50054c00b6d",
   497  		"28f0bc1b44658548d6e05dd16d4c2fe77f1da5d48b6774bc4263b045725d0c19",
   498  		"835fbbf1d16ba7347b6e2fc552d6e982148d29c624ea20383850df3c810fa8fc",
   499  		"8e236c56a77d7f46e41e80f7092b1a68cd8e92f6156365f41813ad1ca2c6b6f3",
   500  		"51d9c857e9238c49186e37b4eccf17a82de3d5739f026f6043798ab531456e73",
   501  		"bbddf7db6a682225301f36a9fd5b0d0121d2951753e1681295f3465352ad511f",
   502  		"2690a910c33ee37b91eb6c4e0731d1d345e2dc3b46d308503a6e85bbc242c69e",
   503  		"769ce86aa90b518b7ed382f9fdacfbed93574e18dc98fe6c342e4f9f409c2d5a",
   504  		"ba3bebec689ce51d3e12776c45f80d25164fdfb694a8122d908081aaa2e7122c",
   505  		"3a51f4146ea90a815d0d283d1ceb20b928d8b4d45875e892696986a3c0d8fb9b",
   506  		"81968a2d8fb39114342ee1da85254ec51e0608d7f0f6997c2a8354c260a71009",
   507  	)
   508  }
   509  
   510  /*
   511  The regression test for the following invalid kademlia edge case.
   512  
   513  Addresses used in this test are discovered as part of the simulation network
   514  in higher level tests for streaming. They were generated randomly.
   515  
   516  =========================================================================
   517  Mon Apr  9 18:43:48 UTC 2018 KΛÐΞMLIΛ hive: queen's address: bc7f3b
   518  population: 9 (49), MinProxBinSize: 2, MinBinSize: 2, MaxBinSize: 4
   519  000  2 0f49 67ff                    | 28 0f49 (0) 0211 (0) 07b2 (0) 0703 (0)
   520  001  2 e84b f3a4                    | 13 f3a4 (0) e84b (0) e58b (0) e60b (0)
   521  002  1 8dba                         |  1 8dba (0)
   522  003  2 a008 ad72                    |  2 ad72 (0) a008 (0)
   523  004  0                              |  3 b61f (0) b27f (0) b027 (0)
   524  ============ DEPTH: 5 ==========================================
   525  005  1 ba19                         |  1 ba19 (0)
   526  006  0                              |  0
   527  007  1 bdd6                         |  1 bdd6 (0)
   528  008  0                              |  0
   529  009  0                              |  0
   530  010  0                              |  0
   531  011  0                              |  0
   532  012  0                              |  0
   533  013  0                              |  0
   534  014  0                              |  0
   535  015  0                              |  0
   536  =========================================================================
   537  */
   538  func TestKademliaCase2(t *testing.T) {
   539  	testKademliaCase(t,
   540  		"bc7f3b6a4a7e3c91b100ca6680b6c06ff407972b88956324ca853295893e0237", "67ffb61d3aa27449d277016188f35f19e2321fbda5008c68cf6303faa080534f", "600cd54c842eadac1729c04abfc369bc244572ca76117105b9dd910283b82730", "d955a05409650de151218557425105a8aa2867bb6a0e0462fa1cf90abcf87ad6", "7a6b726de45abdf7bb3e5fd9fb0dc8932270ca4dedef92238c80c05bcdb570e3", "263e99424ebfdb652adb4e3dcd27d59e11bb7ae1c057b3ef6f390d0228006254", "ba195d1a53aafde68e661c64d39db8c2a73505bf336125c15c3560de3b48b7ed", "3458c762169937115f67cabc35a6c384ed70293a8aec37b077a6c1b8e02d510e", "4ef4dc2e28ac6efdba57e134ac24dd4e0be68b9d54f7006515eb9509105f700c", "2a8782b79b0c24b9714dfd2c8ff1932bebc08aa6520b4eaeaa59ff781238890c", "625d02e960506f4524e9cdeac85b33faf3ea437fceadbd478b62b78720cf24fc", "e051a36a8c8637f520ba259c9ed3fadaf740dadc6a04c3f0e21778ebd4cd6ac4", "e34bc014fa2504f707bb3d904872b56c2fa250bee3cb19a147a0418541f1bd90", "28036dc79add95799916893890add5d8972f3b95325a509d6ded3d448f4dc652", "1b013c407794fa2e4c955d8f51cbc6bd78588a174b6548246b291281304b5409", "34f71b68698e1534095ff23ee9c35bf64c7f12b8463e7c6f6b19c25cf03928b4", "c712c6e9bbb7076832972a95890e340b94ed735935c3c0bb788e61f011b59479", "a008d5becdcda4b9dbfdaafc3cec586cf61dcf2d4b713b6168fff02e3b9f0b08", "29de15555cdbebaab214009e416ee92f947dcec5dab9894129f50f1b17138f34", "5df9449f700bd4b5a23688b68b293f2e92fa6ca524c93bc6bb9936efba9d9ada", "3ab0168a5f87fedc6a39b53c628256ac87a98670d8691bbdaaecec22418d13a2", "1ee299b2d2a74a568494130e6869e66d57982d345c482a0e0eeb285ac219ae3b", "e0e0e3b860cea9b7a74cf1b0675cc632dc64e80a02f20bbc5e96e2e8bb670606", "dc1ba6f169b0fcdcca021dcebaf39fe5d4875e7e69b854fad65687c1d7719ec0", "d321f73e42fcfb1d3a303eddf018ca5dffdcfd5567cd5ec1212f045f6a07e47d", "070320c3da7b542e5ca8aaf6a0a53d2bb5113ed264ab1db2dceee17c729edcb1", "17d314d65fdd136b50d182d2c8f5edf16e7838c2be8cf2c00abe4b406dbcd1d8", "e60b99e0a06f7d2d99d84085f67cdf8cc22a9ae22c339365d80f90289834a2b4", "02115771e18932e1f67a45f11f5bf743c5dae97fbc477d34d35c996012420eac", "3102a40eb2e5060353dd19bf61eeec8782dd1bebfcb57f4c796912252b591827", "8dbaf231062f2dc7ddaba5f9c7761b0c21292be51bf8c2ef503f31d4a2f63f79", "b02787b713c83a9f9183216310f04251994e04c2763a9024731562e8978e7cc4", "b27fe6cd33989e10909ce794c4b0b88feae286b614a59d49a3444c1a7b51ea82", "07b2d2c94fdc6fd148fe23be2ed9eff54f5e12548f29ed8416e6860fc894466f", "e58bf9f451ef62ac44ff0a9bb0610ec0fd14d423235954f0d3695e83017cbfc4", "bdd600b91bb79d1ee0053b854de308cfaa7e2abce575ea6815a0a7b3449609c2", "0f49c93c1edc7999920b21977cedd51a763940dac32e319feb9c1df2da0f3071", "7cbf0297cd41acf655cd6f960d7aaf61479edb4189d5c001cbc730861f0deb41", "79265193778d87ad626a5f59397bc075872d7302a12634ce2451a767d0a82da2", "2fe7d705f7c370b9243dbaafe007d555ff58d218822fca49d347b12a0282457c", "e84bc0c83d05e55a0080eed41dda5a795da4b9313a4da697142e69a65834cbb3", "cc4d278bd9aa0e9fb3cd8d2e0d68fb791aab5de4b120b845c409effbed47a180", "1a2317a8646cd4b6d3c4aa4cc25f676533abb689cf180787db216880a1239ad8", "cbafd6568cf8e99076208e6b6843f5808a7087897c67aad0c54694669398f889", "7b7c8357255fc37b4dae0e1af61589035fd39ff627e0938c6b3da8b4e4ec5d23", "2b8d782c1f5bac46c922cf439f6aa79f91e9ba5ffc0020d58455188a2075b334", "b61f45af2306705740742e76197a119235584ced01ef3f7cf3d4370f6c557cd1", "2775612e7cdae2780bf494c370bdcbe69c55e4a1363b1dc79ea0135e61221cce", "f3a49bb22f40885e961299abfa697a7df690a79f067bf3a4847a3ad48d826c9f", "ad724ac218dc133c0aadf4618eae21fdd0c2f3787af279846b49e2b4f97ff167",
   541  	)
   542  }
   543  
   544  /*
   545  The regression test for the following invalid kademlia edge case.
   546  
   547  Addresses used in this test are discovered as part of the simulation network
   548  in higher level tests for streaming. They were generated randomly.
   549  
   550  =========================================================================
   551  Mon Apr  9 19:04:35 UTC 2018 KΛÐΞMLIΛ hive: queen's address: b4822e
   552  population: 8 (49), MinProxBinSize: 2, MinBinSize: 2, MaxBinSize: 4
   553  000  2 786c 774b                    | 29 774b (0) 786c (0) 7a79 (0) 7d2f (0)
   554  001  2 d9de cf19                    | 10 cf19 (0) d9de (0) d2ff (0) d2a2 (0)
   555  002  2 8ca1 8d74                    |  5 8d74 (0) 8ca1 (0) 9793 (0) 9f51 (0)
   556  003  0                              |  0
   557  004  0                              |  3 bfac (0) bcbb (0) bde9 (0)
   558  005  0                              |  0
   559  ============ DEPTH: 6 ==========================================
   560  006  1 b660                         |  1 b660 (0)
   561  007  0                              |  0
   562  008  1 b450                         |  1 b450 (0)
   563  009  0                              |  0
   564  010  0                              |  0
   565  011  0                              |  0
   566  012  0                              |  0
   567  013  0                              |  0
   568  014  0                              |  0
   569  015  0                              |  0
   570  =========================================================================
   571  */
   572  func TestKademliaCase3(t *testing.T) {
   573  	testKademliaCase(t,
   574  		"b4822e874a01b94ac3a35c821e6db131e785c2fcbb3556e84b36102caf09b091", "2ecf54ea38d58f9cfc3862e54e5854a7c506fbc640e0b38e46d7d45a19794999", "442374092be50fc7392e8dd3f6fab3158ff7f14f26ff98060aed9b2eecf0b97d", "b450a4a67fcfa3b976cf023d8f1f15052b727f712198ce901630efe2f95db191", "9a7291638eb1c989a6dd6661a42c735b23ac6605b5d3e428aa5ffe650e892c85", "67f62eeab9804cfcac02b25ebeab9113d1b9d03dd5200b1c5a324cc0163e722f", "2e4a0e4b53bca4a9d7e2734150e9f579f29a255ade18a268461b20d026c9ee90", "30dd79c5fcdaa1b106f6960c45c9fde7c046aa3d931088d98c52ab759d0b2ac4", "97936fb5a581e59753c54fa5feec493714f2218245f61f97a62eafd4699433e4", "3a2899b6e129e3e193f6e2aefb82589c948c246d2ec1d4272af32ef3b2660f44", "f0e2a8aa88e67269e9952431ef12e5b29b7f41a1871fbfc38567fad95655d607", "7fa12b3f3c5f8383bfc644b958f72a486969733fa097d8952b3eb4f7b4f73192", "360c167aad5fc992656d6010ec45fdce5bcd492ad9608bc515e2be70d4e430c1", "fe21bc969b3d8e5a64a6484a829c1e04208f26f3cd4de6afcbc172a5bd17f1f1", "b660a1f40141d7ccd282fe5bd9838744119bd1cb3780498b5173578cc5ad308f", "44dcb3370e76680e2fba8cd986ad45ff0b77ca45680ee8d950e47922c4af6226", "8ca126923d17fccb689647307b89f38aa14e2a7b9ebcf3c1e31ccf3d2291a3bc", "f0ae19ae9ce6329327cbf42baf090e084c196b0877d8c7b69997e0123be23ef8", "d2a2a217385158e3e1e348883a14bc423e57daa12077e8c49797d16121ea0810", "f5467ccd85bb4ebe768527db520a210459969a5f1fae6e07b43f519799f0b224", "68be5fd9f9d142a5099e3609011fe3bab7bb992c595999e31e0b3d1668dfb3cf", "4d49a8a476e4934afc6b5c36db9bece3ed1804f20b952da5a21b2b0de766aa73", "ea7155745ef3fb2d099513887a2ba279333ced65c65facbd890ce58bd3fce772", "cf19f51f4e848053d289ac95a9138cdd23fc3077ae913cd58cda8cc7a521b2e1", "590b1cd41c7e6144e76b5cd515a3a4d0a4317624620a3f1685f43ae68bdcd890", "d2ffe0626b5f94a7e00fa0b506e7455a3d9399c15800db108d5e715ef5f6e346", "69630878c50a91f6c2edd23a706bfa0b50bd5661672a37d67bab38e6bca3b698", "445e9067079899bb5faafaca915ae6c0f6b1b730a5a628835dd827636f7feb1e", "6461c77491f1c4825958949f23c153e6e1759a5be53abbcee17c9da3867f3141", "23a235f4083771ccc207771daceda700b525a59ab586788d4f6892e69e34a6e2", "bde99f79ef41a81607ddcf92b9f95dcbc6c3537e91e8bf740e193dc73b19485e", "177957c0e5f0fbd12b88022a91768095d193830986caec8d888097d3ff4310b8", "bcbbdbaa4cdf8352422072f332e05111b732354a35c4d7c617ce1fc3b8b42a5a", "774b6717fdfb0d1629fb9d4c04a9ca40079ae2955d7f82e897477055ed017abb", "16443bf625be6d39ecaa6f114e5d2c1d47a64bfd3c13808d94b55b6b6acef2ee", "8d7495d9008066505ed00ce8198af82bfa5a6b4c08768b4c9fb3aa4eb0b0cca2", "15800849a53349508cb382959527f6c3cf1a46158ff1e6e2316b7dea7967e35f", "7a792f0f4a2b731781d1b244b2a57947f1a2e32900a1c0793449f9f7ae18a7b7", "5e517c2832c9deaa7df77c7bad4d20fd6eda2b7815e155e68bc48238fac1416f", "9f51a14f0019c72bd1d472706d8c80a18c1873c6a0663e754b60eae8094483d7", "7d2fabb565122521d22ba99fed9e5be6a458fbc93156d54db27d97a00b8c3a97", "786c9e412a7db4ec278891fa534caa9a1d1a028c631c6f3aeb9c4d96ad895c36", "3bd6341d40641c2632a5a0cd7a63553a04e251efd7195897a1d27e02a7a8bfde", "31efd1f5fb57b8cff0318d77a1a9e8d67e1d1c8d18ce90f99c3a240dff48cdc8", "d9de3e1156ce1380150948acbcfecd99c96e7f4b0bc97745f4681593d017f74f", "427a2201e09f9583cd990c03b81b58148c297d474a3b50f498d83b1c7a9414cd", "bfaca11596d3dec406a9fcf5d97536516dfe7f0e3b12078428a7e1700e25218a", "351c4770a097248a650008152d0cab5825d048bef770da7f3364f59d1e721bc0", "ee00f205d1486b2be7381d962bd2867263758e880529e4e2bfedfa613bbc0e71", "6aa3b6418d89e3348e4859c823ef4d6d7cd46aa7f7e77aba586c4214d760d8f8",
   575  	)
   576  }
   577  
   578  /*
   579  The regression test for the following invalid kademlia edge case.
   580  
   581  Addresses used in this test are discovered as part of the simulation network
   582  in higher level tests for streaming. They were generated randomly.
   583  
   584  =========================================================================
   585  Mon Apr  9 19:16:25 UTC 2018 KΛÐΞMLIΛ hive: queen's address: 9a90fe
   586  population: 8 (49), MinProxBinSize: 2, MinBinSize: 2, MaxBinSize: 4
   587  000  2 72ef 4e6c                    | 24 0b1e (0) 0d66 (0) 17f5 (0) 17e8 (0)
   588  001  2 fc2b fa47                    | 13 fa47 (0) fc2b (0) fffd (0) ecef (0)
   589  002  2 b847 afa8                    |  6 afa8 (0) ad77 (0) bb7c (0) b847 (0)
   590  003  0                              |  0
   591  004  0                              |  4 91fc (0) 957d (0) 9482 (0) 949a (0)
   592  ============ DEPTH: 5 ==========================================
   593  005  1 9ccf                         |  1 9ccf (0)
   594  006  0                              |  0
   595  007  1 9bb2                         |  1 9bb2 (0)
   596  008  0                              |  0
   597  009  0                              |  0
   598  010  0                              |  0
   599  011  0                              |  0
   600  012  0                              |  0
   601  013  0                              |  0
   602  014  0                              |  0
   603  015  0                              |  0
   604  =========================================================================
   605  */
   606  func TestKademliaCase4(t *testing.T) {
   607  	testKademliaCase(t,
   608  		"9a90fe3506277244549064b8c3276abb06284a199d9063a97331947f2b7da7f4",
   609  		"c19359eddef24b7be1a833b4475f212cd944263627a53f9ef4837d106c247730", "fc2b6fef99ef947f7e57c3df376891769e2a2fd83d2b8e634e0fc1e91eaa080c", "ecefc0e1a8ea7bb4b48c469e077401fce175dd75294255b96c4e54f6a2950a55", "bb7ce598efc056bba343cc2614aa3f67a575557561290b44c73a63f8f433f9f7", "55fbee6ca52dfd7f0be0db969ee8e524b654ab4f0cce7c05d83887d7d2a15460", "afa852b6b319998c6a283cc0c82d2f5b8e9410075d7700f3012761f1cfbd0f76", "36c370cfb63f2087971ba6e58d7585b04e16b8f0da335efb91554c2dd8fe191c", "6be41e029985edebc901fb77fc4fb65516b6d85086e2a98bfa3159c99391e585", "dd3cfc72ea553e7d2b28f0037a65646b30955b929d29ba4c40f4a2a811248e77", "da3a8f18e09c7b0ca235c4e33e1441a5188f1df023138bf207753ee63e768f7d", "de9e3ab4dc572d54a2d4b878329fd832bb51a149f4ce167316eeb177b61e7e01", "4e6c1ecde6ed917706257fe020a1d02d2e9d87fca4c85f0f7b132491008c5032", "72ef04b77a070e13463b3529dd312bcacfb7a12d20dc597f5ec3de0501e9b834", "3fef57186675d524ab8bb1f54ba8cb68610babca1247c0c46dbb60aed003c69d", "1d8e6b71f7a052865d6558d4ba44ad5fab7b908cc1badf5766822e1c20d0d823", "6be2f2b4ffa173014d4ec7df157d289744a2bda54bb876b264ccfa898a0da315", "b0ba3fff8643f9985c744327b0c4c869763509fd5da2de9a80a4a0a082021255", "9ccf40b9406ba2e6567101fb9b4e5334a9ec74263eff47267da266ba45e6c158", "d7347f02c180a448e60f73931845062ce00048750b584790278e9c93ef31ad81", "b68c6359a22b3bee6fecb8804311cfd816648ea31d530c9fb48e477e029d707a", "0d668a18ad7c2820214df6df95a6c855ce19fb1cb765f8ca620e45db76686d37", "3fbd2663bff65533246f1fabb9f38086854c6218aeb3dc9ac6ac73d4f0988f91", "949aa5719ca846052bfaa1b38c97b6eca3df3e24c0e0630042c6bccafbb4cdb5", "77b8a2b917bef5d54f3792183b014cca7798f713ff14fe0b2ac79b4c9f6f996d", "17e853cbd8dc00cba3cd9ffeb36f26a9f41a0eb92f80b62c2cda16771c935388", "5f682ed7a8cf2f98387c3def7c97f9f05ae39e39d393eeca3cf621268d6347f8", "ad77487eaf11fd8084ba4517a51766eb0e5b77dd3492dfa79aa3a2802fb29d20", "d247cfcacf9a8200ebaddf639f8c926ab0a001abe682f40df3785e80ed124e91", "195589442e11907eede1ee6524157f1125f68399f3170c835ff81c603b069f6c", "5b5ca0a67f3c54e7d3a6a862ef56168ec9ed1f4945e6c24de6d336b2be2e6f8c", "56430e4caa253015f1f998dce4a48a88af1953f68e94eca14f53074ae9c3e467", "0b1eed6a5bf612d1d8e08f5c546f3d12e838568fd3aa43ed4c537f10c65545d6", "7058db19a56dfff01988ac4a62e1310597f9c8d7ebde6890dadabf047d722d39", "b847380d6888ff7cd11402d086b19eccc40950b52c9d67e73cb4f8462f5df078", "df6c048419a2290ab546d527e9eeba349e7f7e1759bafe4adac507ce60ef9670", "91fc5b4b24fc3fbfea7f9a3d0f0437cb5733c0c2345d8bdffd7048d6e3b8a37b", "957d8ea51b37523952b6f5ae95462fcd4aed1483ef32cc80b69580aaeee03606", "efa82e4e91ad9ab781977400e9ac0bb9de7389aaedebdae979b73d1d3b8d72b0", "7400c9f3f3fc0cc6fe8cc37ab24b9771f44e9f78be913f73cd35fc4be030d6bd", "9bb28f4122d61f7bb56fe27ef706159fb802fef0f5de9dfa32c9c5b3183235f1", "40a8de6e98953498b806614532ea4abf8b99ad7f9719fb68203a6eae2efa5b2a", "412de0b218b8f7dcacc9205cd16ffb4eca5b838f46a2f4f9f534026061a47308", "17f56ecad51075080680ad9faa0fd8946b824d3296ddb20be07f9809fe8d1c5a", "fffd4e7ae885a41948a342b6647955a7ec8a8039039f510cff467ef597675457", "35e78e11b5ac46a29dd04ab0043136c3291f4ca56cb949ace33111ed56395463", "94824fc80230af82077c83bfc01dc9675b1f9d3d538b1e5f41c21ac753598691", "fa470ae314ca3fce493f21b423eef2a49522e09126f6f2326fa3c9cac0b344f7", "7078860b5b621b21ac7b95f9fc4739c8235ce5066a8b9bd7d938146a34fa88ec", "eea53560f0428bfd2eca4f86a5ce9dec5ff1309129a975d73465c1c9e9da71d1",
   610  	)
   611  }
   612  
   613  /*
   614  The regression test for the following invalid kademlia edge case.
   615  
   616  Addresses used in this test are discovered as part of the simulation network
   617  in higher level tests for streaming. They were generated randomly.
   618  
   619  =========================================================================
   620  Mon Apr  9 19:25:18 UTC 2018 KΛÐΞMLIΛ hive: queen's address: 5dd5c7
   621  population: 13 (49), MinProxBinSize: 2, MinBinSize: 2, MaxBinSize: 4
   622  000  2 e528 fad0                    | 22 fad0 (0) e528 (0) e3bb (0) ed13 (0)
   623  001  3 3f30 18e0 1dd3               |  7 3f30 (0) 23db (0) 10b6 (0) 18e0 (0)
   624  002  4 7c54 7804 61e4 60f9          | 10 61e4 (0) 60f9 (0) 636c (0) 7186 (0)
   625  003  2 40ae 4bae                    |  5 4bae (0) 4d5c (0) 403a (0) 40ae (0)
   626  004  0                              |  0
   627  005  0                              |  3 5808 (0) 5a0e (0) 5bdb (0)
   628  ============ DEPTH: 6 ==========================================
   629  006  2 5f14 5f61                    |  2 5f14 (0) 5f61 (0)
   630  007  0                              |  0
   631  008  0                              |  0
   632  009  0                              |  0
   633  010  0                              |  0
   634  011  0                              |  0
   635  012  0                              |  0
   636  013  0                              |  0
   637  014  0                              |  0
   638  015  0                              |  0
   639  =========================================================================
   640  */
   641  func TestKademliaCase5(t *testing.T) {
   642  	testKademliaCase(t,
   643  		"5dd5c77dd9006a800478fcebb02d48d4036389e7d3c8f6a83b97dbad13f4c0a9",
   644  		"78fafa0809929a1279ece089a51d12457c2d8416dff859aeb2ccc24bb50df5ec", "1dd39b1257e745f147cbbc3cadd609ccd6207c41056dbc4254bba5d2527d3ee5", "5f61dd66d4d94aec8fcc3ce0e7885c7edf30c43143fa730e2841c5d28e3cd081", "8aa8b0472cb351d967e575ad05c4b9f393e76c4b01ef4b3a54aac5283b78abc9", "4502f385152a915b438a6726ce3ea9342e7a6db91a23c2f6bee83a885ed7eb82", "718677a504249db47525e959ef1784bed167e1c46f1e0275b9c7b588e28a3758", "7c54c6ed1f8376323896ed3a4e048866410de189e9599dd89bf312ca4adb96b5", "18e03bd3378126c09e799a497150da5c24c895aedc84b6f0dbae41fc4bac081a", "23db76ac9e6e58d9f5395ca78252513a7b4118b4155f8462d3d5eec62486cadc", "40ae0e8f065e96c7adb7fa39505136401f01780481e678d718b7f6dbb2c906ec", "c1539998b8bae19d339d6bbb691f4e9daeb0e86847545229e80fe0dffe716e92", "ed139d73a2699e205574c08722ca9f030ad2d866c662f1112a276b91421c3cb9", "5bdb19584b7a36d09ca689422ef7e6bb681b8f2558a6b2177a8f7c812f631022", "636c9de7fe234ffc15d67a504c69702c719f626c17461d3f2918e924cd9d69e2", "de4455413ff9335c440d52458c6544191bd58a16d85f700c1de53b62773064ea", "de1963310849527acabc7885b6e345a56406a8f23e35e436b6d9725e69a79a83", "a80a50a467f561210a114cba6c7fb1489ed43a14d61a9edd70e2eb15c31f074d", "7804f12b8d8e6e4b375b242058242068a3809385e05df0e64973cde805cf729c", "60f9aa320c02c6f2e6370aa740cf7cea38083fa95fca8c99552cda52935c1520", "d8da963602390f6c002c00ce62a84b514edfce9ebde035b277a957264bb54d21", "8463d93256e026fe436abad44697152b9a56ac8e06a0583d318e9571b83d073c", "9a3f78fcefb9a05e40a23de55f6153d7a8b9d973ede43a380bf46bb3b3847de1", "e3bb576f4b3760b9ca6bff59326f4ebfc4a669d263fb7d67ab9797adea54ed13", "4d5cdbd6dcca5bdf819a0fe8d175dc55cc96f088d37462acd5ea14bc6296bdbe", "5a0ed28de7b5258c727cb85447071c74c00a5fbba9e6bc0393bc51944d04ab2a", "61e4ddb479c283c638f4edec24353b6cc7a3a13b930824aad016b0996ca93c47", "7e3610868acf714836cafaaa7b8c009a9ac6e3a6d443e5586cf661530a204ee2", "d74b244d4345d2c86e30a097105e4fb133d53c578320285132a952cdaa64416e", "cfeed57d0f935bfab89e3f630a7c97e0b1605f0724d85a008bbfb92cb47863a8", "580837af95055670e20d494978f60c7f1458dc4b9e389fc7aa4982b2aca3bce3", "df55c0c49e6c8a83d82dfa1c307d3bf6a20e18721c80d8ec4f1f68dc0a137ced", "5f149c51ce581ba32a285439a806c063ced01ccd4211cd024e6a615b8f216f95", "1eb76b00aeb127b10dd1b7cd4c3edeb4d812b5a658f0feb13e85c4d2b7c6fe06", "7a56ba7c3fb7cbfb5561a46a75d95d7722096b45771ec16e6fa7bbfab0b35dfe", "4bae85ad88c28470f0015246d530adc0cd1778bdd5145c3c6b538ee50c4e04bd", "afd1892e2a7145c99ec0ebe9ded0d3fec21089b277a68d47f45961ec5e39e7e0", "953138885d7b36b0ef79e46030f8e61fd7037fbe5ce9e0a94d728e8c8d7eab86", "de761613ef305e4f628cb6bf97d7b7dc69a9d513dc233630792de97bcda777a6", "3f3087280063d09504c084bbf7fdf984347a72b50d097fd5b086ffabb5b3fb4c", "7d18a94bb1ebfdef4d3e454d2db8cb772f30ca57920dd1e402184a9e598581a0", "a7d6fbdc9126d9f10d10617f49fb9f5474ffe1b229f76b7dd27cebba30eccb5d", "fad0246303618353d1387ec10c09ee991eb6180697ed3470ed9a6b377695203d", "1cf66e09ea51ee5c23df26615a9e7420be2ac8063f28f60a3bc86020e94fe6f3", "8269cdaa153da7c358b0b940791af74d7c651cd4d3f5ed13acfe6d0f2c539e7f", "90d52eaaa60e74bf1c79106113f2599471a902d7b1c39ac1f55b20604f453c09", "9788fd0c09190a3f3d0541f68073a2f44c2fcc45bb97558a7c319f36c25a75b3", "10b68fc44157ecfdae238ee6c1ce0333f906ad04d1a4cb1505c8e35c3c87fbb0", "e5284117fdf3757920475c786e0004cb00ba0932163659a89b36651a01e57394", "403ad51d911e113dcd5f9ff58c94f6d278886a2a4da64c3ceca2083282c92de3",
   645  	)
   646  }