Commit 4a5187d
fix(vector): Fix similarity-based HNSW search for cosine and dot product metrics (#9559)
### Summary
This PR fixes a critical bug in HNSW vector search where **cosine
similarity and dot product metrics returned incorrect results**. The
search algorithm was treating all metrics as distance metrics (lower is
better), causing similarity metrics (higher is better) to return the
*worst* matches instead of the best.
### Problem
The HNSW implementation had two issues with similarity-based metrics:
1. **Search phase**: The candidate heap in
persistent_hnsw.go::searchPersistentLayer always used a min-heap, which
pops the lowest value first. For similarity metrics where higher values
are better, this caused the algorithm to explore the worst candidates
first and terminate prematurely.
2. **Edge pruning phase**: The helper.go::addNeighbors function used a
fixed comparison (`>`) when pruning edges, which is correct for distance
metrics but inverted for similarity metrics. This resulted in keeping
the worst edges instead of the best.
### Root Cause
The original code assumed all metrics behave like distance metrics:
```go
// Always used min-heap (pops lowest first)
candidateHeap := *buildPersistentHeapByInit(elements)
// Edge pruning always used > comparison
compare: func(i, j uint64) bool {
return ph.distance_betw(..., i, ...) > ph.distance_betw(..., j, ...)
}
```
For **Euclidean distance**, lower values = better matches → min-heap is
correct.
For **Cosine/DotProduct similarity**, higher values = better matches →
need max-heap.
### Solution
#### 1. Added candidateHeap interface with metric-aware heap selection
```go
type candidateHeap[T c.Float] interface {
Len() int
Pop() minPersistentHeapElement[T]
Push(minPersistentHeapElement[T])
PopLast() minPersistentHeapElement[T]
}
func buildCandidateHeap[T c.Float](array []minPersistentHeapElement[T], isSimilarityMetric bool) candidateHeap[T] {
if isSimilarityMetric {
return &maxHeapWrapper[T]{...} // Pops highest first
}
return &minHeapWrapper[T]{...} // Pops lowest first
}
```
#### 2. Added isSimilarityMetric flag to SimilarityType
```go
type SimilarityType[T c.Float] struct {
// ... existing fields
isSimilarityMetric bool // true for cosine, dotproduct; false for euclidean
}
```
#### 3. Fixed edge pruning comparison in addNeighbors
```go
compare: func(i, j uint64) bool {
distI := ph.distance_betw(ctx, tc, uuid, i, &inVec, &outVec)
distJ := ph.distance_betw(ctx, tc, uuid, j, &inVec, &outVec)
return !ph.simType.isBetterScore(distI, distJ)
}
```
### Files Changed
| File | Changes |
|------|---------|
| tok/hnsw/heap.go | Added candidateHeap interface, minHeapWrapper,
maxHeapWrapper, and buildCandidateHeap factory |
| tok/hnsw/helper.go | Added isSimilarityMetric field to SimilarityType;
fixed edge pruning comparison |
| tok/hnsw/persistent_hnsw.go | Updated searchPersistentLayer to use
metric-aware candidate heap |
| tok/hnsw/persistent_hnsw_test.go | Added comprehensive unit tests for
heap behavior and search correctness |
### Testing
Added new tests covering:
- TestCandidateHeapMinHeap: Verifies min-heap pops in ascending order
- TestCandidateHeapMaxHeap: Verifies max-heap pops in descending order
- TestCandidateHeapPushPop: Tests Push/Pop operations for both heap
types
- TestCandidateHeapPopLast: Tests PopLast for both types
- TestSimilarityTypeIsSimilarityMetric: Verifies flag is set correctly
for each metric
- TestSearchReturnsCorrectOrderForAllMetrics: End-to-end test for
Euclidean, Cosine, and DotProduct
- TestEdgePruningKeepsBestEdges: Verifies edge pruning keeps best edges
for each metric
### Performance Note
This fix builds on PR #9514 which corrected the early termination
condition. Together, these changes ensure HNSW search explores the
correct number of candidates and returns properly ordered results.
Users experiencing slower insert/search times compared to v25.1.0 can
tune performance by lowering efConstruction and efSearch parameters when
creating your vector indexes.
Lower values trade recall for speed. The default values
(efConstruction=128, efSearch=64) prioritize recall.
### GenAI Notice
Parts of this implementation and all of the testing was generated using
Claude Opus 4.5 (thinking).
### Checklist
- [x] The PR title follows the
[Conventional
Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) syntax,
leading
with `fix:`, `feat:`, `chore:`, `ci:`, etc.
- [x] Code compiles correctly and linting (via trunk) passes locally
- [x] Tests added for new functionality, or regression tests for bug
fixes added as applicable
Fixes #9558
### Benchmarks
Our BEIR SciFact Information Retrieval Benchmarks now show recall rates
close to or exceeding acceptable and excellent performance for all
metrics.
```
============================================================================================================================================
NDCG@k Comparison
============================================================================================================================================
NDCG@1:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) ██████████████████░░░░░░░░░░░░ 0.6200
BEIR Acceptable (Acceptable baseline (384-dim)) ███████████████░░░░░░░░░░░░░░░ 0.5200
Dgraph v25.1.0 (euclidean) ███████████████░░░░░░░░░░░░░░░ 0.5000
Dgraph v25.1.0 (cosine) ████████░░░░░░░░░░░░░░░░░░░░░░ 0.2767
Dgraph v25.1.0 (dotproduct) ████████░░░░░░░░░░░░░░░░░░░░░░ 0.2867
Dgraph staged-fix (euclidean) ███████████████░░░░░░░░░░░░░░░ 0.5233
Dgraph staged-fix (cosine) ███████████████░░░░░░░░░░░░░░░ 0.5300
Dgraph staged-fix (dotproduct) ███████████████░░░░░░░░░░░░░░░ 0.5167
NDCG@3:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) ████████████████████░░░░░░░░░░ 0.6700
BEIR Acceptable (Acceptable baseline (384-dim)) ██████████████████░░░░░░░░░░░░ 0.6000
Dgraph v25.1.0 (euclidean) ████████████████░░░░░░░░░░░░░░ 0.5588
Dgraph v25.1.0 (cosine) █████████░░░░░░░░░░░░░░░░░░░░░ 0.3043
Dgraph v25.1.0 (dotproduct) █████████░░░░░░░░░░░░░░░░░░░░░ 0.3164
Dgraph staged-fix (euclidean) █████████████████░░░░░░░░░░░░░ 0.5918
Dgraph staged-fix (cosine) █████████████████░░░░░░░░░░░░░ 0.5957
Dgraph staged-fix (dotproduct) █████████████████░░░░░░░░░░░░░ 0.5830
NDCG@5:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) ████████████████████░░░░░░░░░░ 0.6900
BEIR Acceptable (Acceptable baseline (384-dim)) ██████████████████░░░░░░░░░░░░ 0.6300
Dgraph v25.1.0 (euclidean) █████████████████░░░░░░░░░░░░░ 0.5858
Dgraph v25.1.0 (cosine) █████████░░░░░░░░░░░░░░░░░░░░░ 0.3197
Dgraph v25.1.0 (dotproduct) █████████░░░░░░░░░░░░░░░░░░░░░ 0.3290
Dgraph staged-fix (euclidean) ██████████████████░░░░░░░░░░░░ 0.6168
Dgraph staged-fix (cosine) ██████████████████░░░░░░░░░░░░ 0.6240
Dgraph staged-fix (dotproduct) ██████████████████░░░░░░░░░░░░ 0.6081
NDCG@10:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) █████████████████████░░░░░░░░░ 0.7000
BEIR Acceptable (Acceptable baseline (384-dim)) ███████████████████░░░░░░░░░░░ 0.6500
Dgraph v25.1.0 (euclidean) ██████████████████░░░░░░░░░░░░ 0.6118
Dgraph v25.1.0 (cosine) █████████░░░░░░░░░░░░░░░░░░░░░ 0.3305
Dgraph v25.1.0 (dotproduct) ██████████░░░░░░░░░░░░░░░░░░░░ 0.3423
Dgraph staged-fix (euclidean) ███████████████████░░░░░░░░░░░ 0.6461
Dgraph staged-fix (cosine) ███████████████████░░░░░░░░░░░ 0.6505
Dgraph staged-fix (dotproduct) ███████████████████░░░░░░░░░░░ 0.6369
NDCG@100:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) █████████████████████░░░░░░░░░ 0.7200
BEIR Acceptable (Acceptable baseline (384-dim)) ████████████████████░░░░░░░░░░ 0.6800
Dgraph v25.1.0 (euclidean) ███████████████████░░░░░░░░░░░ 0.6418
Dgraph v25.1.0 (cosine) ██████████░░░░░░░░░░░░░░░░░░░░ 0.3445
Dgraph v25.1.0 (dotproduct) ██████████░░░░░░░░░░░░░░░░░░░░ 0.3555
Dgraph staged-fix (euclidean) ████████████████████░░░░░░░░░░ 0.6794
Dgraph staged-fix (cosine) ████████████████████░░░░░░░░░░ 0.6849
Dgraph staged-fix (dotproduct) ████████████████████░░░░░░░░░░ 0.6707
============================================================================================================================================
MAP@k Comparison
============================================================================================================================================
MAP@1:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) ██████████████████░░░░░░░░░░░░ 0.6000
BEIR Acceptable (Acceptable baseline (384-dim)) ███████████████░░░░░░░░░░░░░░░ 0.5000
Dgraph v25.1.0 (euclidean) ██████████████░░░░░░░░░░░░░░░░ 0.4812
Dgraph v25.1.0 (cosine) ███████░░░░░░░░░░░░░░░░░░░░░░░ 0.2586
Dgraph v25.1.0 (dotproduct) ████████░░░░░░░░░░░░░░░░░░░░░░ 0.2747
Dgraph staged-fix (euclidean) ███████████████░░░░░░░░░░░░░░░ 0.5046
Dgraph staged-fix (cosine) ███████████████░░░░░░░░░░░░░░░ 0.5112
Dgraph staged-fix (dotproduct) ██████████████░░░░░░░░░░░░░░░░ 0.4979
MAP@3:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) ███████████████████░░░░░░░░░░░ 0.6400
BEIR Acceptable (Acceptable baseline (384-dim)) █████████████████░░░░░░░░░░░░░ 0.5700
Dgraph v25.1.0 (euclidean) ████████████████░░░░░░░░░░░░░░ 0.5357
Dgraph v25.1.0 (cosine) ████████░░░░░░░░░░░░░░░░░░░░░░ 0.2883
Dgraph v25.1.0 (dotproduct) █████████░░░░░░░░░░░░░░░░░░░░░ 0.3022
Dgraph staged-fix (euclidean) ████████████████░░░░░░░░░░░░░░ 0.5663
Dgraph staged-fix (cosine) █████████████████░░░░░░░░░░░░░ 0.5707
Dgraph staged-fix (dotproduct) ████████████████░░░░░░░░░░░░░░ 0.5579
MAP@5:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) ███████████████████░░░░░░░░░░░ 0.6600
BEIR Acceptable (Acceptable baseline (384-dim)) █████████████████░░░░░░░░░░░░░ 0.5900
Dgraph v25.1.0 (euclidean) ████████████████░░░░░░░░░░░░░░ 0.5544
Dgraph v25.1.0 (cosine) ████████░░░░░░░░░░░░░░░░░░░░░░ 0.2993
Dgraph v25.1.0 (dotproduct) █████████░░░░░░░░░░░░░░░░░░░░░ 0.3113
Dgraph staged-fix (euclidean) █████████████████░░░░░░░░░░░░░ 0.5838
Dgraph staged-fix (cosine) █████████████████░░░░░░░░░░░░░ 0.5902
Dgraph staged-fix (dotproduct) █████████████████░░░░░░░░░░░░░ 0.5755
MAP@10:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) ████████████████████░░░░░░░░░░ 0.6700
BEIR Acceptable (Acceptable baseline (384-dim)) ██████████████████░░░░░░░░░░░░ 0.6000
Dgraph v25.1.0 (euclidean) █████████████████░░░░░░░░░░░░░ 0.5676
Dgraph v25.1.0 (cosine) █████████░░░░░░░░░░░░░░░░░░░░░ 0.3045
Dgraph v25.1.0 (dotproduct) █████████░░░░░░░░░░░░░░░░░░░░░ 0.3175
Dgraph staged-fix (euclidean) █████████████████░░░░░░░░░░░░░ 0.5987
Dgraph staged-fix (cosine) ██████████████████░░░░░░░░░░░░ 0.6035
Dgraph staged-fix (dotproduct) █████████████████░░░░░░░░░░░░░ 0.5900
MAP@100:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) ████████████████████░░░░░░░░░░ 0.6800
BEIR Acceptable (Acceptable baseline (384-dim)) ██████████████████░░░░░░░░░░░░ 0.6100
Dgraph v25.1.0 (euclidean) █████████████████░░░░░░░░░░░░░ 0.5746
Dgraph v25.1.0 (cosine) █████████░░░░░░░░░░░░░░░░░░░░░ 0.3074
Dgraph v25.1.0 (dotproduct) █████████░░░░░░░░░░░░░░░░░░░░░ 0.3203
Dgraph staged-fix (euclidean) ██████████████████░░░░░░░░░░░░ 0.6060
Dgraph staged-fix (cosine) ██████████████████░░░░░░░░░░░░ 0.6113
Dgraph staged-fix (dotproduct) █████████████████░░░░░░░░░░░░░ 0.5977
============================================================================================================================================
RECALL@k Comparison
============================================================================================================================================
Recall@1:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) ██████████████████░░░░░░░░░░░░ 0.6000
BEIR Acceptable (Acceptable baseline (384-dim)) ███████████████░░░░░░░░░░░░░░░ 0.5000
Dgraph v25.1.0 (euclidean) ██████████████░░░░░░░░░░░░░░░░ 0.4812
Dgraph v25.1.0 (cosine) ███████░░░░░░░░░░░░░░░░░░░░░░░ 0.2586
Dgraph v25.1.0 (dotproduct) ████████░░░░░░░░░░░░░░░░░░░░░░ 0.2747
Dgraph staged-fix (euclidean) ███████████████░░░░░░░░░░░░░░░ 0.5046
Dgraph staged-fix (cosine) ███████████████░░░░░░░░░░░░░░░ 0.5112
Dgraph staged-fix (dotproduct) ██████████████░░░░░░░░░░░░░░░░ 0.4979
Recall@3:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) █████████████████████░░░░░░░░░ 0.7300
BEIR Acceptable (Acceptable baseline (384-dim)) ███████████████████░░░░░░░░░░░ 0.6500
Dgraph v25.1.0 (euclidean) █████████████████░░░░░░░░░░░░░ 0.5984
Dgraph v25.1.0 (cosine) █████████░░░░░░░░░░░░░░░░░░░░░ 0.3248
Dgraph v25.1.0 (dotproduct) ██████████░░░░░░░░░░░░░░░░░░░░ 0.3377
Dgraph staged-fix (euclidean) ███████████████████░░░░░░░░░░░ 0.6384
Dgraph staged-fix (cosine) ███████████████████░░░░░░░░░░░ 0.6401
Dgraph staged-fix (dotproduct) ██████████████████░░░░░░░░░░░░ 0.6284
Recall@5:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) ███████████████████████░░░░░░░ 0.7900
BEIR Acceptable (Acceptable baseline (384-dim)) █████████████████████░░░░░░░░░ 0.7200
Dgraph v25.1.0 (euclidean) ███████████████████░░░░░░░░░░░ 0.6638
Dgraph v25.1.0 (cosine) ██████████░░░░░░░░░░░░░░░░░░░░ 0.3632
Dgraph v25.1.0 (dotproduct) ███████████░░░░░░░░░░░░░░░░░░░ 0.3697
Dgraph staged-fix (euclidean) ████████████████████░░░░░░░░░░ 0.6988
Dgraph staged-fix (cosine) █████████████████████░░░░░░░░░ 0.7088
Dgraph staged-fix (dotproduct) ████████████████████░░░░░░░░░░ 0.6888
Recall@10:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) █████████████████████████░░░░░ 0.8400
BEIR Acceptable (Acceptable baseline (384-dim)) ███████████████████████░░░░░░░ 0.7800
Dgraph v25.1.0 (euclidean) ██████████████████████░░░░░░░░ 0.7368
Dgraph v25.1.0 (cosine) ███████████░░░░░░░░░░░░░░░░░░░ 0.3950
Dgraph v25.1.0 (dotproduct) ████████████░░░░░░░░░░░░░░░░░░ 0.4074
Dgraph staged-fix (euclidean) ███████████████████████░░░░░░░ 0.7808
Dgraph staged-fix (cosine) ███████████████████████░░░░░░░ 0.7834
Dgraph staged-fix (dotproduct) ███████████████████████░░░░░░░ 0.7701
Recall@100:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) ████████████████████████████░░ 0.9500
BEIR Acceptable (Acceptable baseline (384-dim)) ███████████████████████████░░░ 0.9000
Dgraph v25.1.0 (euclidean) ██████████████████████████░░░░ 0.8717
Dgraph v25.1.0 (cosine) █████████████░░░░░░░░░░░░░░░░░ 0.4589
Dgraph v25.1.0 (dotproduct) █████████████░░░░░░░░░░░░░░░░░ 0.4658
Dgraph staged-fix (euclidean) ████████████████████████████░░ 0.9350
Dgraph staged-fix (cosine) ████████████████████████████░░ 0.9417
Dgraph staged-fix (dotproduct) ███████████████████████████░░░ 0.9250
============================================================================================================================================
PRECISION@k Comparison
============================================================================================================================================
Precision@1:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) ██████████████████░░░░░░░░░░░░ 0.6200
BEIR Acceptable (Acceptable baseline (384-dim)) ███████████████░░░░░░░░░░░░░░░ 0.5200
Dgraph v25.1.0 (euclidean) ███████████████░░░░░░░░░░░░░░░ 0.5000
Dgraph v25.1.0 (cosine) ████████░░░░░░░░░░░░░░░░░░░░░░ 0.2767
Dgraph v25.1.0 (dotproduct) ████████░░░░░░░░░░░░░░░░░░░░░░ 0.2867
Dgraph staged-fix (euclidean) ███████████████░░░░░░░░░░░░░░░ 0.5233
Dgraph staged-fix (cosine) ███████████████░░░░░░░░░░░░░░░ 0.5300
Dgraph staged-fix (dotproduct) ███████████████░░░░░░░░░░░░░░░ 0.5167
Precision@3:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) ██████████████████████████████ 0.2700
BEIR Acceptable (Acceptable baseline (384-dim)) █████████████████████████░░░░░ 0.2300
Dgraph v25.1.0 (euclidean) ████████████████████████░░░░░░ 0.2178
Dgraph v25.1.0 (cosine) █████████████░░░░░░░░░░░░░░░░░ 0.1211
Dgraph v25.1.0 (dotproduct) █████████████░░░░░░░░░░░░░░░░░ 0.1211
Dgraph staged-fix (euclidean) █████████████████████████░░░░░ 0.2311
Dgraph staged-fix (cosine) █████████████████████████░░░░░ 0.2322
Dgraph staged-fix (dotproduct) █████████████████████████░░░░░ 0.2278
Precision@5:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) ██████████████████████████████ 0.1800
BEIR Acceptable (Acceptable baseline (384-dim)) ██████████████████████████░░░░ 0.1600
Dgraph v25.1.0 (euclidean) ████████████████████████░░░░░░ 0.1480
Dgraph v25.1.0 (cosine) █████████████░░░░░░░░░░░░░░░░░ 0.0827
Dgraph v25.1.0 (dotproduct) █████████████░░░░░░░░░░░░░░░░░ 0.0807
Dgraph staged-fix (euclidean) █████████████████████████░░░░░ 0.1553
Dgraph staged-fix (cosine) ██████████████████████████░░░░ 0.1573
Dgraph staged-fix (dotproduct) █████████████████████████░░░░░ 0.1533
Precision@10:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) ██████████████████████████████ 0.1000
BEIR Acceptable (Acceptable baseline (384-dim)) ██████████████████████████░░░░ 0.0900
Dgraph v25.1.0 (euclidean) █████████████████████████░░░░░ 0.0837
Dgraph v25.1.0 (cosine) █████████████░░░░░░░░░░░░░░░░░ 0.0453
Dgraph v25.1.0 (dotproduct) █████████████░░░░░░░░░░░░░░░░░ 0.0447
Dgraph staged-fix (euclidean) ██████████████████████████░░░░ 0.0887
Dgraph staged-fix (cosine) ██████████████████████████░░░░ 0.0887
Dgraph staged-fix (dotproduct) ██████████████████████████░░░░ 0.0873
Precision@100:
--------------------------------------------------------------------------------------------------------------------------------------------
BEIR Excellent (State-of-the-art baseline (768-dim)) ████████████████████████████░░ 0.0100
BEIR Acceptable (Acceptable baseline (384-dim)) ████████████████████████████░░ 0.0100
Dgraph v25.1.0 (euclidean) ███████████████████████████░░░ 0.0100
Dgraph v25.1.0 (cosine) ██████████████░░░░░░░░░░░░░░░░ 0.0053
Dgraph v25.1.0 (dotproduct) ██████████████░░░░░░░░░░░░░░░░ 0.0051
Dgraph staged-fix (euclidean) █████████████████████████████░ 0.0106
Dgraph staged-fix (cosine) ██████████████████████████████ 0.0107
Dgraph staged-fix (dotproduct) █████████████████████████████░ 0.0105
```
---------
Co-authored-by: Joe Lamming <191030909+joelamming@users.noreply.github.com>1 parent c5de8a7 commit 4a5187d
5 files changed
Lines changed: 593 additions & 106 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
| 16 | + | |
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
| |||
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
26 | | - | |
27 | | - | |
| 26 | + | |
| 27 | + | |
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
34 | | - | |
| 34 | + | |
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
| |||
46 | 46 | | |
47 | 47 | | |
48 | 48 | | |
49 | | - | |
| 49 | + | |
50 | 50 | | |
51 | 51 | | |
52 | 52 | | |
| |||
61 | 61 | | |
62 | 62 | | |
63 | 63 | | |
64 | | - | |
| 64 | + | |
65 | 65 | | |
66 | | - | |
| 66 | + | |
67 | 67 | | |
68 | 68 | | |
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
72 | 72 | | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
0 commit comments