From ccc57c57ab9fbef59649b0701f4dd69aeed758c6 Mon Sep 17 00:00:00 2001 From: tom twinkle Date: Mon, 22 Aug 2022 17:47:10 +0900 Subject: [PATCH] fix: setborderRange maxindex, add test --- excelizeam.go | 4 +- excelizeam_test.go | 140 ++++++++++++++++-- ...etBorderRangeAsync-not_override_style.xlsx | Bin 0 -> 6787 bytes ... => SetCellValueAsync-with_not_style.xlsx} | Bin 6361 -> 6361 bytes ...not_style_multiple_rows_cols_no_sort.xlsx} | Bin 6800 -> 6800 bytes ...style_multiple_rows_cols_no_sort_odd.xlsx} | Bin 6547 -> 6547 bytes ...th_not_style_multiple_rows_cols_sort.xlsx} | Bin 6800 -> 6800 bytes ...eAsync-with_not_style_override_style.xlsx} | Bin 6438 -> 6438 bytes ...ith_style_border_fill_font_alignment.xlsx} | Bin 6527 -> 6527 bytes ...e_border_fill_font_alignment_odd_row.xlsx} | Bin 6708 -> 6708 bytes ...BorderRange-border_odd_override_cross.xlsx | Bin 0 -> 6783 bytes ..._rows_cols_no_sort_odd_override_cross.xlsx | Bin 0 -> 6682 bytes ...leCellRange-border_odd_override_cross.xlsx | Bin 0 -> 6839 bytes 13 files changed, 131 insertions(+), 13 deletions(-) create mode 100644 testdata/async/SetBorderRangeAsync-not_override_style.xlsx rename testdata/async/{SetCellValue-with_not_style.xlsx => SetCellValueAsync-with_not_style.xlsx} (67%) rename testdata/async/{SetCellValue-with_not_style_multiple_rows_cols_no_sort.xlsx => SetCellValueAsync-with_not_style_multiple_rows_cols_no_sort.xlsx} (74%) rename testdata/async/{SetCellValue-with_not_style_multiple_rows_cols_no_sort_odd.xlsx => SetCellValueAsync-with_not_style_multiple_rows_cols_no_sort_odd.xlsx} (66%) rename testdata/async/{SetCellValue-with_not_style_multiple_rows_cols_sort.xlsx => SetCellValueAsync-with_not_style_multiple_rows_cols_sort.xlsx} (65%) rename testdata/async/{SetCellValue-with_not_style_override_style.xlsx => SetCellValueAsync-with_not_style_override_style.xlsx} (77%) rename testdata/async/{SetCellValue-with_style_border_fill_font_alignment.xlsx => SetCellValueAsync-with_style_border_fill_font_alignment.xlsx} (67%) rename testdata/async/{SetCellValue-with_style_border_fill_font_alignment_odd_row.xlsx => SetCellValueAsync-with_style_border_fill_font_alignment_odd_row.xlsx} (65%) create mode 100644 testdata/sync/SetBorderRange-border_odd_override_cross.xlsx create mode 100644 testdata/sync/SetCellValue-with_not_style_multiple_rows_cols_no_sort_odd_override_cross.xlsx create mode 100644 testdata/sync/SetStyleCellRange-border_odd_override_cross.xlsx diff --git a/excelizeam.go b/excelizeam.go index 7ff7ab1..93f2d80 100644 --- a/excelizeam.go +++ b/excelizeam.go @@ -335,7 +335,7 @@ func (e *excelizeam) SetBorderRange(startColIndex, startRowIndex, endColIndex, e } func (e *excelizeam) setBorderRange(startColIndex, startRowIndex, endColIndex, endRowIndex int, borderRange BorderRange, override bool) error { - e.checkMaxIndex(startColIndex, startRowIndex) + e.checkMaxIndex(endColIndex, endRowIndex) for rowIdx := startRowIndex; rowIdx <= endRowIndex; rowIdx++ { for colIdx := startColIndex; colIdx <= endColIndex; colIdx++ { key := e.getCacheKey(colIdx, rowIdx) @@ -522,7 +522,7 @@ func (e *excelizeam) setBorderRange(startColIndex, startRowIndex, endColIndex, e if err != nil { return err } - e.cellStore.Store(colIdx, &Cell{ + e.cellStore.Store(key, &Cell{ StyleID: styleID, Value: nil, }) diff --git a/excelizeam_test.go b/excelizeam_test.go index bae2d9d..593d9ad 100644 --- a/excelizeam_test.go +++ b/excelizeam_test.go @@ -93,6 +93,41 @@ func TestExcelizeam_Sync(t *testing.T) { return nil }, }, + "SetCellValue-with_not_style_multiple_rows_cols_no_sort_odd_override_cross": { + testFunc: func(w excelizeam.Excelizeam) error { + for rowIdx := 1; rowIdx <= 7; rowIdx++ { + if rowIdx%2 == 0 { + continue + } + for colIdx := 1; colIdx <= 7; colIdx++ { + if colIdx%2 == 0 { + continue + } + if err := w.SetCellValue(colIdx, rowIdx, fmt.Sprintf("test%d-%d", rowIdx, colIdx), &excelize.Style{ + Border: excelizestyle.BorderAround(excelizestyle.BorderStyleDash2, excelizestyle.BorderColorBlack), + }, false, false); err != nil { + return err + } + } + } + for rowIdx := 5; rowIdx <= 10; rowIdx++ { + if rowIdx%2 == 0 { + continue + } + for colIdx := 5; colIdx <= 10; colIdx++ { + if colIdx%2 == 0 { + continue + } + if err := w.SetCellValue(colIdx, rowIdx, fmt.Sprintf("override-test%d-%d", rowIdx, colIdx), &excelize.Style{ + Border: excelizestyle.BorderAround(excelizestyle.BorderStyleContinuous2, excelizestyle.BorderColorBlack), + }, true, true); err != nil { + return err + } + } + } + return nil + }, + }, "SetCellValue-with_not_style_multiple_rows_cols_sort": { testFunc: func(w excelizeam.Excelizeam) error { for colIdx := 1; colIdx <= 10; colIdx++ { @@ -251,6 +286,52 @@ func TestExcelizeam_Sync(t *testing.T) { }, wantErr: excelizeam.ErrOverrideCellStyle, }, + "SetBorderRange-border_odd_override_cross": { + testFunc: func(w excelizeam.Excelizeam) error { + if err := w.SetBorderRange(1, 1, 7, 7, excelizeam.BorderRange{ + Top: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleDash2, Color: excelizestyle.BorderColorBlack}, + Bottom: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleDash2, Color: excelizestyle.BorderColorBlack}, + Left: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleDash2, Color: excelizestyle.BorderColorBlack}, + Right: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleDash2, Color: excelizestyle.BorderColorBlack}, + Inside: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleDash2, Color: excelizestyle.BorderColorBlack}, + }, false); err != nil { + return err + } + if err := w.SetBorderRange(5, 5, 10, 10, excelizeam.BorderRange{ + Top: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleContinuous2, Color: excelizestyle.BorderColorBlack}, + Bottom: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleContinuous2, Color: excelizestyle.BorderColorBlack}, + Left: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleContinuous2, Color: excelizestyle.BorderColorBlack}, + Right: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleContinuous2, Color: excelizestyle.BorderColorBlack}, + Inside: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleContinuous2, Color: excelizestyle.BorderColorBlack}, + }, true); err != nil { + return err + } + return nil + }, + }, + "SetStyleCellRange-border_odd_override_cross": { + testFunc: func(w excelizeam.Excelizeam) error { + if err := w.SetStyleCellRange(1, 1, 7, 7, excelize.Style{ + Border: excelizestyle.BorderAround(excelizestyle.BorderStyleDash2, excelizestyle.BorderColorBlack), + Fill: excelizestyle.Fill(excelizestyle.FillPatternSolid, "#BF00BF"), + }, false); err != nil { + return err + } + if err := w.SetStyleCellRange(5, 5, 10, 10, excelize.Style{ + Border: excelizestyle.BorderAround(excelizestyle.BorderStyleContinuous2, excelizestyle.BorderColorBlack), + Fill: excelizestyle.Fill(excelizestyle.FillPatternSolid, "#CFA0FF"), + }, true); err != nil { + return err + } + if err := w.SetStyleCellRange(6, 6, 7, 7, excelize.Style{ + Border: excelizestyle.BorderAround(excelizestyle.BorderStyleContinuous2, excelizestyle.BorderColorBlack), + Fill: excelizestyle.Fill(excelizestyle.FillPatternSolid, "#7FA04F"), + }, true); err != nil { + return err + } + return nil + }, + }, } for n, v := range tests { @@ -294,19 +375,19 @@ func TestExcelizeam_Async(t *testing.T) { testFunc func(w excelizeam.Excelizeam) wantErr error }{ - "SetCellValue-with_not_style": { + "SetCellValueAsync-with_not_style": { testFunc: func(w excelizeam.Excelizeam) { w.SetCellValueAsync(1, 1, "test", nil, false) }, }, - "SetCellValue-with_not_style_override_style": { + "SetCellValueAsync-with_not_style_override_style": { testFunc: func(w excelizeam.Excelizeam) { w.SetCellValue(1, 1, "test1", &excelize.Style{Font: &excelize.Font{Size: 12}}, false, false) // can override value w.SetCellValueAsync(1, 1, nil, &excelize.Style{Font: &excelize.Font{Size: 13}}, true) }, }, - "SetCellValue-with_not_style_override_value_error": { + "SetCellValueAsync-with_not_style_override_value_error": { testFunc: func(w excelizeam.Excelizeam) { w.SetCellValue(1, 1, "test1", &excelize.Style{Font: &excelize.Font{Size: 12}}, false, false) // can override value @@ -314,7 +395,7 @@ func TestExcelizeam_Async(t *testing.T) { }, wantErr: excelizeam.ErrOverrideCellValue, }, - "SetCellValue-with_not_style_override_style_error": { + "SetCellValueAsync-with_not_style_override_style_error": { testFunc: func(w excelizeam.Excelizeam) { w.SetCellValue(1, 1, "test1", &excelize.Style{Font: &excelize.Font{Size: 12}}, false, false) // can override value @@ -322,7 +403,7 @@ func TestExcelizeam_Async(t *testing.T) { }, wantErr: excelizeam.ErrOverrideCellStyle, }, - "SetCellValue-with_not_style_multiple_rows_cols_no_sort": { + "SetCellValueAsync-with_not_style_multiple_rows_cols_no_sort": { testFunc: func(w excelizeam.Excelizeam) { for rowIdx := 1; rowIdx <= 10; rowIdx++ { for colIdx := 1; colIdx <= 10; colIdx++ { @@ -331,7 +412,7 @@ func TestExcelizeam_Async(t *testing.T) { } }, }, - "SetCellValue-with_not_style_multiple_rows_cols_no_sort_odd": { + "SetCellValueAsync-with_not_style_multiple_rows_cols_no_sort_odd": { testFunc: func(w excelizeam.Excelizeam) { for rowIdx := 1; rowIdx <= 10; rowIdx++ { if rowIdx%2 == 0 { @@ -346,7 +427,7 @@ func TestExcelizeam_Async(t *testing.T) { } }, }, - "SetCellValue-with_not_style_multiple_rows_cols_sort": { + "SetCellValueAsync-with_not_style_multiple_rows_cols_sort": { testFunc: func(w excelizeam.Excelizeam) { for colIdx := 1; colIdx <= 10; colIdx++ { for rowIdx := 1; rowIdx <= 10; rowIdx++ { @@ -355,7 +436,7 @@ func TestExcelizeam_Async(t *testing.T) { } }, }, - "SetCellValue-with_style_border_fill_font_alignment": { + "SetCellValueAsync-with_style_border_fill_font_alignment": { testFunc: func(w excelizeam.Excelizeam) { w.SetCellValueAsync(2, 2, "test", &excelize.Style{ Border: excelizestyle.BorderAround(excelizestyle.BorderStyleContinuous2, excelizestyle.BorderColorBlack), @@ -369,7 +450,7 @@ func TestExcelizeam_Async(t *testing.T) { }, false) }, }, - "SetCellValue-with_style_border_fill_font_alignment_odd_row": { + "SetCellValueAsync-with_style_border_fill_font_alignment_odd_row": { testFunc: func(w excelizeam.Excelizeam) { for rowIdx := 1; rowIdx <= 10; rowIdx++ { if rowIdx%2 == 0 { @@ -393,7 +474,7 @@ func TestExcelizeam_Async(t *testing.T) { } }, }, - "SetCellValue-with_style_border_fill_font_alignment_override_value_error": { + "SetCellValueAsync-with_style_border_fill_font_alignment_override_value_error": { testFunc: func(w excelizeam.Excelizeam) { w.SetCellValue(2, 2, "test1", &excelize.Style{ Border: excelizestyle.BorderAround(excelizestyle.BorderStyleContinuous2, excelizestyle.BorderColorBlack), @@ -406,7 +487,7 @@ func TestExcelizeam_Async(t *testing.T) { }, wantErr: excelizeam.ErrOverrideCellValue, }, - "SetCellValue-with_style_border_fill_font_alignment_override_style_error": { + "SetCellValueAsync-with_style_border_fill_font_alignment_override_style_error": { testFunc: func(w excelizeam.Excelizeam) { w.SetCellValue(2, 2, "test1", &excelize.Style{ Border: excelizestyle.BorderAround(excelizestyle.BorderStyleContinuous2, excelizestyle.BorderColorBlack), @@ -419,6 +500,43 @@ func TestExcelizeam_Async(t *testing.T) { }, wantErr: excelizeam.ErrOverrideCellStyle, }, + "SetBorderRangeAsync-not_override_style": { + testFunc: func(w excelizeam.Excelizeam) { + w.SetBorderRangeAsync(1, 1, 5, 5, excelizeam.BorderRange{ + Top: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleDash2, Color: excelizestyle.BorderColorBlack}, + Bottom: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleDash2, Color: excelizestyle.BorderColorBlack}, + Left: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleDash2, Color: excelizestyle.BorderColorBlack}, + Right: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleDash2, Color: excelizestyle.BorderColorBlack}, + Inside: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleDash2, Color: excelizestyle.BorderColorBlack}, + }) + w.SetBorderRangeAsync(6, 6, 10, 10, excelizeam.BorderRange{ + Top: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleContinuous2, Color: excelizestyle.BorderColorBlack}, + Bottom: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleContinuous2, Color: excelizestyle.BorderColorBlack}, + Left: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleContinuous2, Color: excelizestyle.BorderColorBlack}, + Right: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleContinuous2, Color: excelizestyle.BorderColorBlack}, + Inside: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleContinuous2, Color: excelizestyle.BorderColorBlack}, + }) + }, + }, + "SetBorderRangeAsync-override_error": { + testFunc: func(w excelizeam.Excelizeam) { + w.SetBorderRange(1, 1, 7, 7, excelizeam.BorderRange{ + Top: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleDash2, Color: excelizestyle.BorderColorBlack}, + Bottom: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleDash2, Color: excelizestyle.BorderColorBlack}, + Left: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleDash2, Color: excelizestyle.BorderColorBlack}, + Right: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleDash2, Color: excelizestyle.BorderColorBlack}, + Inside: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleDash2, Color: excelizestyle.BorderColorBlack}, + }, false) + w.SetBorderRangeAsync(5, 5, 10, 10, excelizeam.BorderRange{ + Top: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleContinuous2, Color: excelizestyle.BorderColorBlack}, + Bottom: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleContinuous2, Color: excelizestyle.BorderColorBlack}, + Left: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleContinuous2, Color: excelizestyle.BorderColorBlack}, + Right: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleContinuous2, Color: excelizestyle.BorderColorBlack}, + Inside: &excelizeam.BorderItem{Style: excelizestyle.BorderStyleContinuous2, Color: excelizestyle.BorderColorBlack}, + }) + }, + wantErr: excelizeam.ErrOverrideCellStyle, + }, } for n, v := range tests { diff --git a/testdata/async/SetBorderRangeAsync-not_override_style.xlsx b/testdata/async/SetBorderRangeAsync-not_override_style.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c2018700092361bb2f15bdb4c9b7fc509d4fa42b GIT binary patch literal 6787 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 E0cfa*0ssI2 literal 0 HcmV?d00001 diff --git a/testdata/async/SetCellValue-with_not_style.xlsx b/testdata/async/SetCellValueAsync-with_not_style.xlsx similarity index 67% rename from testdata/async/SetCellValue-with_not_style.xlsx rename to testdata/async/SetCellValueAsync-with_not_style.xlsx index a406f1e2928adab5cba86df061c8373b3b6a1639..76054c753552f82219292784dc4280883ce7a033 100644 GIT binary patch delta 135 zcmV;20C@k|G1)P&WdyS@4ekfCXbZ>zvtPR p50fw#B9oFB8Uhs%lOPoplR_6N4VDoA0C;RKb98xZWpk6i7#f9^D9!)? delta 127 zcmV-_0D%A5G1)P&WdySu4io~juo2e;lLHPIvr`Pn0kdTU?gz6k5NQFEhZaB^<4BO^P?sx2)W!MxLC%1Ba*_i$7C%j)yb12q?kVNPF^P=JJ}PcPJn-Ms-)6ne<>+J76Ar^iX8po zlFFRaV!evooXNW-w3t4NOnxq5t-D){fg##CKd&S;uOvRCvLLlM7NjJ=o0W|L2snYz Mj){T6MgqhG0HSs-B^<4BKWdJ_W|jyrPE8lfQ~cOxEK6vRQ`h9s6cEf$J=j?Ic1bM@dTYGqEu+ z#22OJ6zl7O$jN^swV0IHCu>Mqi@)MvV2F0k&nrpID~S)OEJ!Vm)vL(OncNIilFc=F zy`<9QNfJ^_@!XTwN!T*2b5e^zIs?2} TfwnO)Z~~zn69a>d1c(O!Op!4} diff --git a/testdata/async/SetCellValue-with_not_style_multiple_rows_cols_no_sort_odd.xlsx b/testdata/async/SetCellValueAsync-with_not_style_multiple_rows_cols_no_sort_odd.xlsx similarity index 66% rename from testdata/async/SetCellValue-with_not_style_multiple_rows_cols_no_sort_odd.xlsx rename to testdata/async/SetCellValueAsync-with_not_style_multiple_rows_cols_no_sort_odd.xlsx index 77ed100136c351a48e287f1fd1b39b63b2b8e75b..889f56f51c85c2eb9e1323abc44a31719618c1d5 100644 GIT binary patch delta 187 zcmbPiJlS}IJnQ6}LSHs7*UoEN|UdNOY#0>Wniet(JwBk%t$IWCuxs$(O~YnA*7}zZaLE93UyhU&hbCP?4iwo?n!ml%JnHxlvqX zGM|JLlbzsXEeX}hQ-P}Y3r*fAt~9v=D7smA@)8MKCMMCzk0o>_`%6fv%8M~D#22OJ a6zl7O$N+CvHU=Qz1VTF|1_pa^5Dx&UL@$Q` diff --git a/testdata/async/SetCellValue-with_not_style_multiple_rows_cols_sort.xlsx b/testdata/async/SetCellValueAsync-with_not_style_multiple_rows_cols_sort.xlsx similarity index 65% rename from testdata/async/SetCellValue-with_not_style_multiple_rows_cols_sort.xlsx rename to testdata/async/SetCellValueAsync-with_not_style_multiple_rows_cols_sort.xlsx index 165f7949eae761dd92eb7bc3965b96a90580a6a9..32d2f1dea7060ee725a5f85e6fe81454d52967c4 100644 GIT binary patch delta 173 zcmbPWI>B^<4BKX2zV|GfuZm?dPX5X(u~~*qfpPN@5kaQSHtZMKHvbXYz&P1XB4o0+ zq!beq+vIdf`N^JAQo1=rI-XOkO7;JNYnB^(5ZO z_a$wZ+W02RO6g2KEg{9Un1Awf30tO50+ZDwRVTMeN@B^<4BO@&9tFnDd-*T2ZI)qs&$78sYy;!urTh|`*YFB5ZRY0AWSnd#5i*%i zQi_R*ZL*f6?BugRrV{()my)(jg&dPLq*NzQl8|Eh%sY9Vg#2V*DJlL(LJSNQIr`=K zMcGOD`Pq{TB}FE?12wG@nVc+X!!%EH@Q&_C1bDNuF#rK45ZW;@FxW_dcmNUCGF1Qo diff --git a/testdata/async/SetCellValue-with_not_style_override_style.xlsx b/testdata/async/SetCellValueAsync-with_not_style_override_style.xlsx similarity index 77% rename from testdata/async/SetCellValue-with_not_style_override_style.xlsx rename to testdata/async/SetCellValueAsync-with_not_style_override_style.xlsx index fa1abd06dca72f49183fe3429aa910d8de0e9fad..388332d2aef7e982507b938ae1f6cbb193535a0e 100644 GIT binary patch delta 125 zcmZ2xw9IJ3Le9;Myb6qy7jk~ttjM>SV{)*l#OA47Axx96i1km_kdWeU=VV}rFG|fR z*4G1(lY_;zn3i)*t`}FDoG2m1G@E;Jt%N<3tl;E*64t^`g%}v3o%8cbQu9jULn;eW di(@DEit90@iA>%rZp*Y)bn+i@xyeG3A^;#b;=>g~DTjHvd4@yWeC2~)`D`C#m$TL|?QfcykaVe%!-pSGu zwoFI(CPzu=Otz4e5_-rFHlQRUH8)isOis=b*VjxI1q+ww7iA~q=V$9x9nIxVfJqf(5f~29O1_NE2xRlj0YX zlja#30#pW*-xeH`pcpCwaR-yk7$K8y85#mP36qN%Hv(A-lf)S!lkFH90!<5(2^l4m tbr>1~&k&Q57$1`^85$Q~761TSLvL<$Wo~p|RC#b^b6qZYZETYs8Wt$>Er$RA delta 139 zcmV;60CfMfG_*9ZZU(dI5Re74iwDR7vu6u}1+#e;X#taS2N<(c2^0deZUzMblj0YX zld>5a0#pW*&KVz*y%-t-%-C6nzL8WS!P003J1~!xoc~7#@=#8WcXPE(HJp diff --git a/testdata/sync/SetBorderRange-border_odd_override_cross.xlsx b/testdata/sync/SetBorderRange-border_odd_override_cross.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c8b3e32c18e15cd6f32fd9c400d0dfe56a1e97f2 GIT binary patch literal 6783 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 literal 0 HcmV?d00001 diff --git a/testdata/sync/SetStyleCellRange-border_odd_override_cross.xlsx b/testdata/sync/SetStyleCellRange-border_odd_override_cross.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..299a3f56f793f639901c0394c3e448fdf7470abf GIT binary patch literal 6839 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 F{{!4m*zf=V literal 0 HcmV?d00001