size_size_T_size_size.pass.cpp revision 6ac8de0976b38229a71500386fb7a3db1ab5d3c7
1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// XFAIL: libcpp-no-exceptions
11// <string>
12
13// template <typename T>
14//    int compare(size_type pos1, size_type n1, const T& t,
15//                size_type pos2, size_type n2=npos) const;
16//
17//  Mostly we're testing string_view here
18
19#include <string>
20#include <stdexcept>
21#include <cassert>
22
23#include "min_allocator.h"
24
25int sign(int x)
26{
27    if (x == 0)
28        return 0;
29    if (x < 0)
30        return -1;
31    return 1;
32}
33
34template <class S, class SV>
35void
36test(const S& s, typename S::size_type pos1, typename S::size_type n1,
37     SV sv,      typename S::size_type pos2, typename S::size_type n2, int x)
38{
39    static_assert(!std::is_same<S, SV>::value, "");
40    try
41    {
42        assert(sign(s.compare(pos1, n1, sv, pos2, n2)) == sign(x));
43        assert(pos1 <= s.size());
44        assert(pos2 <= sv.size());
45    }
46    catch (const std::out_of_range&)
47    {
48        assert(pos1 > s.size() || pos2 > sv.size());
49    }
50}
51
52template <class S, class SV>
53void
54test_npos(const S& s, typename S::size_type pos1, typename S::size_type n1,
55          SV sv,      typename S::size_type pos2, int x)
56{
57    static_assert(!std::is_same<S, SV>::value, "");
58    try
59    {
60        assert(sign(s.compare(pos1, n1, sv, pos2)) == sign(x));
61        assert(pos1 <= s.size());
62        assert(pos2 <= sv.size());
63    }
64    catch (const std::out_of_range&)
65    {
66        assert(pos1 > s.size() || pos2 > sv.size());
67    }
68}
69
70template <class S, class SV>
71void test0()
72{
73    test(S(""), 0, 0, SV(""), 0, 0, 0);
74    test(S(""), 0, 0, SV(""), 0, 1, 0);
75    test(S(""), 0, 0, SV(""), 1, 0, 0);
76    test(S(""), 0, 0, SV("abcde"), 0, 0, 0);
77    test(S(""), 0, 0, SV("abcde"), 0, 1, -1);
78    test(S(""), 0, 0, SV("abcde"), 0, 2, -2);
79    test(S(""), 0, 0, SV("abcde"), 0, 4, -4);
80    test(S(""), 0, 0, SV("abcde"), 0, 5, -5);
81    test(S(""), 0, 0, SV("abcde"), 0, 6, -5);
82    test(S(""), 0, 0, SV("abcde"), 1, 0, 0);
83    test(S(""), 0, 0, SV("abcde"), 1, 1, -1);
84    test(S(""), 0, 0, SV("abcde"), 1, 2, -2);
85    test(S(""), 0, 0, SV("abcde"), 1, 3, -3);
86    test(S(""), 0, 0, SV("abcde"), 1, 4, -4);
87    test(S(""), 0, 0, SV("abcde"), 1, 5, -4);
88    test(S(""), 0, 0, SV("abcde"), 2, 0, 0);
89    test(S(""), 0, 0, SV("abcde"), 2, 1, -1);
90    test(S(""), 0, 0, SV("abcde"), 2, 2, -2);
91    test(S(""), 0, 0, SV("abcde"), 2, 3, -3);
92    test(S(""), 0, 0, SV("abcde"), 2, 4, -3);
93    test(S(""), 0, 0, SV("abcde"), 4, 0, 0);
94    test(S(""), 0, 0, SV("abcde"), 4, 1, -1);
95    test(S(""), 0, 0, SV("abcde"), 4, 2, -1);
96    test(S(""), 0, 0, SV("abcde"), 5, 0, 0);
97    test(S(""), 0, 0, SV("abcde"), 5, 1, 0);
98    test(S(""), 0, 0, SV("abcde"), 6, 0, 0);
99    test(S(""), 0, 0, SV("abcdefghij"), 0, 0, 0);
100    test(S(""), 0, 0, SV("abcdefghij"), 0, 1, -1);
101    test(S(""), 0, 0, SV("abcdefghij"), 0, 5, -5);
102    test(S(""), 0, 0, SV("abcdefghij"), 0, 9, -9);
103    test(S(""), 0, 0, SV("abcdefghij"), 0, 10, -10);
104    test(S(""), 0, 0, SV("abcdefghij"), 0, 11, -10);
105    test(S(""), 0, 0, SV("abcdefghij"), 1, 0, 0);
106    test(S(""), 0, 0, SV("abcdefghij"), 1, 1, -1);
107    test(S(""), 0, 0, SV("abcdefghij"), 1, 4, -4);
108    test(S(""), 0, 0, SV("abcdefghij"), 1, 8, -8);
109    test(S(""), 0, 0, SV("abcdefghij"), 1, 9, -9);
110    test(S(""), 0, 0, SV("abcdefghij"), 1, 10, -9);
111    test(S(""), 0, 0, SV("abcdefghij"), 5, 0, 0);
112    test(S(""), 0, 0, SV("abcdefghij"), 5, 1, -1);
113    test(S(""), 0, 0, SV("abcdefghij"), 5, 2, -2);
114    test(S(""), 0, 0, SV("abcdefghij"), 5, 4, -4);
115    test(S(""), 0, 0, SV("abcdefghij"), 5, 5, -5);
116    test(S(""), 0, 0, SV("abcdefghij"), 5, 6, -5);
117    test(S(""), 0, 0, SV("abcdefghij"), 9, 0, 0);
118    test(S(""), 0, 0, SV("abcdefghij"), 9, 1, -1);
119    test(S(""), 0, 0, SV("abcdefghij"), 9, 2, -1);
120    test(S(""), 0, 0, SV("abcdefghij"), 10, 0, 0);
121    test(S(""), 0, 0, SV("abcdefghij"), 10, 1, 0);
122    test(S(""), 0, 0, SV("abcdefghij"), 11, 0, 0);
123    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
124    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 0, 1, -1);
125    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 0, 10, -10);
126    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 0, 19, -19);
127    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 0, 20, -20);
128    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 0, 21, -20);
129    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
130    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 1, 1, -1);
131    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 1, 9, -9);
132    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 1, 18, -18);
133    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 1, 19, -19);
134    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 1, 20, -19);
135    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
136    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 10, 1, -1);
137    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 10, 5, -5);
138    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 10, 9, -9);
139    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 10, 10, -10);
140    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 10, 11, -10);
141    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
142    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 19, 1, -1);
143    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 19, 2, -1);
144    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
145    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
146    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
147    test(S(""), 0, 1, SV(""), 0, 0, 0);
148    test(S(""), 0, 1, SV(""), 0, 1, 0);
149    test(S(""), 0, 1, SV(""), 1, 0, 0);
150    test(S(""), 0, 1, SV("abcde"), 0, 0, 0);
151    test(S(""), 0, 1, SV("abcde"), 0, 1, -1);
152    test(S(""), 0, 1, SV("abcde"), 0, 2, -2);
153    test(S(""), 0, 1, SV("abcde"), 0, 4, -4);
154    test(S(""), 0, 1, SV("abcde"), 0, 5, -5);
155    test(S(""), 0, 1, SV("abcde"), 0, 6, -5);
156    test(S(""), 0, 1, SV("abcde"), 1, 0, 0);
157    test(S(""), 0, 1, SV("abcde"), 1, 1, -1);
158    test(S(""), 0, 1, SV("abcde"), 1, 2, -2);
159    test(S(""), 0, 1, SV("abcde"), 1, 3, -3);
160    test(S(""), 0, 1, SV("abcde"), 1, 4, -4);
161    test(S(""), 0, 1, SV("abcde"), 1, 5, -4);
162    test(S(""), 0, 1, SV("abcde"), 2, 0, 0);
163    test(S(""), 0, 1, SV("abcde"), 2, 1, -1);
164    test(S(""), 0, 1, SV("abcde"), 2, 2, -2);
165    test(S(""), 0, 1, SV("abcde"), 2, 3, -3);
166    test(S(""), 0, 1, SV("abcde"), 2, 4, -3);
167    test(S(""), 0, 1, SV("abcde"), 4, 0, 0);
168    test(S(""), 0, 1, SV("abcde"), 4, 1, -1);
169    test(S(""), 0, 1, SV("abcde"), 4, 2, -1);
170    test(S(""), 0, 1, SV("abcde"), 5, 0, 0);
171    test(S(""), 0, 1, SV("abcde"), 5, 1, 0);
172    test(S(""), 0, 1, SV("abcde"), 6, 0, 0);
173}
174
175template <class S, class SV>
176void test1()
177{
178    test(S(""), 0, 1, SV("abcdefghij"), 0, 0, 0);
179    test(S(""), 0, 1, SV("abcdefghij"), 0, 1, -1);
180    test(S(""), 0, 1, SV("abcdefghij"), 0, 5, -5);
181    test(S(""), 0, 1, SV("abcdefghij"), 0, 9, -9);
182    test(S(""), 0, 1, SV("abcdefghij"), 0, 10, -10);
183    test(S(""), 0, 1, SV("abcdefghij"), 0, 11, -10);
184    test(S(""), 0, 1, SV("abcdefghij"), 1, 0, 0);
185    test(S(""), 0, 1, SV("abcdefghij"), 1, 1, -1);
186    test(S(""), 0, 1, SV("abcdefghij"), 1, 4, -4);
187    test(S(""), 0, 1, SV("abcdefghij"), 1, 8, -8);
188    test(S(""), 0, 1, SV("abcdefghij"), 1, 9, -9);
189    test(S(""), 0, 1, SV("abcdefghij"), 1, 10, -9);
190    test(S(""), 0, 1, SV("abcdefghij"), 5, 0, 0);
191    test(S(""), 0, 1, SV("abcdefghij"), 5, 1, -1);
192    test(S(""), 0, 1, SV("abcdefghij"), 5, 2, -2);
193    test(S(""), 0, 1, SV("abcdefghij"), 5, 4, -4);
194    test(S(""), 0, 1, SV("abcdefghij"), 5, 5, -5);
195    test(S(""), 0, 1, SV("abcdefghij"), 5, 6, -5);
196    test(S(""), 0, 1, SV("abcdefghij"), 9, 0, 0);
197    test(S(""), 0, 1, SV("abcdefghij"), 9, 1, -1);
198    test(S(""), 0, 1, SV("abcdefghij"), 9, 2, -1);
199    test(S(""), 0, 1, SV("abcdefghij"), 10, 0, 0);
200    test(S(""), 0, 1, SV("abcdefghij"), 10, 1, 0);
201    test(S(""), 0, 1, SV("abcdefghij"), 11, 0, 0);
202    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 0, 0, 0);
203    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 0, 1, -1);
204    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 0, 10, -10);
205    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 0, 19, -19);
206    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 0, 20, -20);
207    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 0, 21, -20);
208    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 1, 0, 0);
209    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 1, 1, -1);
210    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 1, 9, -9);
211    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 1, 18, -18);
212    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 1, 19, -19);
213    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 1, 20, -19);
214    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 10, 0, 0);
215    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 10, 1, -1);
216    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 10, 5, -5);
217    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 10, 9, -9);
218    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 10, 10, -10);
219    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 10, 11, -10);
220    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 19, 0, 0);
221    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 19, 1, -1);
222    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 19, 2, -1);
223    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 20, 0, 0);
224    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 20, 1, 0);
225    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), 21, 0, 0);
226    test(S(""), 1, 0, SV(""), 0, 0, 0);
227    test(S(""), 1, 0, SV(""), 0, 1, 0);
228    test(S(""), 1, 0, SV(""), 1, 0, 0);
229    test(S(""), 1, 0, SV("abcde"), 0, 0, 0);
230    test(S(""), 1, 0, SV("abcde"), 0, 1, 0);
231    test(S(""), 1, 0, SV("abcde"), 0, 2, 0);
232    test(S(""), 1, 0, SV("abcde"), 0, 4, 0);
233    test(S(""), 1, 0, SV("abcde"), 0, 5, 0);
234    test(S(""), 1, 0, SV("abcde"), 0, 6, 0);
235    test(S(""), 1, 0, SV("abcde"), 1, 0, 0);
236    test(S(""), 1, 0, SV("abcde"), 1, 1, 0);
237    test(S(""), 1, 0, SV("abcde"), 1, 2, 0);
238    test(S(""), 1, 0, SV("abcde"), 1, 3, 0);
239    test(S(""), 1, 0, SV("abcde"), 1, 4, 0);
240    test(S(""), 1, 0, SV("abcde"), 1, 5, 0);
241    test(S(""), 1, 0, SV("abcde"), 2, 0, 0);
242    test(S(""), 1, 0, SV("abcde"), 2, 1, 0);
243    test(S(""), 1, 0, SV("abcde"), 2, 2, 0);
244    test(S(""), 1, 0, SV("abcde"), 2, 3, 0);
245    test(S(""), 1, 0, SV("abcde"), 2, 4, 0);
246    test(S(""), 1, 0, SV("abcde"), 4, 0, 0);
247    test(S(""), 1, 0, SV("abcde"), 4, 1, 0);
248    test(S(""), 1, 0, SV("abcde"), 4, 2, 0);
249    test(S(""), 1, 0, SV("abcde"), 5, 0, 0);
250    test(S(""), 1, 0, SV("abcde"), 5, 1, 0);
251    test(S(""), 1, 0, SV("abcde"), 6, 0, 0);
252    test(S(""), 1, 0, SV("abcdefghij"), 0, 0, 0);
253    test(S(""), 1, 0, SV("abcdefghij"), 0, 1, 0);
254    test(S(""), 1, 0, SV("abcdefghij"), 0, 5, 0);
255    test(S(""), 1, 0, SV("abcdefghij"), 0, 9, 0);
256    test(S(""), 1, 0, SV("abcdefghij"), 0, 10, 0);
257    test(S(""), 1, 0, SV("abcdefghij"), 0, 11, 0);
258    test(S(""), 1, 0, SV("abcdefghij"), 1, 0, 0);
259    test(S(""), 1, 0, SV("abcdefghij"), 1, 1, 0);
260    test(S(""), 1, 0, SV("abcdefghij"), 1, 4, 0);
261    test(S(""), 1, 0, SV("abcdefghij"), 1, 8, 0);
262    test(S(""), 1, 0, SV("abcdefghij"), 1, 9, 0);
263    test(S(""), 1, 0, SV("abcdefghij"), 1, 10, 0);
264    test(S(""), 1, 0, SV("abcdefghij"), 5, 0, 0);
265    test(S(""), 1, 0, SV("abcdefghij"), 5, 1, 0);
266    test(S(""), 1, 0, SV("abcdefghij"), 5, 2, 0);
267    test(S(""), 1, 0, SV("abcdefghij"), 5, 4, 0);
268    test(S(""), 1, 0, SV("abcdefghij"), 5, 5, 0);
269    test(S(""), 1, 0, SV("abcdefghij"), 5, 6, 0);
270    test(S(""), 1, 0, SV("abcdefghij"), 9, 0, 0);
271    test(S(""), 1, 0, SV("abcdefghij"), 9, 1, 0);
272    test(S(""), 1, 0, SV("abcdefghij"), 9, 2, 0);
273    test(S(""), 1, 0, SV("abcdefghij"), 10, 0, 0);
274    test(S(""), 1, 0, SV("abcdefghij"), 10, 1, 0);
275    test(S(""), 1, 0, SV("abcdefghij"), 11, 0, 0);
276    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
277    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 0, 1, 0);
278}
279
280template <class S, class SV>
281void test2()
282{
283    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 0, 10, 0);
284    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 0, 19, 0);
285    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 0, 20, 0);
286    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 0, 21, 0);
287    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
288    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 1, 1, 0);
289    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 1, 9, 0);
290    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 1, 18, 0);
291    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 1, 19, 0);
292    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 1, 20, 0);
293    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
294    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 10, 1, 0);
295    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 10, 5, 0);
296    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 10, 9, 0);
297    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 10, 10, 0);
298    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 10, 11, 0);
299    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
300    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 19, 1, 0);
301    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 19, 2, 0);
302    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
303    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
304    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
305    test(S("abcde"), 0, 0, SV(""), 0, 0, 0);
306    test(S("abcde"), 0, 0, SV(""), 0, 1, 0);
307    test(S("abcde"), 0, 0, SV(""), 1, 0, 0);
308    test(S("abcde"), 0, 0, SV("abcde"), 0, 0, 0);
309    test(S("abcde"), 0, 0, SV("abcde"), 0, 1, -1);
310    test(S("abcde"), 0, 0, SV("abcde"), 0, 2, -2);
311    test(S("abcde"), 0, 0, SV("abcde"), 0, 4, -4);
312    test(S("abcde"), 0, 0, SV("abcde"), 0, 5, -5);
313    test(S("abcde"), 0, 0, SV("abcde"), 0, 6, -5);
314    test(S("abcde"), 0, 0, SV("abcde"), 1, 0, 0);
315    test(S("abcde"), 0, 0, SV("abcde"), 1, 1, -1);
316    test(S("abcde"), 0, 0, SV("abcde"), 1, 2, -2);
317    test(S("abcde"), 0, 0, SV("abcde"), 1, 3, -3);
318    test(S("abcde"), 0, 0, SV("abcde"), 1, 4, -4);
319    test(S("abcde"), 0, 0, SV("abcde"), 1, 5, -4);
320    test(S("abcde"), 0, 0, SV("abcde"), 2, 0, 0);
321    test(S("abcde"), 0, 0, SV("abcde"), 2, 1, -1);
322    test(S("abcde"), 0, 0, SV("abcde"), 2, 2, -2);
323    test(S("abcde"), 0, 0, SV("abcde"), 2, 3, -3);
324    test(S("abcde"), 0, 0, SV("abcde"), 2, 4, -3);
325    test(S("abcde"), 0, 0, SV("abcde"), 4, 0, 0);
326    test(S("abcde"), 0, 0, SV("abcde"), 4, 1, -1);
327    test(S("abcde"), 0, 0, SV("abcde"), 4, 2, -1);
328    test(S("abcde"), 0, 0, SV("abcde"), 5, 0, 0);
329    test(S("abcde"), 0, 0, SV("abcde"), 5, 1, 0);
330    test(S("abcde"), 0, 0, SV("abcde"), 6, 0, 0);
331    test(S("abcde"), 0, 0, SV("abcdefghij"), 0, 0, 0);
332    test(S("abcde"), 0, 0, SV("abcdefghij"), 0, 1, -1);
333    test(S("abcde"), 0, 0, SV("abcdefghij"), 0, 5, -5);
334    test(S("abcde"), 0, 0, SV("abcdefghij"), 0, 9, -9);
335    test(S("abcde"), 0, 0, SV("abcdefghij"), 0, 10, -10);
336    test(S("abcde"), 0, 0, SV("abcdefghij"), 0, 11, -10);
337    test(S("abcde"), 0, 0, SV("abcdefghij"), 1, 0, 0);
338    test(S("abcde"), 0, 0, SV("abcdefghij"), 1, 1, -1);
339    test(S("abcde"), 0, 0, SV("abcdefghij"), 1, 4, -4);
340    test(S("abcde"), 0, 0, SV("abcdefghij"), 1, 8, -8);
341    test(S("abcde"), 0, 0, SV("abcdefghij"), 1, 9, -9);
342    test(S("abcde"), 0, 0, SV("abcdefghij"), 1, 10, -9);
343    test(S("abcde"), 0, 0, SV("abcdefghij"), 5, 0, 0);
344    test(S("abcde"), 0, 0, SV("abcdefghij"), 5, 1, -1);
345    test(S("abcde"), 0, 0, SV("abcdefghij"), 5, 2, -2);
346    test(S("abcde"), 0, 0, SV("abcdefghij"), 5, 4, -4);
347    test(S("abcde"), 0, 0, SV("abcdefghij"), 5, 5, -5);
348    test(S("abcde"), 0, 0, SV("abcdefghij"), 5, 6, -5);
349    test(S("abcde"), 0, 0, SV("abcdefghij"), 9, 0, 0);
350    test(S("abcde"), 0, 0, SV("abcdefghij"), 9, 1, -1);
351    test(S("abcde"), 0, 0, SV("abcdefghij"), 9, 2, -1);
352    test(S("abcde"), 0, 0, SV("abcdefghij"), 10, 0, 0);
353    test(S("abcde"), 0, 0, SV("abcdefghij"), 10, 1, 0);
354    test(S("abcde"), 0, 0, SV("abcdefghij"), 11, 0, 0);
355    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
356    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 1, -1);
357    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 10, -10);
358    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 19, -19);
359    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 20, -20);
360    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 21, -20);
361    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
362    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 1, -1);
363    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 9, -9);
364    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 18, -18);
365    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 19, -19);
366    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 20, -19);
367    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
368    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 1, -1);
369    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 5, -5);
370    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 9, -9);
371    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 10, -10);
372    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 11, -10);
373    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
374    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 19, 1, -1);
375    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 19, 2, -1);
376    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
377    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
378    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
379    test(S("abcde"), 0, 1, SV(""), 0, 0, 1);
380    test(S("abcde"), 0, 1, SV(""), 0, 1, 1);
381    test(S("abcde"), 0, 1, SV(""), 1, 0, 0);
382    test(S("abcde"), 0, 1, SV("abcde"), 0, 0, 1);
383}
384
385template <class S, class SV>
386void test3()
387{
388    test(S("abcde"), 0, 1, SV("abcde"), 0, 1, 0);
389    test(S("abcde"), 0, 1, SV("abcde"), 0, 2, -1);
390    test(S("abcde"), 0, 1, SV("abcde"), 0, 4, -3);
391    test(S("abcde"), 0, 1, SV("abcde"), 0, 5, -4);
392    test(S("abcde"), 0, 1, SV("abcde"), 0, 6, -4);
393    test(S("abcde"), 0, 1, SV("abcde"), 1, 0, 1);
394    test(S("abcde"), 0, 1, SV("abcde"), 1, 1, -1);
395    test(S("abcde"), 0, 1, SV("abcde"), 1, 2, -1);
396    test(S("abcde"), 0, 1, SV("abcde"), 1, 3, -1);
397    test(S("abcde"), 0, 1, SV("abcde"), 1, 4, -1);
398    test(S("abcde"), 0, 1, SV("abcde"), 1, 5, -1);
399    test(S("abcde"), 0, 1, SV("abcde"), 2, 0, 1);
400    test(S("abcde"), 0, 1, SV("abcde"), 2, 1, -2);
401    test(S("abcde"), 0, 1, SV("abcde"), 2, 2, -2);
402    test(S("abcde"), 0, 1, SV("abcde"), 2, 3, -2);
403    test(S("abcde"), 0, 1, SV("abcde"), 2, 4, -2);
404    test(S("abcde"), 0, 1, SV("abcde"), 4, 0, 1);
405    test(S("abcde"), 0, 1, SV("abcde"), 4, 1, -4);
406    test(S("abcde"), 0, 1, SV("abcde"), 4, 2, -4);
407    test(S("abcde"), 0, 1, SV("abcde"), 5, 0, 1);
408    test(S("abcde"), 0, 1, SV("abcde"), 5, 1, 1);
409    test(S("abcde"), 0, 1, SV("abcde"), 6, 0, 0);
410    test(S("abcde"), 0, 1, SV("abcdefghij"), 0, 0, 1);
411    test(S("abcde"), 0, 1, SV("abcdefghij"), 0, 1, 0);
412    test(S("abcde"), 0, 1, SV("abcdefghij"), 0, 5, -4);
413    test(S("abcde"), 0, 1, SV("abcdefghij"), 0, 9, -8);
414    test(S("abcde"), 0, 1, SV("abcdefghij"), 0, 10, -9);
415    test(S("abcde"), 0, 1, SV("abcdefghij"), 0, 11, -9);
416    test(S("abcde"), 0, 1, SV("abcdefghij"), 1, 0, 1);
417    test(S("abcde"), 0, 1, SV("abcdefghij"), 1, 1, -1);
418    test(S("abcde"), 0, 1, SV("abcdefghij"), 1, 4, -1);
419    test(S("abcde"), 0, 1, SV("abcdefghij"), 1, 8, -1);
420    test(S("abcde"), 0, 1, SV("abcdefghij"), 1, 9, -1);
421    test(S("abcde"), 0, 1, SV("abcdefghij"), 1, 10, -1);
422    test(S("abcde"), 0, 1, SV("abcdefghij"), 5, 0, 1);
423    test(S("abcde"), 0, 1, SV("abcdefghij"), 5, 1, -5);
424    test(S("abcde"), 0, 1, SV("abcdefghij"), 5, 2, -5);
425    test(S("abcde"), 0, 1, SV("abcdefghij"), 5, 4, -5);
426    test(S("abcde"), 0, 1, SV("abcdefghij"), 5, 5, -5);
427    test(S("abcde"), 0, 1, SV("abcdefghij"), 5, 6, -5);
428    test(S("abcde"), 0, 1, SV("abcdefghij"), 9, 0, 1);
429    test(S("abcde"), 0, 1, SV("abcdefghij"), 9, 1, -9);
430    test(S("abcde"), 0, 1, SV("abcdefghij"), 9, 2, -9);
431    test(S("abcde"), 0, 1, SV("abcdefghij"), 10, 0, 1);
432    test(S("abcde"), 0, 1, SV("abcdefghij"), 10, 1, 1);
433    test(S("abcde"), 0, 1, SV("abcdefghij"), 11, 0, 0);
434    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 0, 1);
435    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 1, 0);
436    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 10, -9);
437    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 19, -18);
438    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 20, -19);
439    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 21, -19);
440    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 0, 1);
441    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 1, -1);
442    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 9, -1);
443    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 18, -1);
444    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 19, -1);
445    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 20, -1);
446    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 0, 1);
447    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 1, -10);
448    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 5, -10);
449    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 9, -10);
450    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 10, -10);
451    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 11, -10);
452    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 19, 0, 1);
453    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 19, 1, -19);
454    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 19, 2, -19);
455    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 20, 0, 1);
456    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 20, 1, 1);
457    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), 21, 0, 0);
458    test(S("abcde"), 0, 2, SV(""), 0, 0, 2);
459    test(S("abcde"), 0, 2, SV(""), 0, 1, 2);
460    test(S("abcde"), 0, 2, SV(""), 1, 0, 0);
461    test(S("abcde"), 0, 2, SV("abcde"), 0, 0, 2);
462    test(S("abcde"), 0, 2, SV("abcde"), 0, 1, 1);
463    test(S("abcde"), 0, 2, SV("abcde"), 0, 2, 0);
464    test(S("abcde"), 0, 2, SV("abcde"), 0, 4, -2);
465    test(S("abcde"), 0, 2, SV("abcde"), 0, 5, -3);
466    test(S("abcde"), 0, 2, SV("abcde"), 0, 6, -3);
467    test(S("abcde"), 0, 2, SV("abcde"), 1, 0, 2);
468    test(S("abcde"), 0, 2, SV("abcde"), 1, 1, -1);
469    test(S("abcde"), 0, 2, SV("abcde"), 1, 2, -1);
470    test(S("abcde"), 0, 2, SV("abcde"), 1, 3, -1);
471    test(S("abcde"), 0, 2, SV("abcde"), 1, 4, -1);
472    test(S("abcde"), 0, 2, SV("abcde"), 1, 5, -1);
473    test(S("abcde"), 0, 2, SV("abcde"), 2, 0, 2);
474    test(S("abcde"), 0, 2, SV("abcde"), 2, 1, -2);
475    test(S("abcde"), 0, 2, SV("abcde"), 2, 2, -2);
476    test(S("abcde"), 0, 2, SV("abcde"), 2, 3, -2);
477    test(S("abcde"), 0, 2, SV("abcde"), 2, 4, -2);
478    test(S("abcde"), 0, 2, SV("abcde"), 4, 0, 2);
479    test(S("abcde"), 0, 2, SV("abcde"), 4, 1, -4);
480    test(S("abcde"), 0, 2, SV("abcde"), 4, 2, -4);
481    test(S("abcde"), 0, 2, SV("abcde"), 5, 0, 2);
482    test(S("abcde"), 0, 2, SV("abcde"), 5, 1, 2);
483    test(S("abcde"), 0, 2, SV("abcde"), 6, 0, 0);
484    test(S("abcde"), 0, 2, SV("abcdefghij"), 0, 0, 2);
485    test(S("abcde"), 0, 2, SV("abcdefghij"), 0, 1, 1);
486    test(S("abcde"), 0, 2, SV("abcdefghij"), 0, 5, -3);
487    test(S("abcde"), 0, 2, SV("abcdefghij"), 0, 9, -7);
488}
489
490template <class S, class SV>
491void test4()
492{
493    test(S("abcde"), 0, 2, SV("abcdefghij"), 0, 10, -8);
494    test(S("abcde"), 0, 2, SV("abcdefghij"), 0, 11, -8);
495    test(S("abcde"), 0, 2, SV("abcdefghij"), 1, 0, 2);
496    test(S("abcde"), 0, 2, SV("abcdefghij"), 1, 1, -1);
497    test(S("abcde"), 0, 2, SV("abcdefghij"), 1, 4, -1);
498    test(S("abcde"), 0, 2, SV("abcdefghij"), 1, 8, -1);
499    test(S("abcde"), 0, 2, SV("abcdefghij"), 1, 9, -1);
500    test(S("abcde"), 0, 2, SV("abcdefghij"), 1, 10, -1);
501    test(S("abcde"), 0, 2, SV("abcdefghij"), 5, 0, 2);
502    test(S("abcde"), 0, 2, SV("abcdefghij"), 5, 1, -5);
503    test(S("abcde"), 0, 2, SV("abcdefghij"), 5, 2, -5);
504    test(S("abcde"), 0, 2, SV("abcdefghij"), 5, 4, -5);
505    test(S("abcde"), 0, 2, SV("abcdefghij"), 5, 5, -5);
506    test(S("abcde"), 0, 2, SV("abcdefghij"), 5, 6, -5);
507    test(S("abcde"), 0, 2, SV("abcdefghij"), 9, 0, 2);
508    test(S("abcde"), 0, 2, SV("abcdefghij"), 9, 1, -9);
509    test(S("abcde"), 0, 2, SV("abcdefghij"), 9, 2, -9);
510    test(S("abcde"), 0, 2, SV("abcdefghij"), 10, 0, 2);
511    test(S("abcde"), 0, 2, SV("abcdefghij"), 10, 1, 2);
512    test(S("abcde"), 0, 2, SV("abcdefghij"), 11, 0, 0);
513    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 0, 0, 2);
514    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 0, 1, 1);
515    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 0, 10, -8);
516    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 0, 19, -17);
517    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 0, 20, -18);
518    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 0, 21, -18);
519    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 1, 0, 2);
520    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 1, 1, -1);
521    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 1, 9, -1);
522    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 1, 18, -1);
523    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 1, 19, -1);
524    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 1, 20, -1);
525    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 10, 0, 2);
526    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 10, 1, -10);
527    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 10, 5, -10);
528    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 10, 9, -10);
529    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 10, 10, -10);
530    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 10, 11, -10);
531    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 19, 0, 2);
532    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 19, 1, -19);
533    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 19, 2, -19);
534    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 20, 0, 2);
535    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 20, 1, 2);
536    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), 21, 0, 0);
537    test(S("abcde"), 0, 4, SV(""), 0, 0, 4);
538    test(S("abcde"), 0, 4, SV(""), 0, 1, 4);
539    test(S("abcde"), 0, 4, SV(""), 1, 0, 0);
540    test(S("abcde"), 0, 4, SV("abcde"), 0, 0, 4);
541    test(S("abcde"), 0, 4, SV("abcde"), 0, 1, 3);
542    test(S("abcde"), 0, 4, SV("abcde"), 0, 2, 2);
543    test(S("abcde"), 0, 4, SV("abcde"), 0, 4, 0);
544    test(S("abcde"), 0, 4, SV("abcde"), 0, 5, -1);
545    test(S("abcde"), 0, 4, SV("abcde"), 0, 6, -1);
546    test(S("abcde"), 0, 4, SV("abcde"), 1, 0, 4);
547    test(S("abcde"), 0, 4, SV("abcde"), 1, 1, -1);
548    test(S("abcde"), 0, 4, SV("abcde"), 1, 2, -1);
549    test(S("abcde"), 0, 4, SV("abcde"), 1, 3, -1);
550    test(S("abcde"), 0, 4, SV("abcde"), 1, 4, -1);
551    test(S("abcde"), 0, 4, SV("abcde"), 1, 5, -1);
552    test(S("abcde"), 0, 4, SV("abcde"), 2, 0, 4);
553    test(S("abcde"), 0, 4, SV("abcde"), 2, 1, -2);
554    test(S("abcde"), 0, 4, SV("abcde"), 2, 2, -2);
555    test(S("abcde"), 0, 4, SV("abcde"), 2, 3, -2);
556    test(S("abcde"), 0, 4, SV("abcde"), 2, 4, -2);
557    test(S("abcde"), 0, 4, SV("abcde"), 4, 0, 4);
558    test(S("abcde"), 0, 4, SV("abcde"), 4, 1, -4);
559    test(S("abcde"), 0, 4, SV("abcde"), 4, 2, -4);
560    test(S("abcde"), 0, 4, SV("abcde"), 5, 0, 4);
561    test(S("abcde"), 0, 4, SV("abcde"), 5, 1, 4);
562    test(S("abcde"), 0, 4, SV("abcde"), 6, 0, 0);
563    test(S("abcde"), 0, 4, SV("abcdefghij"), 0, 0, 4);
564    test(S("abcde"), 0, 4, SV("abcdefghij"), 0, 1, 3);
565    test(S("abcde"), 0, 4, SV("abcdefghij"), 0, 5, -1);
566    test(S("abcde"), 0, 4, SV("abcdefghij"), 0, 9, -5);
567    test(S("abcde"), 0, 4, SV("abcdefghij"), 0, 10, -6);
568    test(S("abcde"), 0, 4, SV("abcdefghij"), 0, 11, -6);
569    test(S("abcde"), 0, 4, SV("abcdefghij"), 1, 0, 4);
570    test(S("abcde"), 0, 4, SV("abcdefghij"), 1, 1, -1);
571    test(S("abcde"), 0, 4, SV("abcdefghij"), 1, 4, -1);
572    test(S("abcde"), 0, 4, SV("abcdefghij"), 1, 8, -1);
573    test(S("abcde"), 0, 4, SV("abcdefghij"), 1, 9, -1);
574    test(S("abcde"), 0, 4, SV("abcdefghij"), 1, 10, -1);
575    test(S("abcde"), 0, 4, SV("abcdefghij"), 5, 0, 4);
576    test(S("abcde"), 0, 4, SV("abcdefghij"), 5, 1, -5);
577    test(S("abcde"), 0, 4, SV("abcdefghij"), 5, 2, -5);
578    test(S("abcde"), 0, 4, SV("abcdefghij"), 5, 4, -5);
579    test(S("abcde"), 0, 4, SV("abcdefghij"), 5, 5, -5);
580    test(S("abcde"), 0, 4, SV("abcdefghij"), 5, 6, -5);
581    test(S("abcde"), 0, 4, SV("abcdefghij"), 9, 0, 4);
582    test(S("abcde"), 0, 4, SV("abcdefghij"), 9, 1, -9);
583    test(S("abcde"), 0, 4, SV("abcdefghij"), 9, 2, -9);
584    test(S("abcde"), 0, 4, SV("abcdefghij"), 10, 0, 4);
585    test(S("abcde"), 0, 4, SV("abcdefghij"), 10, 1, 4);
586    test(S("abcde"), 0, 4, SV("abcdefghij"), 11, 0, 0);
587    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 0, 0, 4);
588    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 0, 1, 3);
589    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 0, 10, -6);
590    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 0, 19, -15);
591    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 0, 20, -16);
592    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 0, 21, -16);
593}
594
595template <class S, class SV>
596void test5()
597{
598    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 1, 0, 4);
599    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 1, 1, -1);
600    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 1, 9, -1);
601    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 1, 18, -1);
602    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 1, 19, -1);
603    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 1, 20, -1);
604    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 10, 0, 4);
605    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 10, 1, -10);
606    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 10, 5, -10);
607    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 10, 9, -10);
608    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 10, 10, -10);
609    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 10, 11, -10);
610    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 19, 0, 4);
611    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 19, 1, -19);
612    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 19, 2, -19);
613    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 20, 0, 4);
614    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 20, 1, 4);
615    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), 21, 0, 0);
616    test(S("abcde"), 0, 5, SV(""), 0, 0, 5);
617    test(S("abcde"), 0, 5, SV(""), 0, 1, 5);
618    test(S("abcde"), 0, 5, SV(""), 1, 0, 0);
619    test(S("abcde"), 0, 5, SV("abcde"), 0, 0, 5);
620    test(S("abcde"), 0, 5, SV("abcde"), 0, 1, 4);
621    test(S("abcde"), 0, 5, SV("abcde"), 0, 2, 3);
622    test(S("abcde"), 0, 5, SV("abcde"), 0, 4, 1);
623    test(S("abcde"), 0, 5, SV("abcde"), 0, 5, 0);
624    test(S("abcde"), 0, 5, SV("abcde"), 0, 6, 0);
625    test(S("abcde"), 0, 5, SV("abcde"), 1, 0, 5);
626    test(S("abcde"), 0, 5, SV("abcde"), 1, 1, -1);
627    test(S("abcde"), 0, 5, SV("abcde"), 1, 2, -1);
628    test(S("abcde"), 0, 5, SV("abcde"), 1, 3, -1);
629    test(S("abcde"), 0, 5, SV("abcde"), 1, 4, -1);
630    test(S("abcde"), 0, 5, SV("abcde"), 1, 5, -1);
631    test(S("abcde"), 0, 5, SV("abcde"), 2, 0, 5);
632    test(S("abcde"), 0, 5, SV("abcde"), 2, 1, -2);
633    test(S("abcde"), 0, 5, SV("abcde"), 2, 2, -2);
634    test(S("abcde"), 0, 5, SV("abcde"), 2, 3, -2);
635    test(S("abcde"), 0, 5, SV("abcde"), 2, 4, -2);
636    test(S("abcde"), 0, 5, SV("abcde"), 4, 0, 5);
637    test(S("abcde"), 0, 5, SV("abcde"), 4, 1, -4);
638    test(S("abcde"), 0, 5, SV("abcde"), 4, 2, -4);
639    test(S("abcde"), 0, 5, SV("abcde"), 5, 0, 5);
640    test(S("abcde"), 0, 5, SV("abcde"), 5, 1, 5);
641    test(S("abcde"), 0, 5, SV("abcde"), 6, 0, 0);
642    test(S("abcde"), 0, 5, SV("abcdefghij"), 0, 0, 5);
643    test(S("abcde"), 0, 5, SV("abcdefghij"), 0, 1, 4);
644    test(S("abcde"), 0, 5, SV("abcdefghij"), 0, 5, 0);
645    test(S("abcde"), 0, 5, SV("abcdefghij"), 0, 9, -4);
646    test(S("abcde"), 0, 5, SV("abcdefghij"), 0, 10, -5);
647    test(S("abcde"), 0, 5, SV("abcdefghij"), 0, 11, -5);
648    test(S("abcde"), 0, 5, SV("abcdefghij"), 1, 0, 5);
649    test(S("abcde"), 0, 5, SV("abcdefghij"), 1, 1, -1);
650    test(S("abcde"), 0, 5, SV("abcdefghij"), 1, 4, -1);
651    test(S("abcde"), 0, 5, SV("abcdefghij"), 1, 8, -1);
652    test(S("abcde"), 0, 5, SV("abcdefghij"), 1, 9, -1);
653    test(S("abcde"), 0, 5, SV("abcdefghij"), 1, 10, -1);
654    test(S("abcde"), 0, 5, SV("abcdefghij"), 5, 0, 5);
655    test(S("abcde"), 0, 5, SV("abcdefghij"), 5, 1, -5);
656    test(S("abcde"), 0, 5, SV("abcdefghij"), 5, 2, -5);
657    test(S("abcde"), 0, 5, SV("abcdefghij"), 5, 4, -5);
658    test(S("abcde"), 0, 5, SV("abcdefghij"), 5, 5, -5);
659    test(S("abcde"), 0, 5, SV("abcdefghij"), 5, 6, -5);
660    test(S("abcde"), 0, 5, SV("abcdefghij"), 9, 0, 5);
661    test(S("abcde"), 0, 5, SV("abcdefghij"), 9, 1, -9);
662    test(S("abcde"), 0, 5, SV("abcdefghij"), 9, 2, -9);
663    test(S("abcde"), 0, 5, SV("abcdefghij"), 10, 0, 5);
664    test(S("abcde"), 0, 5, SV("abcdefghij"), 10, 1, 5);
665    test(S("abcde"), 0, 5, SV("abcdefghij"), 11, 0, 0);
666    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 0, 0, 5);
667    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 0, 1, 4);
668    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 0, 10, -5);
669    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 0, 19, -14);
670    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 0, 20, -15);
671    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 0, 21, -15);
672    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 1, 0, 5);
673    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 1, 1, -1);
674    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 1, 9, -1);
675    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 1, 18, -1);
676    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 1, 19, -1);
677    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 1, 20, -1);
678    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 10, 0, 5);
679    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 10, 1, -10);
680    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 10, 5, -10);
681    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 10, 9, -10);
682    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 10, 10, -10);
683    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 10, 11, -10);
684    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 19, 0, 5);
685    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 19, 1, -19);
686    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 19, 2, -19);
687    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 20, 0, 5);
688    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 20, 1, 5);
689    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), 21, 0, 0);
690    test(S("abcde"), 0, 6, SV(""), 0, 0, 5);
691    test(S("abcde"), 0, 6, SV(""), 0, 1, 5);
692    test(S("abcde"), 0, 6, SV(""), 1, 0, 0);
693    test(S("abcde"), 0, 6, SV("abcde"), 0, 0, 5);
694    test(S("abcde"), 0, 6, SV("abcde"), 0, 1, 4);
695    test(S("abcde"), 0, 6, SV("abcde"), 0, 2, 3);
696    test(S("abcde"), 0, 6, SV("abcde"), 0, 4, 1);
697    test(S("abcde"), 0, 6, SV("abcde"), 0, 5, 0);
698}
699
700template <class S, class SV>
701void test6()
702{
703    test(S("abcde"), 0, 6, SV("abcde"), 0, 6, 0);
704    test(S("abcde"), 0, 6, SV("abcde"), 1, 0, 5);
705    test(S("abcde"), 0, 6, SV("abcde"), 1, 1, -1);
706    test(S("abcde"), 0, 6, SV("abcde"), 1, 2, -1);
707    test(S("abcde"), 0, 6, SV("abcde"), 1, 3, -1);
708    test(S("abcde"), 0, 6, SV("abcde"), 1, 4, -1);
709    test(S("abcde"), 0, 6, SV("abcde"), 1, 5, -1);
710    test(S("abcde"), 0, 6, SV("abcde"), 2, 0, 5);
711    test(S("abcde"), 0, 6, SV("abcde"), 2, 1, -2);
712    test(S("abcde"), 0, 6, SV("abcde"), 2, 2, -2);
713    test(S("abcde"), 0, 6, SV("abcde"), 2, 3, -2);
714    test(S("abcde"), 0, 6, SV("abcde"), 2, 4, -2);
715    test(S("abcde"), 0, 6, SV("abcde"), 4, 0, 5);
716    test(S("abcde"), 0, 6, SV("abcde"), 4, 1, -4);
717    test(S("abcde"), 0, 6, SV("abcde"), 4, 2, -4);
718    test(S("abcde"), 0, 6, SV("abcde"), 5, 0, 5);
719    test(S("abcde"), 0, 6, SV("abcde"), 5, 1, 5);
720    test(S("abcde"), 0, 6, SV("abcde"), 6, 0, 0);
721    test(S("abcde"), 0, 6, SV("abcdefghij"), 0, 0, 5);
722    test(S("abcde"), 0, 6, SV("abcdefghij"), 0, 1, 4);
723    test(S("abcde"), 0, 6, SV("abcdefghij"), 0, 5, 0);
724    test(S("abcde"), 0, 6, SV("abcdefghij"), 0, 9, -4);
725    test(S("abcde"), 0, 6, SV("abcdefghij"), 0, 10, -5);
726    test(S("abcde"), 0, 6, SV("abcdefghij"), 0, 11, -5);
727    test(S("abcde"), 0, 6, SV("abcdefghij"), 1, 0, 5);
728    test(S("abcde"), 0, 6, SV("abcdefghij"), 1, 1, -1);
729    test(S("abcde"), 0, 6, SV("abcdefghij"), 1, 4, -1);
730    test(S("abcde"), 0, 6, SV("abcdefghij"), 1, 8, -1);
731    test(S("abcde"), 0, 6, SV("abcdefghij"), 1, 9, -1);
732    test(S("abcde"), 0, 6, SV("abcdefghij"), 1, 10, -1);
733    test(S("abcde"), 0, 6, SV("abcdefghij"), 5, 0, 5);
734    test(S("abcde"), 0, 6, SV("abcdefghij"), 5, 1, -5);
735    test(S("abcde"), 0, 6, SV("abcdefghij"), 5, 2, -5);
736    test(S("abcde"), 0, 6, SV("abcdefghij"), 5, 4, -5);
737    test(S("abcde"), 0, 6, SV("abcdefghij"), 5, 5, -5);
738    test(S("abcde"), 0, 6, SV("abcdefghij"), 5, 6, -5);
739    test(S("abcde"), 0, 6, SV("abcdefghij"), 9, 0, 5);
740    test(S("abcde"), 0, 6, SV("abcdefghij"), 9, 1, -9);
741    test(S("abcde"), 0, 6, SV("abcdefghij"), 9, 2, -9);
742    test(S("abcde"), 0, 6, SV("abcdefghij"), 10, 0, 5);
743    test(S("abcde"), 0, 6, SV("abcdefghij"), 10, 1, 5);
744    test(S("abcde"), 0, 6, SV("abcdefghij"), 11, 0, 0);
745    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 0, 0, 5);
746    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 0, 1, 4);
747    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 0, 10, -5);
748    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 0, 19, -14);
749    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 0, 20, -15);
750    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 0, 21, -15);
751    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 1, 0, 5);
752    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 1, 1, -1);
753    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 1, 9, -1);
754    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 1, 18, -1);
755    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 1, 19, -1);
756    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 1, 20, -1);
757    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 10, 0, 5);
758    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 10, 1, -10);
759    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 10, 5, -10);
760    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 10, 9, -10);
761    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 10, 10, -10);
762    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 10, 11, -10);
763    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 19, 0, 5);
764    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 19, 1, -19);
765    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 19, 2, -19);
766    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 20, 0, 5);
767    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 20, 1, 5);
768    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), 21, 0, 0);
769    test(S("abcde"), 1, 0, SV(""), 0, 0, 0);
770    test(S("abcde"), 1, 0, SV(""), 0, 1, 0);
771    test(S("abcde"), 1, 0, SV(""), 1, 0, 0);
772    test(S("abcde"), 1, 0, SV("abcde"), 0, 0, 0);
773    test(S("abcde"), 1, 0, SV("abcde"), 0, 1, -1);
774    test(S("abcde"), 1, 0, SV("abcde"), 0, 2, -2);
775    test(S("abcde"), 1, 0, SV("abcde"), 0, 4, -4);
776    test(S("abcde"), 1, 0, SV("abcde"), 0, 5, -5);
777    test(S("abcde"), 1, 0, SV("abcde"), 0, 6, -5);
778    test(S("abcde"), 1, 0, SV("abcde"), 1, 0, 0);
779    test(S("abcde"), 1, 0, SV("abcde"), 1, 1, -1);
780    test(S("abcde"), 1, 0, SV("abcde"), 1, 2, -2);
781    test(S("abcde"), 1, 0, SV("abcde"), 1, 3, -3);
782    test(S("abcde"), 1, 0, SV("abcde"), 1, 4, -4);
783    test(S("abcde"), 1, 0, SV("abcde"), 1, 5, -4);
784    test(S("abcde"), 1, 0, SV("abcde"), 2, 0, 0);
785    test(S("abcde"), 1, 0, SV("abcde"), 2, 1, -1);
786    test(S("abcde"), 1, 0, SV("abcde"), 2, 2, -2);
787    test(S("abcde"), 1, 0, SV("abcde"), 2, 3, -3);
788    test(S("abcde"), 1, 0, SV("abcde"), 2, 4, -3);
789    test(S("abcde"), 1, 0, SV("abcde"), 4, 0, 0);
790    test(S("abcde"), 1, 0, SV("abcde"), 4, 1, -1);
791    test(S("abcde"), 1, 0, SV("abcde"), 4, 2, -1);
792    test(S("abcde"), 1, 0, SV("abcde"), 5, 0, 0);
793    test(S("abcde"), 1, 0, SV("abcde"), 5, 1, 0);
794    test(S("abcde"), 1, 0, SV("abcde"), 6, 0, 0);
795    test(S("abcde"), 1, 0, SV("abcdefghij"), 0, 0, 0);
796    test(S("abcde"), 1, 0, SV("abcdefghij"), 0, 1, -1);
797    test(S("abcde"), 1, 0, SV("abcdefghij"), 0, 5, -5);
798    test(S("abcde"), 1, 0, SV("abcdefghij"), 0, 9, -9);
799    test(S("abcde"), 1, 0, SV("abcdefghij"), 0, 10, -10);
800    test(S("abcde"), 1, 0, SV("abcdefghij"), 0, 11, -10);
801    test(S("abcde"), 1, 0, SV("abcdefghij"), 1, 0, 0);
802    test(S("abcde"), 1, 0, SV("abcdefghij"), 1, 1, -1);
803}
804
805template <class S, class SV>
806void test7()
807{
808    test(S("abcde"), 1, 0, SV("abcdefghij"), 1, 4, -4);
809    test(S("abcde"), 1, 0, SV("abcdefghij"), 1, 8, -8);
810    test(S("abcde"), 1, 0, SV("abcdefghij"), 1, 9, -9);
811    test(S("abcde"), 1, 0, SV("abcdefghij"), 1, 10, -9);
812    test(S("abcde"), 1, 0, SV("abcdefghij"), 5, 0, 0);
813    test(S("abcde"), 1, 0, SV("abcdefghij"), 5, 1, -1);
814    test(S("abcde"), 1, 0, SV("abcdefghij"), 5, 2, -2);
815    test(S("abcde"), 1, 0, SV("abcdefghij"), 5, 4, -4);
816    test(S("abcde"), 1, 0, SV("abcdefghij"), 5, 5, -5);
817    test(S("abcde"), 1, 0, SV("abcdefghij"), 5, 6, -5);
818    test(S("abcde"), 1, 0, SV("abcdefghij"), 9, 0, 0);
819    test(S("abcde"), 1, 0, SV("abcdefghij"), 9, 1, -1);
820    test(S("abcde"), 1, 0, SV("abcdefghij"), 9, 2, -1);
821    test(S("abcde"), 1, 0, SV("abcdefghij"), 10, 0, 0);
822    test(S("abcde"), 1, 0, SV("abcdefghij"), 10, 1, 0);
823    test(S("abcde"), 1, 0, SV("abcdefghij"), 11, 0, 0);
824    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
825    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 1, -1);
826    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 10, -10);
827    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 19, -19);
828    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 20, -20);
829    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 21, -20);
830    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
831    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 1, -1);
832    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 9, -9);
833    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 18, -18);
834    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 19, -19);
835    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 20, -19);
836    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
837    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 1, -1);
838    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 5, -5);
839    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 9, -9);
840    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 10, -10);
841    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 11, -10);
842    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
843    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 19, 1, -1);
844    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 19, 2, -1);
845    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
846    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
847    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
848    test(S("abcde"), 1, 1, SV(""), 0, 0, 1);
849    test(S("abcde"), 1, 1, SV(""), 0, 1, 1);
850    test(S("abcde"), 1, 1, SV(""), 1, 0, 0);
851    test(S("abcde"), 1, 1, SV("abcde"), 0, 0, 1);
852    test(S("abcde"), 1, 1, SV("abcde"), 0, 1, 1);
853    test(S("abcde"), 1, 1, SV("abcde"), 0, 2, 1);
854    test(S("abcde"), 1, 1, SV("abcde"), 0, 4, 1);
855    test(S("abcde"), 1, 1, SV("abcde"), 0, 5, 1);
856    test(S("abcde"), 1, 1, SV("abcde"), 0, 6, 1);
857    test(S("abcde"), 1, 1, SV("abcde"), 1, 0, 1);
858    test(S("abcde"), 1, 1, SV("abcde"), 1, 1, 0);
859    test(S("abcde"), 1, 1, SV("abcde"), 1, 2, -1);
860    test(S("abcde"), 1, 1, SV("abcde"), 1, 3, -2);
861    test(S("abcde"), 1, 1, SV("abcde"), 1, 4, -3);
862    test(S("abcde"), 1, 1, SV("abcde"), 1, 5, -3);
863    test(S("abcde"), 1, 1, SV("abcde"), 2, 0, 1);
864    test(S("abcde"), 1, 1, SV("abcde"), 2, 1, -1);
865    test(S("abcde"), 1, 1, SV("abcde"), 2, 2, -1);
866    test(S("abcde"), 1, 1, SV("abcde"), 2, 3, -1);
867    test(S("abcde"), 1, 1, SV("abcde"), 2, 4, -1);
868    test(S("abcde"), 1, 1, SV("abcde"), 4, 0, 1);
869    test(S("abcde"), 1, 1, SV("abcde"), 4, 1, -3);
870    test(S("abcde"), 1, 1, SV("abcde"), 4, 2, -3);
871    test(S("abcde"), 1, 1, SV("abcde"), 5, 0, 1);
872    test(S("abcde"), 1, 1, SV("abcde"), 5, 1, 1);
873    test(S("abcde"), 1, 1, SV("abcde"), 6, 0, 0);
874    test(S("abcde"), 1, 1, SV("abcdefghij"), 0, 0, 1);
875    test(S("abcde"), 1, 1, SV("abcdefghij"), 0, 1, 1);
876    test(S("abcde"), 1, 1, SV("abcdefghij"), 0, 5, 1);
877    test(S("abcde"), 1, 1, SV("abcdefghij"), 0, 9, 1);
878    test(S("abcde"), 1, 1, SV("abcdefghij"), 0, 10, 1);
879    test(S("abcde"), 1, 1, SV("abcdefghij"), 0, 11, 1);
880    test(S("abcde"), 1, 1, SV("abcdefghij"), 1, 0, 1);
881    test(S("abcde"), 1, 1, SV("abcdefghij"), 1, 1, 0);
882    test(S("abcde"), 1, 1, SV("abcdefghij"), 1, 4, -3);
883    test(S("abcde"), 1, 1, SV("abcdefghij"), 1, 8, -7);
884    test(S("abcde"), 1, 1, SV("abcdefghij"), 1, 9, -8);
885    test(S("abcde"), 1, 1, SV("abcdefghij"), 1, 10, -8);
886    test(S("abcde"), 1, 1, SV("abcdefghij"), 5, 0, 1);
887    test(S("abcde"), 1, 1, SV("abcdefghij"), 5, 1, -4);
888    test(S("abcde"), 1, 1, SV("abcdefghij"), 5, 2, -4);
889    test(S("abcde"), 1, 1, SV("abcdefghij"), 5, 4, -4);
890    test(S("abcde"), 1, 1, SV("abcdefghij"), 5, 5, -4);
891    test(S("abcde"), 1, 1, SV("abcdefghij"), 5, 6, -4);
892    test(S("abcde"), 1, 1, SV("abcdefghij"), 9, 0, 1);
893    test(S("abcde"), 1, 1, SV("abcdefghij"), 9, 1, -8);
894    test(S("abcde"), 1, 1, SV("abcdefghij"), 9, 2, -8);
895    test(S("abcde"), 1, 1, SV("abcdefghij"), 10, 0, 1);
896    test(S("abcde"), 1, 1, SV("abcdefghij"), 10, 1, 1);
897    test(S("abcde"), 1, 1, SV("abcdefghij"), 11, 0, 0);
898    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 0, 1);
899    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 1, 1);
900    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 10, 1);
901    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 19, 1);
902    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 20, 1);
903    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 21, 1);
904    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 0, 1);
905    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 1, 0);
906    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 9, -8);
907    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 18, -17);
908}
909
910template <class S, class SV>
911void test8()
912{
913    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 19, -18);
914    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 20, -18);
915    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 0, 1);
916    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 1, -9);
917    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 5, -9);
918    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 9, -9);
919    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 10, -9);
920    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 11, -9);
921    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 19, 0, 1);
922    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 19, 1, -18);
923    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 19, 2, -18);
924    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 20, 0, 1);
925    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 20, 1, 1);
926    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 21, 0, 0);
927    test(S("abcde"), 1, 2, SV(""), 0, 0, 2);
928    test(S("abcde"), 1, 2, SV(""), 0, 1, 2);
929    test(S("abcde"), 1, 2, SV(""), 1, 0, 0);
930    test(S("abcde"), 1, 2, SV("abcde"), 0, 0, 2);
931    test(S("abcde"), 1, 2, SV("abcde"), 0, 1, 1);
932    test(S("abcde"), 1, 2, SV("abcde"), 0, 2, 1);
933    test(S("abcde"), 1, 2, SV("abcde"), 0, 4, 1);
934    test(S("abcde"), 1, 2, SV("abcde"), 0, 5, 1);
935    test(S("abcde"), 1, 2, SV("abcde"), 0, 6, 1);
936    test(S("abcde"), 1, 2, SV("abcde"), 1, 0, 2);
937    test(S("abcde"), 1, 2, SV("abcde"), 1, 1, 1);
938    test(S("abcde"), 1, 2, SV("abcde"), 1, 2, 0);
939    test(S("abcde"), 1, 2, SV("abcde"), 1, 3, -1);
940    test(S("abcde"), 1, 2, SV("abcde"), 1, 4, -2);
941    test(S("abcde"), 1, 2, SV("abcde"), 1, 5, -2);
942    test(S("abcde"), 1, 2, SV("abcde"), 2, 0, 2);
943    test(S("abcde"), 1, 2, SV("abcde"), 2, 1, -1);
944    test(S("abcde"), 1, 2, SV("abcde"), 2, 2, -1);
945    test(S("abcde"), 1, 2, SV("abcde"), 2, 3, -1);
946    test(S("abcde"), 1, 2, SV("abcde"), 2, 4, -1);
947    test(S("abcde"), 1, 2, SV("abcde"), 4, 0, 2);
948    test(S("abcde"), 1, 2, SV("abcde"), 4, 1, -3);
949    test(S("abcde"), 1, 2, SV("abcde"), 4, 2, -3);
950    test(S("abcde"), 1, 2, SV("abcde"), 5, 0, 2);
951    test(S("abcde"), 1, 2, SV("abcde"), 5, 1, 2);
952    test(S("abcde"), 1, 2, SV("abcde"), 6, 0, 0);
953    test(S("abcde"), 1, 2, SV("abcdefghij"), 0, 0, 2);
954    test(S("abcde"), 1, 2, SV("abcdefghij"), 0, 1, 1);
955    test(S("abcde"), 1, 2, SV("abcdefghij"), 0, 5, 1);
956    test(S("abcde"), 1, 2, SV("abcdefghij"), 0, 9, 1);
957    test(S("abcde"), 1, 2, SV("abcdefghij"), 0, 10, 1);
958    test(S("abcde"), 1, 2, SV("abcdefghij"), 0, 11, 1);
959    test(S("abcde"), 1, 2, SV("abcdefghij"), 1, 0, 2);
960    test(S("abcde"), 1, 2, SV("abcdefghij"), 1, 1, 1);
961    test(S("abcde"), 1, 2, SV("abcdefghij"), 1, 4, -2);
962    test(S("abcde"), 1, 2, SV("abcdefghij"), 1, 8, -6);
963    test(S("abcde"), 1, 2, SV("abcdefghij"), 1, 9, -7);
964    test(S("abcde"), 1, 2, SV("abcdefghij"), 1, 10, -7);
965    test(S("abcde"), 1, 2, SV("abcdefghij"), 5, 0, 2);
966    test(S("abcde"), 1, 2, SV("abcdefghij"), 5, 1, -4);
967    test(S("abcde"), 1, 2, SV("abcdefghij"), 5, 2, -4);
968    test(S("abcde"), 1, 2, SV("abcdefghij"), 5, 4, -4);
969    test(S("abcde"), 1, 2, SV("abcdefghij"), 5, 5, -4);
970    test(S("abcde"), 1, 2, SV("abcdefghij"), 5, 6, -4);
971    test(S("abcde"), 1, 2, SV("abcdefghij"), 9, 0, 2);
972    test(S("abcde"), 1, 2, SV("abcdefghij"), 9, 1, -8);
973    test(S("abcde"), 1, 2, SV("abcdefghij"), 9, 2, -8);
974    test(S("abcde"), 1, 2, SV("abcdefghij"), 10, 0, 2);
975    test(S("abcde"), 1, 2, SV("abcdefghij"), 10, 1, 2);
976    test(S("abcde"), 1, 2, SV("abcdefghij"), 11, 0, 0);
977    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 0, 0, 2);
978    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 0, 1, 1);
979    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 0, 10, 1);
980    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 0, 19, 1);
981    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 0, 20, 1);
982    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 0, 21, 1);
983    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 1, 0, 2);
984    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 1, 1, 1);
985    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 1, 9, -7);
986    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 1, 18, -16);
987    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 1, 19, -17);
988    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 1, 20, -17);
989    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 10, 0, 2);
990    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 10, 1, -9);
991    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 10, 5, -9);
992    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 10, 9, -9);
993    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 10, 10, -9);
994    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 10, 11, -9);
995    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 19, 0, 2);
996    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 19, 1, -18);
997    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 19, 2, -18);
998    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 20, 0, 2);
999    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 20, 1, 2);
1000    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 21, 0, 0);
1001    test(S("abcde"), 1, 3, SV(""), 0, 0, 3);
1002    test(S("abcde"), 1, 3, SV(""), 0, 1, 3);
1003    test(S("abcde"), 1, 3, SV(""), 1, 0, 0);
1004    test(S("abcde"), 1, 3, SV("abcde"), 0, 0, 3);
1005    test(S("abcde"), 1, 3, SV("abcde"), 0, 1, 1);
1006    test(S("abcde"), 1, 3, SV("abcde"), 0, 2, 1);
1007    test(S("abcde"), 1, 3, SV("abcde"), 0, 4, 1);
1008    test(S("abcde"), 1, 3, SV("abcde"), 0, 5, 1);
1009    test(S("abcde"), 1, 3, SV("abcde"), 0, 6, 1);
1010    test(S("abcde"), 1, 3, SV("abcde"), 1, 0, 3);
1011    test(S("abcde"), 1, 3, SV("abcde"), 1, 1, 2);
1012    test(S("abcde"), 1, 3, SV("abcde"), 1, 2, 1);
1013}
1014
1015template <class S, class SV>
1016void test9()
1017{
1018    test(S("abcde"), 1, 3, SV("abcde"), 1, 3, 0);
1019    test(S("abcde"), 1, 3, SV("abcde"), 1, 4, -1);
1020    test(S("abcde"), 1, 3, SV("abcde"), 1, 5, -1);
1021    test(S("abcde"), 1, 3, SV("abcde"), 2, 0, 3);
1022    test(S("abcde"), 1, 3, SV("abcde"), 2, 1, -1);
1023    test(S("abcde"), 1, 3, SV("abcde"), 2, 2, -1);
1024    test(S("abcde"), 1, 3, SV("abcde"), 2, 3, -1);
1025    test(S("abcde"), 1, 3, SV("abcde"), 2, 4, -1);
1026    test(S("abcde"), 1, 3, SV("abcde"), 4, 0, 3);
1027    test(S("abcde"), 1, 3, SV("abcde"), 4, 1, -3);
1028    test(S("abcde"), 1, 3, SV("abcde"), 4, 2, -3);
1029    test(S("abcde"), 1, 3, SV("abcde"), 5, 0, 3);
1030    test(S("abcde"), 1, 3, SV("abcde"), 5, 1, 3);
1031    test(S("abcde"), 1, 3, SV("abcde"), 6, 0, 0);
1032    test(S("abcde"), 1, 3, SV("abcdefghij"), 0, 0, 3);
1033    test(S("abcde"), 1, 3, SV("abcdefghij"), 0, 1, 1);
1034    test(S("abcde"), 1, 3, SV("abcdefghij"), 0, 5, 1);
1035    test(S("abcde"), 1, 3, SV("abcdefghij"), 0, 9, 1);
1036    test(S("abcde"), 1, 3, SV("abcdefghij"), 0, 10, 1);
1037    test(S("abcde"), 1, 3, SV("abcdefghij"), 0, 11, 1);
1038    test(S("abcde"), 1, 3, SV("abcdefghij"), 1, 0, 3);
1039    test(S("abcde"), 1, 3, SV("abcdefghij"), 1, 1, 2);
1040    test(S("abcde"), 1, 3, SV("abcdefghij"), 1, 4, -1);
1041    test(S("abcde"), 1, 3, SV("abcdefghij"), 1, 8, -5);
1042    test(S("abcde"), 1, 3, SV("abcdefghij"), 1, 9, -6);
1043    test(S("abcde"), 1, 3, SV("abcdefghij"), 1, 10, -6);
1044    test(S("abcde"), 1, 3, SV("abcdefghij"), 5, 0, 3);
1045    test(S("abcde"), 1, 3, SV("abcdefghij"), 5, 1, -4);
1046    test(S("abcde"), 1, 3, SV("abcdefghij"), 5, 2, -4);
1047    test(S("abcde"), 1, 3, SV("abcdefghij"), 5, 4, -4);
1048    test(S("abcde"), 1, 3, SV("abcdefghij"), 5, 5, -4);
1049    test(S("abcde"), 1, 3, SV("abcdefghij"), 5, 6, -4);
1050    test(S("abcde"), 1, 3, SV("abcdefghij"), 9, 0, 3);
1051    test(S("abcde"), 1, 3, SV("abcdefghij"), 9, 1, -8);
1052    test(S("abcde"), 1, 3, SV("abcdefghij"), 9, 2, -8);
1053    test(S("abcde"), 1, 3, SV("abcdefghij"), 10, 0, 3);
1054    test(S("abcde"), 1, 3, SV("abcdefghij"), 10, 1, 3);
1055    test(S("abcde"), 1, 3, SV("abcdefghij"), 11, 0, 0);
1056    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 0, 0, 3);
1057    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 0, 1, 1);
1058    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 0, 10, 1);
1059    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 0, 19, 1);
1060    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 0, 20, 1);
1061    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 0, 21, 1);
1062    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 1, 0, 3);
1063    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 1, 1, 2);
1064    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 1, 9, -6);
1065    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 1, 18, -15);
1066    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 1, 19, -16);
1067    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 1, 20, -16);
1068    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 10, 0, 3);
1069    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 10, 1, -9);
1070    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 10, 5, -9);
1071    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 10, 9, -9);
1072    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 10, 10, -9);
1073    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 10, 11, -9);
1074    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 19, 0, 3);
1075    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 19, 1, -18);
1076    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 19, 2, -18);
1077    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 20, 0, 3);
1078    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 20, 1, 3);
1079    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 21, 0, 0);
1080    test(S("abcde"), 1, 4, SV(""), 0, 0, 4);
1081    test(S("abcde"), 1, 4, SV(""), 0, 1, 4);
1082    test(S("abcde"), 1, 4, SV(""), 1, 0, 0);
1083    test(S("abcde"), 1, 4, SV("abcde"), 0, 0, 4);
1084    test(S("abcde"), 1, 4, SV("abcde"), 0, 1, 1);
1085    test(S("abcde"), 1, 4, SV("abcde"), 0, 2, 1);
1086    test(S("abcde"), 1, 4, SV("abcde"), 0, 4, 1);
1087    test(S("abcde"), 1, 4, SV("abcde"), 0, 5, 1);
1088    test(S("abcde"), 1, 4, SV("abcde"), 0, 6, 1);
1089    test(S("abcde"), 1, 4, SV("abcde"), 1, 0, 4);
1090    test(S("abcde"), 1, 4, SV("abcde"), 1, 1, 3);
1091    test(S("abcde"), 1, 4, SV("abcde"), 1, 2, 2);
1092    test(S("abcde"), 1, 4, SV("abcde"), 1, 3, 1);
1093    test(S("abcde"), 1, 4, SV("abcde"), 1, 4, 0);
1094    test(S("abcde"), 1, 4, SV("abcde"), 1, 5, 0);
1095    test(S("abcde"), 1, 4, SV("abcde"), 2, 0, 4);
1096    test(S("abcde"), 1, 4, SV("abcde"), 2, 1, -1);
1097    test(S("abcde"), 1, 4, SV("abcde"), 2, 2, -1);
1098    test(S("abcde"), 1, 4, SV("abcde"), 2, 3, -1);
1099    test(S("abcde"), 1, 4, SV("abcde"), 2, 4, -1);
1100    test(S("abcde"), 1, 4, SV("abcde"), 4, 0, 4);
1101    test(S("abcde"), 1, 4, SV("abcde"), 4, 1, -3);
1102    test(S("abcde"), 1, 4, SV("abcde"), 4, 2, -3);
1103    test(S("abcde"), 1, 4, SV("abcde"), 5, 0, 4);
1104    test(S("abcde"), 1, 4, SV("abcde"), 5, 1, 4);
1105    test(S("abcde"), 1, 4, SV("abcde"), 6, 0, 0);
1106    test(S("abcde"), 1, 4, SV("abcdefghij"), 0, 0, 4);
1107    test(S("abcde"), 1, 4, SV("abcdefghij"), 0, 1, 1);
1108    test(S("abcde"), 1, 4, SV("abcdefghij"), 0, 5, 1);
1109    test(S("abcde"), 1, 4, SV("abcdefghij"), 0, 9, 1);
1110    test(S("abcde"), 1, 4, SV("abcdefghij"), 0, 10, 1);
1111    test(S("abcde"), 1, 4, SV("abcdefghij"), 0, 11, 1);
1112    test(S("abcde"), 1, 4, SV("abcdefghij"), 1, 0, 4);
1113    test(S("abcde"), 1, 4, SV("abcdefghij"), 1, 1, 3);
1114    test(S("abcde"), 1, 4, SV("abcdefghij"), 1, 4, 0);
1115    test(S("abcde"), 1, 4, SV("abcdefghij"), 1, 8, -4);
1116    test(S("abcde"), 1, 4, SV("abcdefghij"), 1, 9, -5);
1117    test(S("abcde"), 1, 4, SV("abcdefghij"), 1, 10, -5);
1118}
1119
1120template <class S, class SV>
1121void test10()
1122{
1123    test(S("abcde"), 1, 4, SV("abcdefghij"), 5, 0, 4);
1124    test(S("abcde"), 1, 4, SV("abcdefghij"), 5, 1, -4);
1125    test(S("abcde"), 1, 4, SV("abcdefghij"), 5, 2, -4);
1126    test(S("abcde"), 1, 4, SV("abcdefghij"), 5, 4, -4);
1127    test(S("abcde"), 1, 4, SV("abcdefghij"), 5, 5, -4);
1128    test(S("abcde"), 1, 4, SV("abcdefghij"), 5, 6, -4);
1129    test(S("abcde"), 1, 4, SV("abcdefghij"), 9, 0, 4);
1130    test(S("abcde"), 1, 4, SV("abcdefghij"), 9, 1, -8);
1131    test(S("abcde"), 1, 4, SV("abcdefghij"), 9, 2, -8);
1132    test(S("abcde"), 1, 4, SV("abcdefghij"), 10, 0, 4);
1133    test(S("abcde"), 1, 4, SV("abcdefghij"), 10, 1, 4);
1134    test(S("abcde"), 1, 4, SV("abcdefghij"), 11, 0, 0);
1135    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 0, 0, 4);
1136    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 0, 1, 1);
1137    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 0, 10, 1);
1138    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 0, 19, 1);
1139    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 0, 20, 1);
1140    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 0, 21, 1);
1141    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 1, 0, 4);
1142    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 1, 1, 3);
1143    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 1, 9, -5);
1144    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 1, 18, -14);
1145    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 1, 19, -15);
1146    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 1, 20, -15);
1147    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 10, 0, 4);
1148    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 10, 1, -9);
1149    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 10, 5, -9);
1150    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 10, 9, -9);
1151    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 10, 10, -9);
1152    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 10, 11, -9);
1153    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 19, 0, 4);
1154    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 19, 1, -18);
1155    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 19, 2, -18);
1156    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 20, 0, 4);
1157    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 20, 1, 4);
1158    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 21, 0, 0);
1159    test(S("abcde"), 1, 5, SV(""), 0, 0, 4);
1160    test(S("abcde"), 1, 5, SV(""), 0, 1, 4);
1161    test(S("abcde"), 1, 5, SV(""), 1, 0, 0);
1162    test(S("abcde"), 1, 5, SV("abcde"), 0, 0, 4);
1163    test(S("abcde"), 1, 5, SV("abcde"), 0, 1, 1);
1164    test(S("abcde"), 1, 5, SV("abcde"), 0, 2, 1);
1165    test(S("abcde"), 1, 5, SV("abcde"), 0, 4, 1);
1166    test(S("abcde"), 1, 5, SV("abcde"), 0, 5, 1);
1167    test(S("abcde"), 1, 5, SV("abcde"), 0, 6, 1);
1168    test(S("abcde"), 1, 5, SV("abcde"), 1, 0, 4);
1169    test(S("abcde"), 1, 5, SV("abcde"), 1, 1, 3);
1170    test(S("abcde"), 1, 5, SV("abcde"), 1, 2, 2);
1171    test(S("abcde"), 1, 5, SV("abcde"), 1, 3, 1);
1172    test(S("abcde"), 1, 5, SV("abcde"), 1, 4, 0);
1173    test(S("abcde"), 1, 5, SV("abcde"), 1, 5, 0);
1174    test(S("abcde"), 1, 5, SV("abcde"), 2, 0, 4);
1175    test(S("abcde"), 1, 5, SV("abcde"), 2, 1, -1);
1176    test(S("abcde"), 1, 5, SV("abcde"), 2, 2, -1);
1177    test(S("abcde"), 1, 5, SV("abcde"), 2, 3, -1);
1178    test(S("abcde"), 1, 5, SV("abcde"), 2, 4, -1);
1179    test(S("abcde"), 1, 5, SV("abcde"), 4, 0, 4);
1180    test(S("abcde"), 1, 5, SV("abcde"), 4, 1, -3);
1181    test(S("abcde"), 1, 5, SV("abcde"), 4, 2, -3);
1182    test(S("abcde"), 1, 5, SV("abcde"), 5, 0, 4);
1183    test(S("abcde"), 1, 5, SV("abcde"), 5, 1, 4);
1184    test(S("abcde"), 1, 5, SV("abcde"), 6, 0, 0);
1185    test(S("abcde"), 1, 5, SV("abcdefghij"), 0, 0, 4);
1186    test(S("abcde"), 1, 5, SV("abcdefghij"), 0, 1, 1);
1187    test(S("abcde"), 1, 5, SV("abcdefghij"), 0, 5, 1);
1188    test(S("abcde"), 1, 5, SV("abcdefghij"), 0, 9, 1);
1189    test(S("abcde"), 1, 5, SV("abcdefghij"), 0, 10, 1);
1190    test(S("abcde"), 1, 5, SV("abcdefghij"), 0, 11, 1);
1191    test(S("abcde"), 1, 5, SV("abcdefghij"), 1, 0, 4);
1192    test(S("abcde"), 1, 5, SV("abcdefghij"), 1, 1, 3);
1193    test(S("abcde"), 1, 5, SV("abcdefghij"), 1, 4, 0);
1194    test(S("abcde"), 1, 5, SV("abcdefghij"), 1, 8, -4);
1195    test(S("abcde"), 1, 5, SV("abcdefghij"), 1, 9, -5);
1196    test(S("abcde"), 1, 5, SV("abcdefghij"), 1, 10, -5);
1197    test(S("abcde"), 1, 5, SV("abcdefghij"), 5, 0, 4);
1198    test(S("abcde"), 1, 5, SV("abcdefghij"), 5, 1, -4);
1199    test(S("abcde"), 1, 5, SV("abcdefghij"), 5, 2, -4);
1200    test(S("abcde"), 1, 5, SV("abcdefghij"), 5, 4, -4);
1201    test(S("abcde"), 1, 5, SV("abcdefghij"), 5, 5, -4);
1202    test(S("abcde"), 1, 5, SV("abcdefghij"), 5, 6, -4);
1203    test(S("abcde"), 1, 5, SV("abcdefghij"), 9, 0, 4);
1204    test(S("abcde"), 1, 5, SV("abcdefghij"), 9, 1, -8);
1205    test(S("abcde"), 1, 5, SV("abcdefghij"), 9, 2, -8);
1206    test(S("abcde"), 1, 5, SV("abcdefghij"), 10, 0, 4);
1207    test(S("abcde"), 1, 5, SV("abcdefghij"), 10, 1, 4);
1208    test(S("abcde"), 1, 5, SV("abcdefghij"), 11, 0, 0);
1209    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 0, 0, 4);
1210    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 0, 1, 1);
1211    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 0, 10, 1);
1212    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 0, 19, 1);
1213    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 0, 20, 1);
1214    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 0, 21, 1);
1215    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 1, 0, 4);
1216    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 1, 1, 3);
1217    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 1, 9, -5);
1218    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 1, 18, -14);
1219    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 1, 19, -15);
1220    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 1, 20, -15);
1221    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 10, 0, 4);
1222    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 10, 1, -9);
1223}
1224
1225template <class S, class SV>
1226void test11()
1227{
1228    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 10, 5, -9);
1229    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 10, 9, -9);
1230    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 10, 10, -9);
1231    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 10, 11, -9);
1232    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 19, 0, 4);
1233    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 19, 1, -18);
1234    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 19, 2, -18);
1235    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 20, 0, 4);
1236    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 20, 1, 4);
1237    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 21, 0, 0);
1238    test(S("abcde"), 2, 0, SV(""), 0, 0, 0);
1239    test(S("abcde"), 2, 0, SV(""), 0, 1, 0);
1240    test(S("abcde"), 2, 0, SV(""), 1, 0, 0);
1241    test(S("abcde"), 2, 0, SV("abcde"), 0, 0, 0);
1242    test(S("abcde"), 2, 0, SV("abcde"), 0, 1, -1);
1243    test(S("abcde"), 2, 0, SV("abcde"), 0, 2, -2);
1244    test(S("abcde"), 2, 0, SV("abcde"), 0, 4, -4);
1245    test(S("abcde"), 2, 0, SV("abcde"), 0, 5, -5);
1246    test(S("abcde"), 2, 0, SV("abcde"), 0, 6, -5);
1247    test(S("abcde"), 2, 0, SV("abcde"), 1, 0, 0);
1248    test(S("abcde"), 2, 0, SV("abcde"), 1, 1, -1);
1249    test(S("abcde"), 2, 0, SV("abcde"), 1, 2, -2);
1250    test(S("abcde"), 2, 0, SV("abcde"), 1, 3, -3);
1251    test(S("abcde"), 2, 0, SV("abcde"), 1, 4, -4);
1252    test(S("abcde"), 2, 0, SV("abcde"), 1, 5, -4);
1253    test(S("abcde"), 2, 0, SV("abcde"), 2, 0, 0);
1254    test(S("abcde"), 2, 0, SV("abcde"), 2, 1, -1);
1255    test(S("abcde"), 2, 0, SV("abcde"), 2, 2, -2);
1256    test(S("abcde"), 2, 0, SV("abcde"), 2, 3, -3);
1257    test(S("abcde"), 2, 0, SV("abcde"), 2, 4, -3);
1258    test(S("abcde"), 2, 0, SV("abcde"), 4, 0, 0);
1259    test(S("abcde"), 2, 0, SV("abcde"), 4, 1, -1);
1260    test(S("abcde"), 2, 0, SV("abcde"), 4, 2, -1);
1261    test(S("abcde"), 2, 0, SV("abcde"), 5, 0, 0);
1262    test(S("abcde"), 2, 0, SV("abcde"), 5, 1, 0);
1263    test(S("abcde"), 2, 0, SV("abcde"), 6, 0, 0);
1264    test(S("abcde"), 2, 0, SV("abcdefghij"), 0, 0, 0);
1265    test(S("abcde"), 2, 0, SV("abcdefghij"), 0, 1, -1);
1266    test(S("abcde"), 2, 0, SV("abcdefghij"), 0, 5, -5);
1267    test(S("abcde"), 2, 0, SV("abcdefghij"), 0, 9, -9);
1268    test(S("abcde"), 2, 0, SV("abcdefghij"), 0, 10, -10);
1269    test(S("abcde"), 2, 0, SV("abcdefghij"), 0, 11, -10);
1270    test(S("abcde"), 2, 0, SV("abcdefghij"), 1, 0, 0);
1271    test(S("abcde"), 2, 0, SV("abcdefghij"), 1, 1, -1);
1272    test(S("abcde"), 2, 0, SV("abcdefghij"), 1, 4, -4);
1273    test(S("abcde"), 2, 0, SV("abcdefghij"), 1, 8, -8);
1274    test(S("abcde"), 2, 0, SV("abcdefghij"), 1, 9, -9);
1275    test(S("abcde"), 2, 0, SV("abcdefghij"), 1, 10, -9);
1276    test(S("abcde"), 2, 0, SV("abcdefghij"), 5, 0, 0);
1277    test(S("abcde"), 2, 0, SV("abcdefghij"), 5, 1, -1);
1278    test(S("abcde"), 2, 0, SV("abcdefghij"), 5, 2, -2);
1279    test(S("abcde"), 2, 0, SV("abcdefghij"), 5, 4, -4);
1280    test(S("abcde"), 2, 0, SV("abcdefghij"), 5, 5, -5);
1281    test(S("abcde"), 2, 0, SV("abcdefghij"), 5, 6, -5);
1282    test(S("abcde"), 2, 0, SV("abcdefghij"), 9, 0, 0);
1283    test(S("abcde"), 2, 0, SV("abcdefghij"), 9, 1, -1);
1284    test(S("abcde"), 2, 0, SV("abcdefghij"), 9, 2, -1);
1285    test(S("abcde"), 2, 0, SV("abcdefghij"), 10, 0, 0);
1286    test(S("abcde"), 2, 0, SV("abcdefghij"), 10, 1, 0);
1287    test(S("abcde"), 2, 0, SV("abcdefghij"), 11, 0, 0);
1288    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
1289    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 0, 1, -1);
1290    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 0, 10, -10);
1291    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 0, 19, -19);
1292    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 0, 20, -20);
1293    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 0, 21, -20);
1294    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
1295    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 1, 1, -1);
1296    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 1, 9, -9);
1297    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 1, 18, -18);
1298    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 1, 19, -19);
1299    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 1, 20, -19);
1300    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
1301    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 10, 1, -1);
1302    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 10, 5, -5);
1303    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 10, 9, -9);
1304    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 10, 10, -10);
1305    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 10, 11, -10);
1306    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
1307    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 19, 1, -1);
1308    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 19, 2, -1);
1309    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
1310    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
1311    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
1312    test(S("abcde"), 2, 1, SV(""), 0, 0, 1);
1313    test(S("abcde"), 2, 1, SV(""), 0, 1, 1);
1314    test(S("abcde"), 2, 1, SV(""), 1, 0, 0);
1315    test(S("abcde"), 2, 1, SV("abcde"), 0, 0, 1);
1316    test(S("abcde"), 2, 1, SV("abcde"), 0, 1, 2);
1317    test(S("abcde"), 2, 1, SV("abcde"), 0, 2, 2);
1318    test(S("abcde"), 2, 1, SV("abcde"), 0, 4, 2);
1319    test(S("abcde"), 2, 1, SV("abcde"), 0, 5, 2);
1320    test(S("abcde"), 2, 1, SV("abcde"), 0, 6, 2);
1321    test(S("abcde"), 2, 1, SV("abcde"), 1, 0, 1);
1322    test(S("abcde"), 2, 1, SV("abcde"), 1, 1, 1);
1323    test(S("abcde"), 2, 1, SV("abcde"), 1, 2, 1);
1324    test(S("abcde"), 2, 1, SV("abcde"), 1, 3, 1);
1325    test(S("abcde"), 2, 1, SV("abcde"), 1, 4, 1);
1326    test(S("abcde"), 2, 1, SV("abcde"), 1, 5, 1);
1327    test(S("abcde"), 2, 1, SV("abcde"), 2, 0, 1);
1328}
1329
1330template <class S, class SV>
1331void test12()
1332{
1333    test(S("abcde"), 2, 1, SV("abcde"), 2, 1, 0);
1334    test(S("abcde"), 2, 1, SV("abcde"), 2, 2, -1);
1335    test(S("abcde"), 2, 1, SV("abcde"), 2, 3, -2);
1336    test(S("abcde"), 2, 1, SV("abcde"), 2, 4, -2);
1337    test(S("abcde"), 2, 1, SV("abcde"), 4, 0, 1);
1338    test(S("abcde"), 2, 1, SV("abcde"), 4, 1, -2);
1339    test(S("abcde"), 2, 1, SV("abcde"), 4, 2, -2);
1340    test(S("abcde"), 2, 1, SV("abcde"), 5, 0, 1);
1341    test(S("abcde"), 2, 1, SV("abcde"), 5, 1, 1);
1342    test(S("abcde"), 2, 1, SV("abcde"), 6, 0, 0);
1343    test(S("abcde"), 2, 1, SV("abcdefghij"), 0, 0, 1);
1344    test(S("abcde"), 2, 1, SV("abcdefghij"), 0, 1, 2);
1345    test(S("abcde"), 2, 1, SV("abcdefghij"), 0, 5, 2);
1346    test(S("abcde"), 2, 1, SV("abcdefghij"), 0, 9, 2);
1347    test(S("abcde"), 2, 1, SV("abcdefghij"), 0, 10, 2);
1348    test(S("abcde"), 2, 1, SV("abcdefghij"), 0, 11, 2);
1349    test(S("abcde"), 2, 1, SV("abcdefghij"), 1, 0, 1);
1350    test(S("abcde"), 2, 1, SV("abcdefghij"), 1, 1, 1);
1351    test(S("abcde"), 2, 1, SV("abcdefghij"), 1, 4, 1);
1352    test(S("abcde"), 2, 1, SV("abcdefghij"), 1, 8, 1);
1353    test(S("abcde"), 2, 1, SV("abcdefghij"), 1, 9, 1);
1354    test(S("abcde"), 2, 1, SV("abcdefghij"), 1, 10, 1);
1355    test(S("abcde"), 2, 1, SV("abcdefghij"), 5, 0, 1);
1356    test(S("abcde"), 2, 1, SV("abcdefghij"), 5, 1, -3);
1357    test(S("abcde"), 2, 1, SV("abcdefghij"), 5, 2, -3);
1358    test(S("abcde"), 2, 1, SV("abcdefghij"), 5, 4, -3);
1359    test(S("abcde"), 2, 1, SV("abcdefghij"), 5, 5, -3);
1360    test(S("abcde"), 2, 1, SV("abcdefghij"), 5, 6, -3);
1361    test(S("abcde"), 2, 1, SV("abcdefghij"), 9, 0, 1);
1362    test(S("abcde"), 2, 1, SV("abcdefghij"), 9, 1, -7);
1363    test(S("abcde"), 2, 1, SV("abcdefghij"), 9, 2, -7);
1364    test(S("abcde"), 2, 1, SV("abcdefghij"), 10, 0, 1);
1365    test(S("abcde"), 2, 1, SV("abcdefghij"), 10, 1, 1);
1366    test(S("abcde"), 2, 1, SV("abcdefghij"), 11, 0, 0);
1367    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 0, 0, 1);
1368    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 0, 1, 2);
1369    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 0, 10, 2);
1370    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 0, 19, 2);
1371    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 0, 20, 2);
1372    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 0, 21, 2);
1373    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 1, 0, 1);
1374    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 1, 1, 1);
1375    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 1, 9, 1);
1376    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 1, 18, 1);
1377    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 1, 19, 1);
1378    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 1, 20, 1);
1379    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 10, 0, 1);
1380    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 10, 1, -8);
1381    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 10, 5, -8);
1382    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 10, 9, -8);
1383    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 10, 10, -8);
1384    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 10, 11, -8);
1385    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 19, 0, 1);
1386    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 19, 1, -17);
1387    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 19, 2, -17);
1388    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 20, 0, 1);
1389    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 20, 1, 1);
1390    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 21, 0, 0);
1391    test(S("abcde"), 2, 2, SV(""), 0, 0, 2);
1392    test(S("abcde"), 2, 2, SV(""), 0, 1, 2);
1393    test(S("abcde"), 2, 2, SV(""), 1, 0, 0);
1394    test(S("abcde"), 2, 2, SV("abcde"), 0, 0, 2);
1395    test(S("abcde"), 2, 2, SV("abcde"), 0, 1, 2);
1396    test(S("abcde"), 2, 2, SV("abcde"), 0, 2, 2);
1397    test(S("abcde"), 2, 2, SV("abcde"), 0, 4, 2);
1398    test(S("abcde"), 2, 2, SV("abcde"), 0, 5, 2);
1399    test(S("abcde"), 2, 2, SV("abcde"), 0, 6, 2);
1400    test(S("abcde"), 2, 2, SV("abcde"), 1, 0, 2);
1401    test(S("abcde"), 2, 2, SV("abcde"), 1, 1, 1);
1402    test(S("abcde"), 2, 2, SV("abcde"), 1, 2, 1);
1403    test(S("abcde"), 2, 2, SV("abcde"), 1, 3, 1);
1404    test(S("abcde"), 2, 2, SV("abcde"), 1, 4, 1);
1405    test(S("abcde"), 2, 2, SV("abcde"), 1, 5, 1);
1406    test(S("abcde"), 2, 2, SV("abcde"), 2, 0, 2);
1407    test(S("abcde"), 2, 2, SV("abcde"), 2, 1, 1);
1408    test(S("abcde"), 2, 2, SV("abcde"), 2, 2, 0);
1409    test(S("abcde"), 2, 2, SV("abcde"), 2, 3, -1);
1410    test(S("abcde"), 2, 2, SV("abcde"), 2, 4, -1);
1411    test(S("abcde"), 2, 2, SV("abcde"), 4, 0, 2);
1412    test(S("abcde"), 2, 2, SV("abcde"), 4, 1, -2);
1413    test(S("abcde"), 2, 2, SV("abcde"), 4, 2, -2);
1414    test(S("abcde"), 2, 2, SV("abcde"), 5, 0, 2);
1415    test(S("abcde"), 2, 2, SV("abcde"), 5, 1, 2);
1416    test(S("abcde"), 2, 2, SV("abcde"), 6, 0, 0);
1417    test(S("abcde"), 2, 2, SV("abcdefghij"), 0, 0, 2);
1418    test(S("abcde"), 2, 2, SV("abcdefghij"), 0, 1, 2);
1419    test(S("abcde"), 2, 2, SV("abcdefghij"), 0, 5, 2);
1420    test(S("abcde"), 2, 2, SV("abcdefghij"), 0, 9, 2);
1421    test(S("abcde"), 2, 2, SV("abcdefghij"), 0, 10, 2);
1422    test(S("abcde"), 2, 2, SV("abcdefghij"), 0, 11, 2);
1423    test(S("abcde"), 2, 2, SV("abcdefghij"), 1, 0, 2);
1424    test(S("abcde"), 2, 2, SV("abcdefghij"), 1, 1, 1);
1425    test(S("abcde"), 2, 2, SV("abcdefghij"), 1, 4, 1);
1426    test(S("abcde"), 2, 2, SV("abcdefghij"), 1, 8, 1);
1427    test(S("abcde"), 2, 2, SV("abcdefghij"), 1, 9, 1);
1428    test(S("abcde"), 2, 2, SV("abcdefghij"), 1, 10, 1);
1429    test(S("abcde"), 2, 2, SV("abcdefghij"), 5, 0, 2);
1430    test(S("abcde"), 2, 2, SV("abcdefghij"), 5, 1, -3);
1431    test(S("abcde"), 2, 2, SV("abcdefghij"), 5, 2, -3);
1432    test(S("abcde"), 2, 2, SV("abcdefghij"), 5, 4, -3);
1433}
1434
1435template <class S, class SV>
1436void test13()
1437{
1438    test(S("abcde"), 2, 2, SV("abcdefghij"), 5, 5, -3);
1439    test(S("abcde"), 2, 2, SV("abcdefghij"), 5, 6, -3);
1440    test(S("abcde"), 2, 2, SV("abcdefghij"), 9, 0, 2);
1441    test(S("abcde"), 2, 2, SV("abcdefghij"), 9, 1, -7);
1442    test(S("abcde"), 2, 2, SV("abcdefghij"), 9, 2, -7);
1443    test(S("abcde"), 2, 2, SV("abcdefghij"), 10, 0, 2);
1444    test(S("abcde"), 2, 2, SV("abcdefghij"), 10, 1, 2);
1445    test(S("abcde"), 2, 2, SV("abcdefghij"), 11, 0, 0);
1446    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 0, 0, 2);
1447    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 0, 1, 2);
1448    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 0, 10, 2);
1449    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 0, 19, 2);
1450    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 0, 20, 2);
1451    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 0, 21, 2);
1452    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 1, 0, 2);
1453    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 1, 1, 1);
1454    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 1, 9, 1);
1455    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 1, 18, 1);
1456    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 1, 19, 1);
1457    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 1, 20, 1);
1458    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 10, 0, 2);
1459    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 10, 1, -8);
1460    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 10, 5, -8);
1461    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 10, 9, -8);
1462    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 10, 10, -8);
1463    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 10, 11, -8);
1464    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 19, 0, 2);
1465    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 19, 1, -17);
1466    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 19, 2, -17);
1467    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 20, 0, 2);
1468    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 20, 1, 2);
1469    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 21, 0, 0);
1470    test(S("abcde"), 2, 3, SV(""), 0, 0, 3);
1471    test(S("abcde"), 2, 3, SV(""), 0, 1, 3);
1472    test(S("abcde"), 2, 3, SV(""), 1, 0, 0);
1473    test(S("abcde"), 2, 3, SV("abcde"), 0, 0, 3);
1474    test(S("abcde"), 2, 3, SV("abcde"), 0, 1, 2);
1475    test(S("abcde"), 2, 3, SV("abcde"), 0, 2, 2);
1476    test(S("abcde"), 2, 3, SV("abcde"), 0, 4, 2);
1477    test(S("abcde"), 2, 3, SV("abcde"), 0, 5, 2);
1478    test(S("abcde"), 2, 3, SV("abcde"), 0, 6, 2);
1479    test(S("abcde"), 2, 3, SV("abcde"), 1, 0, 3);
1480    test(S("abcde"), 2, 3, SV("abcde"), 1, 1, 1);
1481    test(S("abcde"), 2, 3, SV("abcde"), 1, 2, 1);
1482    test(S("abcde"), 2, 3, SV("abcde"), 1, 3, 1);
1483    test(S("abcde"), 2, 3, SV("abcde"), 1, 4, 1);
1484    test(S("abcde"), 2, 3, SV("abcde"), 1, 5, 1);
1485    test(S("abcde"), 2, 3, SV("abcde"), 2, 0, 3);
1486    test(S("abcde"), 2, 3, SV("abcde"), 2, 1, 2);
1487    test(S("abcde"), 2, 3, SV("abcde"), 2, 2, 1);
1488    test(S("abcde"), 2, 3, SV("abcde"), 2, 3, 0);
1489    test(S("abcde"), 2, 3, SV("abcde"), 2, 4, 0);
1490    test(S("abcde"), 2, 3, SV("abcde"), 4, 0, 3);
1491    test(S("abcde"), 2, 3, SV("abcde"), 4, 1, -2);
1492    test(S("abcde"), 2, 3, SV("abcde"), 4, 2, -2);
1493    test(S("abcde"), 2, 3, SV("abcde"), 5, 0, 3);
1494    test(S("abcde"), 2, 3, SV("abcde"), 5, 1, 3);
1495    test(S("abcde"), 2, 3, SV("abcde"), 6, 0, 0);
1496    test(S("abcde"), 2, 3, SV("abcdefghij"), 0, 0, 3);
1497    test(S("abcde"), 2, 3, SV("abcdefghij"), 0, 1, 2);
1498    test(S("abcde"), 2, 3, SV("abcdefghij"), 0, 5, 2);
1499    test(S("abcde"), 2, 3, SV("abcdefghij"), 0, 9, 2);
1500    test(S("abcde"), 2, 3, SV("abcdefghij"), 0, 10, 2);
1501    test(S("abcde"), 2, 3, SV("abcdefghij"), 0, 11, 2);
1502    test(S("abcde"), 2, 3, SV("abcdefghij"), 1, 0, 3);
1503    test(S("abcde"), 2, 3, SV("abcdefghij"), 1, 1, 1);
1504    test(S("abcde"), 2, 3, SV("abcdefghij"), 1, 4, 1);
1505    test(S("abcde"), 2, 3, SV("abcdefghij"), 1, 8, 1);
1506    test(S("abcde"), 2, 3, SV("abcdefghij"), 1, 9, 1);
1507    test(S("abcde"), 2, 3, SV("abcdefghij"), 1, 10, 1);
1508    test(S("abcde"), 2, 3, SV("abcdefghij"), 5, 0, 3);
1509    test(S("abcde"), 2, 3, SV("abcdefghij"), 5, 1, -3);
1510    test(S("abcde"), 2, 3, SV("abcdefghij"), 5, 2, -3);
1511    test(S("abcde"), 2, 3, SV("abcdefghij"), 5, 4, -3);
1512    test(S("abcde"), 2, 3, SV("abcdefghij"), 5, 5, -3);
1513    test(S("abcde"), 2, 3, SV("abcdefghij"), 5, 6, -3);
1514    test(S("abcde"), 2, 3, SV("abcdefghij"), 9, 0, 3);
1515    test(S("abcde"), 2, 3, SV("abcdefghij"), 9, 1, -7);
1516    test(S("abcde"), 2, 3, SV("abcdefghij"), 9, 2, -7);
1517    test(S("abcde"), 2, 3, SV("abcdefghij"), 10, 0, 3);
1518    test(S("abcde"), 2, 3, SV("abcdefghij"), 10, 1, 3);
1519    test(S("abcde"), 2, 3, SV("abcdefghij"), 11, 0, 0);
1520    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 0, 0, 3);
1521    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 0, 1, 2);
1522    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 0, 10, 2);
1523    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 0, 19, 2);
1524    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 0, 20, 2);
1525    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 0, 21, 2);
1526    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 1, 0, 3);
1527    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 1, 1, 1);
1528    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 1, 9, 1);
1529    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 1, 18, 1);
1530    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 1, 19, 1);
1531    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 1, 20, 1);
1532    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 10, 0, 3);
1533    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 10, 1, -8);
1534    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 10, 5, -8);
1535    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 10, 9, -8);
1536    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 10, 10, -8);
1537    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 10, 11, -8);
1538}
1539
1540template <class S, class SV>
1541void test14()
1542{
1543    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 19, 0, 3);
1544    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 19, 1, -17);
1545    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 19, 2, -17);
1546    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 20, 0, 3);
1547    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 20, 1, 3);
1548    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 21, 0, 0);
1549    test(S("abcde"), 2, 4, SV(""), 0, 0, 3);
1550    test(S("abcde"), 2, 4, SV(""), 0, 1, 3);
1551    test(S("abcde"), 2, 4, SV(""), 1, 0, 0);
1552    test(S("abcde"), 2, 4, SV("abcde"), 0, 0, 3);
1553    test(S("abcde"), 2, 4, SV("abcde"), 0, 1, 2);
1554    test(S("abcde"), 2, 4, SV("abcde"), 0, 2, 2);
1555    test(S("abcde"), 2, 4, SV("abcde"), 0, 4, 2);
1556    test(S("abcde"), 2, 4, SV("abcde"), 0, 5, 2);
1557    test(S("abcde"), 2, 4, SV("abcde"), 0, 6, 2);
1558    test(S("abcde"), 2, 4, SV("abcde"), 1, 0, 3);
1559    test(S("abcde"), 2, 4, SV("abcde"), 1, 1, 1);
1560    test(S("abcde"), 2, 4, SV("abcde"), 1, 2, 1);
1561    test(S("abcde"), 2, 4, SV("abcde"), 1, 3, 1);
1562    test(S("abcde"), 2, 4, SV("abcde"), 1, 4, 1);
1563    test(S("abcde"), 2, 4, SV("abcde"), 1, 5, 1);
1564    test(S("abcde"), 2, 4, SV("abcde"), 2, 0, 3);
1565    test(S("abcde"), 2, 4, SV("abcde"), 2, 1, 2);
1566    test(S("abcde"), 2, 4, SV("abcde"), 2, 2, 1);
1567    test(S("abcde"), 2, 4, SV("abcde"), 2, 3, 0);
1568    test(S("abcde"), 2, 4, SV("abcde"), 2, 4, 0);
1569    test(S("abcde"), 2, 4, SV("abcde"), 4, 0, 3);
1570    test(S("abcde"), 2, 4, SV("abcde"), 4, 1, -2);
1571    test(S("abcde"), 2, 4, SV("abcde"), 4, 2, -2);
1572    test(S("abcde"), 2, 4, SV("abcde"), 5, 0, 3);
1573    test(S("abcde"), 2, 4, SV("abcde"), 5, 1, 3);
1574    test(S("abcde"), 2, 4, SV("abcde"), 6, 0, 0);
1575    test(S("abcde"), 2, 4, SV("abcdefghij"), 0, 0, 3);
1576    test(S("abcde"), 2, 4, SV("abcdefghij"), 0, 1, 2);
1577    test(S("abcde"), 2, 4, SV("abcdefghij"), 0, 5, 2);
1578    test(S("abcde"), 2, 4, SV("abcdefghij"), 0, 9, 2);
1579    test(S("abcde"), 2, 4, SV("abcdefghij"), 0, 10, 2);
1580    test(S("abcde"), 2, 4, SV("abcdefghij"), 0, 11, 2);
1581    test(S("abcde"), 2, 4, SV("abcdefghij"), 1, 0, 3);
1582    test(S("abcde"), 2, 4, SV("abcdefghij"), 1, 1, 1);
1583    test(S("abcde"), 2, 4, SV("abcdefghij"), 1, 4, 1);
1584    test(S("abcde"), 2, 4, SV("abcdefghij"), 1, 8, 1);
1585    test(S("abcde"), 2, 4, SV("abcdefghij"), 1, 9, 1);
1586    test(S("abcde"), 2, 4, SV("abcdefghij"), 1, 10, 1);
1587    test(S("abcde"), 2, 4, SV("abcdefghij"), 5, 0, 3);
1588    test(S("abcde"), 2, 4, SV("abcdefghij"), 5, 1, -3);
1589    test(S("abcde"), 2, 4, SV("abcdefghij"), 5, 2, -3);
1590    test(S("abcde"), 2, 4, SV("abcdefghij"), 5, 4, -3);
1591    test(S("abcde"), 2, 4, SV("abcdefghij"), 5, 5, -3);
1592    test(S("abcde"), 2, 4, SV("abcdefghij"), 5, 6, -3);
1593    test(S("abcde"), 2, 4, SV("abcdefghij"), 9, 0, 3);
1594    test(S("abcde"), 2, 4, SV("abcdefghij"), 9, 1, -7);
1595    test(S("abcde"), 2, 4, SV("abcdefghij"), 9, 2, -7);
1596    test(S("abcde"), 2, 4, SV("abcdefghij"), 10, 0, 3);
1597    test(S("abcde"), 2, 4, SV("abcdefghij"), 10, 1, 3);
1598    test(S("abcde"), 2, 4, SV("abcdefghij"), 11, 0, 0);
1599    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 0, 0, 3);
1600    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 0, 1, 2);
1601    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 0, 10, 2);
1602    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 0, 19, 2);
1603    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 0, 20, 2);
1604    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 0, 21, 2);
1605    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 1, 0, 3);
1606    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 1, 1, 1);
1607    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 1, 9, 1);
1608    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 1, 18, 1);
1609    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 1, 19, 1);
1610    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 1, 20, 1);
1611    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 10, 0, 3);
1612    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 10, 1, -8);
1613    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 10, 5, -8);
1614    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 10, 9, -8);
1615    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 10, 10, -8);
1616    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 10, 11, -8);
1617    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 19, 0, 3);
1618    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 19, 1, -17);
1619    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 19, 2, -17);
1620    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 20, 0, 3);
1621    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 20, 1, 3);
1622    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 21, 0, 0);
1623    test(S("abcde"), 4, 0, SV(""), 0, 0, 0);
1624    test(S("abcde"), 4, 0, SV(""), 0, 1, 0);
1625    test(S("abcde"), 4, 0, SV(""), 1, 0, 0);
1626    test(S("abcde"), 4, 0, SV("abcde"), 0, 0, 0);
1627    test(S("abcde"), 4, 0, SV("abcde"), 0, 1, -1);
1628    test(S("abcde"), 4, 0, SV("abcde"), 0, 2, -2);
1629    test(S("abcde"), 4, 0, SV("abcde"), 0, 4, -4);
1630    test(S("abcde"), 4, 0, SV("abcde"), 0, 5, -5);
1631    test(S("abcde"), 4, 0, SV("abcde"), 0, 6, -5);
1632    test(S("abcde"), 4, 0, SV("abcde"), 1, 0, 0);
1633    test(S("abcde"), 4, 0, SV("abcde"), 1, 1, -1);
1634    test(S("abcde"), 4, 0, SV("abcde"), 1, 2, -2);
1635    test(S("abcde"), 4, 0, SV("abcde"), 1, 3, -3);
1636    test(S("abcde"), 4, 0, SV("abcde"), 1, 4, -4);
1637    test(S("abcde"), 4, 0, SV("abcde"), 1, 5, -4);
1638    test(S("abcde"), 4, 0, SV("abcde"), 2, 0, 0);
1639    test(S("abcde"), 4, 0, SV("abcde"), 2, 1, -1);
1640    test(S("abcde"), 4, 0, SV("abcde"), 2, 2, -2);
1641    test(S("abcde"), 4, 0, SV("abcde"), 2, 3, -3);
1642    test(S("abcde"), 4, 0, SV("abcde"), 2, 4, -3);
1643}
1644
1645template <class S, class SV>
1646void test15()
1647{
1648    test(S("abcde"), 4, 0, SV("abcde"), 4, 0, 0);
1649    test(S("abcde"), 4, 0, SV("abcde"), 4, 1, -1);
1650    test(S("abcde"), 4, 0, SV("abcde"), 4, 2, -1);
1651    test(S("abcde"), 4, 0, SV("abcde"), 5, 0, 0);
1652    test(S("abcde"), 4, 0, SV("abcde"), 5, 1, 0);
1653    test(S("abcde"), 4, 0, SV("abcde"), 6, 0, 0);
1654    test(S("abcde"), 4, 0, SV("abcdefghij"), 0, 0, 0);
1655    test(S("abcde"), 4, 0, SV("abcdefghij"), 0, 1, -1);
1656    test(S("abcde"), 4, 0, SV("abcdefghij"), 0, 5, -5);
1657    test(S("abcde"), 4, 0, SV("abcdefghij"), 0, 9, -9);
1658    test(S("abcde"), 4, 0, SV("abcdefghij"), 0, 10, -10);
1659    test(S("abcde"), 4, 0, SV("abcdefghij"), 0, 11, -10);
1660    test(S("abcde"), 4, 0, SV("abcdefghij"), 1, 0, 0);
1661    test(S("abcde"), 4, 0, SV("abcdefghij"), 1, 1, -1);
1662    test(S("abcde"), 4, 0, SV("abcdefghij"), 1, 4, -4);
1663    test(S("abcde"), 4, 0, SV("abcdefghij"), 1, 8, -8);
1664    test(S("abcde"), 4, 0, SV("abcdefghij"), 1, 9, -9);
1665    test(S("abcde"), 4, 0, SV("abcdefghij"), 1, 10, -9);
1666    test(S("abcde"), 4, 0, SV("abcdefghij"), 5, 0, 0);
1667    test(S("abcde"), 4, 0, SV("abcdefghij"), 5, 1, -1);
1668    test(S("abcde"), 4, 0, SV("abcdefghij"), 5, 2, -2);
1669    test(S("abcde"), 4, 0, SV("abcdefghij"), 5, 4, -4);
1670    test(S("abcde"), 4, 0, SV("abcdefghij"), 5, 5, -5);
1671    test(S("abcde"), 4, 0, SV("abcdefghij"), 5, 6, -5);
1672    test(S("abcde"), 4, 0, SV("abcdefghij"), 9, 0, 0);
1673    test(S("abcde"), 4, 0, SV("abcdefghij"), 9, 1, -1);
1674    test(S("abcde"), 4, 0, SV("abcdefghij"), 9, 2, -1);
1675    test(S("abcde"), 4, 0, SV("abcdefghij"), 10, 0, 0);
1676    test(S("abcde"), 4, 0, SV("abcdefghij"), 10, 1, 0);
1677    test(S("abcde"), 4, 0, SV("abcdefghij"), 11, 0, 0);
1678    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
1679    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 0, 1, -1);
1680    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 0, 10, -10);
1681    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 0, 19, -19);
1682    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 0, 20, -20);
1683    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 0, 21, -20);
1684    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
1685    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 1, 1, -1);
1686    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 1, 9, -9);
1687    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 1, 18, -18);
1688    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 1, 19, -19);
1689    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 1, 20, -19);
1690    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
1691    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 10, 1, -1);
1692    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 10, 5, -5);
1693    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 10, 9, -9);
1694    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 10, 10, -10);
1695    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 10, 11, -10);
1696    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
1697    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 19, 1, -1);
1698    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 19, 2, -1);
1699    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
1700    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
1701    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
1702    test(S("abcde"), 4, 1, SV(""), 0, 0, 1);
1703    test(S("abcde"), 4, 1, SV(""), 0, 1, 1);
1704    test(S("abcde"), 4, 1, SV(""), 1, 0, 0);
1705    test(S("abcde"), 4, 1, SV("abcde"), 0, 0, 1);
1706    test(S("abcde"), 4, 1, SV("abcde"), 0, 1, 4);
1707    test(S("abcde"), 4, 1, SV("abcde"), 0, 2, 4);
1708    test(S("abcde"), 4, 1, SV("abcde"), 0, 4, 4);
1709    test(S("abcde"), 4, 1, SV("abcde"), 0, 5, 4);
1710    test(S("abcde"), 4, 1, SV("abcde"), 0, 6, 4);
1711    test(S("abcde"), 4, 1, SV("abcde"), 1, 0, 1);
1712    test(S("abcde"), 4, 1, SV("abcde"), 1, 1, 3);
1713    test(S("abcde"), 4, 1, SV("abcde"), 1, 2, 3);
1714    test(S("abcde"), 4, 1, SV("abcde"), 1, 3, 3);
1715    test(S("abcde"), 4, 1, SV("abcde"), 1, 4, 3);
1716    test(S("abcde"), 4, 1, SV("abcde"), 1, 5, 3);
1717    test(S("abcde"), 4, 1, SV("abcde"), 2, 0, 1);
1718    test(S("abcde"), 4, 1, SV("abcde"), 2, 1, 2);
1719    test(S("abcde"), 4, 1, SV("abcde"), 2, 2, 2);
1720    test(S("abcde"), 4, 1, SV("abcde"), 2, 3, 2);
1721    test(S("abcde"), 4, 1, SV("abcde"), 2, 4, 2);
1722    test(S("abcde"), 4, 1, SV("abcde"), 4, 0, 1);
1723    test(S("abcde"), 4, 1, SV("abcde"), 4, 1, 0);
1724    test(S("abcde"), 4, 1, SV("abcde"), 4, 2, 0);
1725    test(S("abcde"), 4, 1, SV("abcde"), 5, 0, 1);
1726    test(S("abcde"), 4, 1, SV("abcde"), 5, 1, 1);
1727    test(S("abcde"), 4, 1, SV("abcde"), 6, 0, 0);
1728    test(S("abcde"), 4, 1, SV("abcdefghij"), 0, 0, 1);
1729    test(S("abcde"), 4, 1, SV("abcdefghij"), 0, 1, 4);
1730    test(S("abcde"), 4, 1, SV("abcdefghij"), 0, 5, 4);
1731    test(S("abcde"), 4, 1, SV("abcdefghij"), 0, 9, 4);
1732    test(S("abcde"), 4, 1, SV("abcdefghij"), 0, 10, 4);
1733    test(S("abcde"), 4, 1, SV("abcdefghij"), 0, 11, 4);
1734    test(S("abcde"), 4, 1, SV("abcdefghij"), 1, 0, 1);
1735    test(S("abcde"), 4, 1, SV("abcdefghij"), 1, 1, 3);
1736    test(S("abcde"), 4, 1, SV("abcdefghij"), 1, 4, 3);
1737    test(S("abcde"), 4, 1, SV("abcdefghij"), 1, 8, 3);
1738    test(S("abcde"), 4, 1, SV("abcdefghij"), 1, 9, 3);
1739    test(S("abcde"), 4, 1, SV("abcdefghij"), 1, 10, 3);
1740    test(S("abcde"), 4, 1, SV("abcdefghij"), 5, 0, 1);
1741    test(S("abcde"), 4, 1, SV("abcdefghij"), 5, 1, -1);
1742    test(S("abcde"), 4, 1, SV("abcdefghij"), 5, 2, -1);
1743    test(S("abcde"), 4, 1, SV("abcdefghij"), 5, 4, -1);
1744    test(S("abcde"), 4, 1, SV("abcdefghij"), 5, 5, -1);
1745    test(S("abcde"), 4, 1, SV("abcdefghij"), 5, 6, -1);
1746    test(S("abcde"), 4, 1, SV("abcdefghij"), 9, 0, 1);
1747    test(S("abcde"), 4, 1, SV("abcdefghij"), 9, 1, -5);
1748}
1749
1750template <class S, class SV>
1751void test16()
1752{
1753    test(S("abcde"), 4, 1, SV("abcdefghij"), 9, 2, -5);
1754    test(S("abcde"), 4, 1, SV("abcdefghij"), 10, 0, 1);
1755    test(S("abcde"), 4, 1, SV("abcdefghij"), 10, 1, 1);
1756    test(S("abcde"), 4, 1, SV("abcdefghij"), 11, 0, 0);
1757    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 0, 0, 1);
1758    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 0, 1, 4);
1759    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 0, 10, 4);
1760    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 0, 19, 4);
1761    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 0, 20, 4);
1762    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 0, 21, 4);
1763    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 1, 0, 1);
1764    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 1, 1, 3);
1765    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 1, 9, 3);
1766    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 1, 18, 3);
1767    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 1, 19, 3);
1768    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 1, 20, 3);
1769    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 10, 0, 1);
1770    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 10, 1, -6);
1771    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 10, 5, -6);
1772    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 10, 9, -6);
1773    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 10, 10, -6);
1774    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 10, 11, -6);
1775    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 19, 0, 1);
1776    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 19, 1, -15);
1777    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 19, 2, -15);
1778    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 20, 0, 1);
1779    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 20, 1, 1);
1780    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 21, 0, 0);
1781    test(S("abcde"), 4, 2, SV(""), 0, 0, 1);
1782    test(S("abcde"), 4, 2, SV(""), 0, 1, 1);
1783    test(S("abcde"), 4, 2, SV(""), 1, 0, 0);
1784    test(S("abcde"), 4, 2, SV("abcde"), 0, 0, 1);
1785    test(S("abcde"), 4, 2, SV("abcde"), 0, 1, 4);
1786    test(S("abcde"), 4, 2, SV("abcde"), 0, 2, 4);
1787    test(S("abcde"), 4, 2, SV("abcde"), 0, 4, 4);
1788    test(S("abcde"), 4, 2, SV("abcde"), 0, 5, 4);
1789    test(S("abcde"), 4, 2, SV("abcde"), 0, 6, 4);
1790    test(S("abcde"), 4, 2, SV("abcde"), 1, 0, 1);
1791    test(S("abcde"), 4, 2, SV("abcde"), 1, 1, 3);
1792    test(S("abcde"), 4, 2, SV("abcde"), 1, 2, 3);
1793    test(S("abcde"), 4, 2, SV("abcde"), 1, 3, 3);
1794    test(S("abcde"), 4, 2, SV("abcde"), 1, 4, 3);
1795    test(S("abcde"), 4, 2, SV("abcde"), 1, 5, 3);
1796    test(S("abcde"), 4, 2, SV("abcde"), 2, 0, 1);
1797    test(S("abcde"), 4, 2, SV("abcde"), 2, 1, 2);
1798    test(S("abcde"), 4, 2, SV("abcde"), 2, 2, 2);
1799    test(S("abcde"), 4, 2, SV("abcde"), 2, 3, 2);
1800    test(S("abcde"), 4, 2, SV("abcde"), 2, 4, 2);
1801    test(S("abcde"), 4, 2, SV("abcde"), 4, 0, 1);
1802    test(S("abcde"), 4, 2, SV("abcde"), 4, 1, 0);
1803    test(S("abcde"), 4, 2, SV("abcde"), 4, 2, 0);
1804    test(S("abcde"), 4, 2, SV("abcde"), 5, 0, 1);
1805    test(S("abcde"), 4, 2, SV("abcde"), 5, 1, 1);
1806    test(S("abcde"), 4, 2, SV("abcde"), 6, 0, 0);
1807    test(S("abcde"), 4, 2, SV("abcdefghij"), 0, 0, 1);
1808    test(S("abcde"), 4, 2, SV("abcdefghij"), 0, 1, 4);
1809    test(S("abcde"), 4, 2, SV("abcdefghij"), 0, 5, 4);
1810    test(S("abcde"), 4, 2, SV("abcdefghij"), 0, 9, 4);
1811    test(S("abcde"), 4, 2, SV("abcdefghij"), 0, 10, 4);
1812    test(S("abcde"), 4, 2, SV("abcdefghij"), 0, 11, 4);
1813    test(S("abcde"), 4, 2, SV("abcdefghij"), 1, 0, 1);
1814    test(S("abcde"), 4, 2, SV("abcdefghij"), 1, 1, 3);
1815    test(S("abcde"), 4, 2, SV("abcdefghij"), 1, 4, 3);
1816    test(S("abcde"), 4, 2, SV("abcdefghij"), 1, 8, 3);
1817    test(S("abcde"), 4, 2, SV("abcdefghij"), 1, 9, 3);
1818    test(S("abcde"), 4, 2, SV("abcdefghij"), 1, 10, 3);
1819    test(S("abcde"), 4, 2, SV("abcdefghij"), 5, 0, 1);
1820    test(S("abcde"), 4, 2, SV("abcdefghij"), 5, 1, -1);
1821    test(S("abcde"), 4, 2, SV("abcdefghij"), 5, 2, -1);
1822    test(S("abcde"), 4, 2, SV("abcdefghij"), 5, 4, -1);
1823    test(S("abcde"), 4, 2, SV("abcdefghij"), 5, 5, -1);
1824    test(S("abcde"), 4, 2, SV("abcdefghij"), 5, 6, -1);
1825    test(S("abcde"), 4, 2, SV("abcdefghij"), 9, 0, 1);
1826    test(S("abcde"), 4, 2, SV("abcdefghij"), 9, 1, -5);
1827    test(S("abcde"), 4, 2, SV("abcdefghij"), 9, 2, -5);
1828    test(S("abcde"), 4, 2, SV("abcdefghij"), 10, 0, 1);
1829    test(S("abcde"), 4, 2, SV("abcdefghij"), 10, 1, 1);
1830    test(S("abcde"), 4, 2, SV("abcdefghij"), 11, 0, 0);
1831    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 0, 0, 1);
1832    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 0, 1, 4);
1833    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 0, 10, 4);
1834    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 0, 19, 4);
1835    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 0, 20, 4);
1836    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 0, 21, 4);
1837    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 1, 0, 1);
1838    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 1, 1, 3);
1839    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 1, 9, 3);
1840    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 1, 18, 3);
1841    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 1, 19, 3);
1842    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 1, 20, 3);
1843    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 10, 0, 1);
1844    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 10, 1, -6);
1845    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 10, 5, -6);
1846    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 10, 9, -6);
1847    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 10, 10, -6);
1848    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 10, 11, -6);
1849    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 19, 0, 1);
1850    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 19, 1, -15);
1851    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 19, 2, -15);
1852    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 20, 0, 1);
1853}
1854
1855template <class S, class SV>
1856void test17()
1857{
1858    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 20, 1, 1);
1859    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 21, 0, 0);
1860    test(S("abcde"), 5, 0, SV(""), 0, 0, 0);
1861    test(S("abcde"), 5, 0, SV(""), 0, 1, 0);
1862    test(S("abcde"), 5, 0, SV(""), 1, 0, 0);
1863    test(S("abcde"), 5, 0, SV("abcde"), 0, 0, 0);
1864    test(S("abcde"), 5, 0, SV("abcde"), 0, 1, -1);
1865    test(S("abcde"), 5, 0, SV("abcde"), 0, 2, -2);
1866    test(S("abcde"), 5, 0, SV("abcde"), 0, 4, -4);
1867    test(S("abcde"), 5, 0, SV("abcde"), 0, 5, -5);
1868    test(S("abcde"), 5, 0, SV("abcde"), 0, 6, -5);
1869    test(S("abcde"), 5, 0, SV("abcde"), 1, 0, 0);
1870    test(S("abcde"), 5, 0, SV("abcde"), 1, 1, -1);
1871    test(S("abcde"), 5, 0, SV("abcde"), 1, 2, -2);
1872    test(S("abcde"), 5, 0, SV("abcde"), 1, 3, -3);
1873    test(S("abcde"), 5, 0, SV("abcde"), 1, 4, -4);
1874    test(S("abcde"), 5, 0, SV("abcde"), 1, 5, -4);
1875    test(S("abcde"), 5, 0, SV("abcde"), 2, 0, 0);
1876    test(S("abcde"), 5, 0, SV("abcde"), 2, 1, -1);
1877    test(S("abcde"), 5, 0, SV("abcde"), 2, 2, -2);
1878    test(S("abcde"), 5, 0, SV("abcde"), 2, 3, -3);
1879    test(S("abcde"), 5, 0, SV("abcde"), 2, 4, -3);
1880    test(S("abcde"), 5, 0, SV("abcde"), 4, 0, 0);
1881    test(S("abcde"), 5, 0, SV("abcde"), 4, 1, -1);
1882    test(S("abcde"), 5, 0, SV("abcde"), 4, 2, -1);
1883    test(S("abcde"), 5, 0, SV("abcde"), 5, 0, 0);
1884    test(S("abcde"), 5, 0, SV("abcde"), 5, 1, 0);
1885    test(S("abcde"), 5, 0, SV("abcde"), 6, 0, 0);
1886    test(S("abcde"), 5, 0, SV("abcdefghij"), 0, 0, 0);
1887    test(S("abcde"), 5, 0, SV("abcdefghij"), 0, 1, -1);
1888    test(S("abcde"), 5, 0, SV("abcdefghij"), 0, 5, -5);
1889    test(S("abcde"), 5, 0, SV("abcdefghij"), 0, 9, -9);
1890    test(S("abcde"), 5, 0, SV("abcdefghij"), 0, 10, -10);
1891    test(S("abcde"), 5, 0, SV("abcdefghij"), 0, 11, -10);
1892    test(S("abcde"), 5, 0, SV("abcdefghij"), 1, 0, 0);
1893    test(S("abcde"), 5, 0, SV("abcdefghij"), 1, 1, -1);
1894    test(S("abcde"), 5, 0, SV("abcdefghij"), 1, 4, -4);
1895    test(S("abcde"), 5, 0, SV("abcdefghij"), 1, 8, -8);
1896    test(S("abcde"), 5, 0, SV("abcdefghij"), 1, 9, -9);
1897    test(S("abcde"), 5, 0, SV("abcdefghij"), 1, 10, -9);
1898    test(S("abcde"), 5, 0, SV("abcdefghij"), 5, 0, 0);
1899    test(S("abcde"), 5, 0, SV("abcdefghij"), 5, 1, -1);
1900    test(S("abcde"), 5, 0, SV("abcdefghij"), 5, 2, -2);
1901    test(S("abcde"), 5, 0, SV("abcdefghij"), 5, 4, -4);
1902    test(S("abcde"), 5, 0, SV("abcdefghij"), 5, 5, -5);
1903    test(S("abcde"), 5, 0, SV("abcdefghij"), 5, 6, -5);
1904    test(S("abcde"), 5, 0, SV("abcdefghij"), 9, 0, 0);
1905    test(S("abcde"), 5, 0, SV("abcdefghij"), 9, 1, -1);
1906    test(S("abcde"), 5, 0, SV("abcdefghij"), 9, 2, -1);
1907    test(S("abcde"), 5, 0, SV("abcdefghij"), 10, 0, 0);
1908    test(S("abcde"), 5, 0, SV("abcdefghij"), 10, 1, 0);
1909    test(S("abcde"), 5, 0, SV("abcdefghij"), 11, 0, 0);
1910    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
1911    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 0, 1, -1);
1912    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 0, 10, -10);
1913    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 0, 19, -19);
1914    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 0, 20, -20);
1915    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 0, 21, -20);
1916    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
1917    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 1, 1, -1);
1918    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 1, 9, -9);
1919    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 1, 18, -18);
1920    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 1, 19, -19);
1921    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 1, 20, -19);
1922    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
1923    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 10, 1, -1);
1924    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 10, 5, -5);
1925    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 10, 9, -9);
1926    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 10, 10, -10);
1927    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 10, 11, -10);
1928    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
1929    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 19, 1, -1);
1930    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 19, 2, -1);
1931    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
1932    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
1933    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
1934    test(S("abcde"), 5, 1, SV(""), 0, 0, 0);
1935    test(S("abcde"), 5, 1, SV(""), 0, 1, 0);
1936    test(S("abcde"), 5, 1, SV(""), 1, 0, 0);
1937    test(S("abcde"), 5, 1, SV("abcde"), 0, 0, 0);
1938    test(S("abcde"), 5, 1, SV("abcde"), 0, 1, -1);
1939    test(S("abcde"), 5, 1, SV("abcde"), 0, 2, -2);
1940    test(S("abcde"), 5, 1, SV("abcde"), 0, 4, -4);
1941    test(S("abcde"), 5, 1, SV("abcde"), 0, 5, -5);
1942    test(S("abcde"), 5, 1, SV("abcde"), 0, 6, -5);
1943    test(S("abcde"), 5, 1, SV("abcde"), 1, 0, 0);
1944    test(S("abcde"), 5, 1, SV("abcde"), 1, 1, -1);
1945    test(S("abcde"), 5, 1, SV("abcde"), 1, 2, -2);
1946    test(S("abcde"), 5, 1, SV("abcde"), 1, 3, -3);
1947    test(S("abcde"), 5, 1, SV("abcde"), 1, 4, -4);
1948    test(S("abcde"), 5, 1, SV("abcde"), 1, 5, -4);
1949    test(S("abcde"), 5, 1, SV("abcde"), 2, 0, 0);
1950    test(S("abcde"), 5, 1, SV("abcde"), 2, 1, -1);
1951    test(S("abcde"), 5, 1, SV("abcde"), 2, 2, -2);
1952    test(S("abcde"), 5, 1, SV("abcde"), 2, 3, -3);
1953    test(S("abcde"), 5, 1, SV("abcde"), 2, 4, -3);
1954    test(S("abcde"), 5, 1, SV("abcde"), 4, 0, 0);
1955    test(S("abcde"), 5, 1, SV("abcde"), 4, 1, -1);
1956    test(S("abcde"), 5, 1, SV("abcde"), 4, 2, -1);
1957    test(S("abcde"), 5, 1, SV("abcde"), 5, 0, 0);
1958}
1959
1960template <class S, class SV>
1961void test18()
1962{
1963    test(S("abcde"), 5, 1, SV("abcde"), 5, 1, 0);
1964    test(S("abcde"), 5, 1, SV("abcde"), 6, 0, 0);
1965    test(S("abcde"), 5, 1, SV("abcdefghij"), 0, 0, 0);
1966    test(S("abcde"), 5, 1, SV("abcdefghij"), 0, 1, -1);
1967    test(S("abcde"), 5, 1, SV("abcdefghij"), 0, 5, -5);
1968    test(S("abcde"), 5, 1, SV("abcdefghij"), 0, 9, -9);
1969    test(S("abcde"), 5, 1, SV("abcdefghij"), 0, 10, -10);
1970    test(S("abcde"), 5, 1, SV("abcdefghij"), 0, 11, -10);
1971    test(S("abcde"), 5, 1, SV("abcdefghij"), 1, 0, 0);
1972    test(S("abcde"), 5, 1, SV("abcdefghij"), 1, 1, -1);
1973    test(S("abcde"), 5, 1, SV("abcdefghij"), 1, 4, -4);
1974    test(S("abcde"), 5, 1, SV("abcdefghij"), 1, 8, -8);
1975    test(S("abcde"), 5, 1, SV("abcdefghij"), 1, 9, -9);
1976    test(S("abcde"), 5, 1, SV("abcdefghij"), 1, 10, -9);
1977    test(S("abcde"), 5, 1, SV("abcdefghij"), 5, 0, 0);
1978    test(S("abcde"), 5, 1, SV("abcdefghij"), 5, 1, -1);
1979    test(S("abcde"), 5, 1, SV("abcdefghij"), 5, 2, -2);
1980    test(S("abcde"), 5, 1, SV("abcdefghij"), 5, 4, -4);
1981    test(S("abcde"), 5, 1, SV("abcdefghij"), 5, 5, -5);
1982    test(S("abcde"), 5, 1, SV("abcdefghij"), 5, 6, -5);
1983    test(S("abcde"), 5, 1, SV("abcdefghij"), 9, 0, 0);
1984    test(S("abcde"), 5, 1, SV("abcdefghij"), 9, 1, -1);
1985    test(S("abcde"), 5, 1, SV("abcdefghij"), 9, 2, -1);
1986    test(S("abcde"), 5, 1, SV("abcdefghij"), 10, 0, 0);
1987    test(S("abcde"), 5, 1, SV("abcdefghij"), 10, 1, 0);
1988    test(S("abcde"), 5, 1, SV("abcdefghij"), 11, 0, 0);
1989    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 0, 0, 0);
1990    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 0, 1, -1);
1991    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 0, 10, -10);
1992    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 0, 19, -19);
1993    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 0, 20, -20);
1994    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 0, 21, -20);
1995    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 1, 0, 0);
1996    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 1, 1, -1);
1997    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 1, 9, -9);
1998    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 1, 18, -18);
1999    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 1, 19, -19);
2000    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 1, 20, -19);
2001    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 10, 0, 0);
2002    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 10, 1, -1);
2003    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 10, 5, -5);
2004    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 10, 9, -9);
2005    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 10, 10, -10);
2006    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 10, 11, -10);
2007    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 19, 0, 0);
2008    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 19, 1, -1);
2009    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 19, 2, -1);
2010    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 20, 0, 0);
2011    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 20, 1, 0);
2012    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), 21, 0, 0);
2013    test(S("abcde"), 6, 0, SV(""), 0, 0, 0);
2014    test(S("abcde"), 6, 0, SV(""), 0, 1, 0);
2015    test(S("abcde"), 6, 0, SV(""), 1, 0, 0);
2016    test(S("abcde"), 6, 0, SV("abcde"), 0, 0, 0);
2017    test(S("abcde"), 6, 0, SV("abcde"), 0, 1, 0);
2018    test(S("abcde"), 6, 0, SV("abcde"), 0, 2, 0);
2019    test(S("abcde"), 6, 0, SV("abcde"), 0, 4, 0);
2020    test(S("abcde"), 6, 0, SV("abcde"), 0, 5, 0);
2021    test(S("abcde"), 6, 0, SV("abcde"), 0, 6, 0);
2022    test(S("abcde"), 6, 0, SV("abcde"), 1, 0, 0);
2023    test(S("abcde"), 6, 0, SV("abcde"), 1, 1, 0);
2024    test(S("abcde"), 6, 0, SV("abcde"), 1, 2, 0);
2025    test(S("abcde"), 6, 0, SV("abcde"), 1, 3, 0);
2026    test(S("abcde"), 6, 0, SV("abcde"), 1, 4, 0);
2027    test(S("abcde"), 6, 0, SV("abcde"), 1, 5, 0);
2028    test(S("abcde"), 6, 0, SV("abcde"), 2, 0, 0);
2029    test(S("abcde"), 6, 0, SV("abcde"), 2, 1, 0);
2030    test(S("abcde"), 6, 0, SV("abcde"), 2, 2, 0);
2031    test(S("abcde"), 6, 0, SV("abcde"), 2, 3, 0);
2032    test(S("abcde"), 6, 0, SV("abcde"), 2, 4, 0);
2033    test(S("abcde"), 6, 0, SV("abcde"), 4, 0, 0);
2034    test(S("abcde"), 6, 0, SV("abcde"), 4, 1, 0);
2035    test(S("abcde"), 6, 0, SV("abcde"), 4, 2, 0);
2036    test(S("abcde"), 6, 0, SV("abcde"), 5, 0, 0);
2037    test(S("abcde"), 6, 0, SV("abcde"), 5, 1, 0);
2038    test(S("abcde"), 6, 0, SV("abcde"), 6, 0, 0);
2039    test(S("abcde"), 6, 0, SV("abcdefghij"), 0, 0, 0);
2040    test(S("abcde"), 6, 0, SV("abcdefghij"), 0, 1, 0);
2041    test(S("abcde"), 6, 0, SV("abcdefghij"), 0, 5, 0);
2042    test(S("abcde"), 6, 0, SV("abcdefghij"), 0, 9, 0);
2043    test(S("abcde"), 6, 0, SV("abcdefghij"), 0, 10, 0);
2044    test(S("abcde"), 6, 0, SV("abcdefghij"), 0, 11, 0);
2045    test(S("abcde"), 6, 0, SV("abcdefghij"), 1, 0, 0);
2046    test(S("abcde"), 6, 0, SV("abcdefghij"), 1, 1, 0);
2047    test(S("abcde"), 6, 0, SV("abcdefghij"), 1, 4, 0);
2048    test(S("abcde"), 6, 0, SV("abcdefghij"), 1, 8, 0);
2049    test(S("abcde"), 6, 0, SV("abcdefghij"), 1, 9, 0);
2050    test(S("abcde"), 6, 0, SV("abcdefghij"), 1, 10, 0);
2051    test(S("abcde"), 6, 0, SV("abcdefghij"), 5, 0, 0);
2052    test(S("abcde"), 6, 0, SV("abcdefghij"), 5, 1, 0);
2053    test(S("abcde"), 6, 0, SV("abcdefghij"), 5, 2, 0);
2054    test(S("abcde"), 6, 0, SV("abcdefghij"), 5, 4, 0);
2055    test(S("abcde"), 6, 0, SV("abcdefghij"), 5, 5, 0);
2056    test(S("abcde"), 6, 0, SV("abcdefghij"), 5, 6, 0);
2057    test(S("abcde"), 6, 0, SV("abcdefghij"), 9, 0, 0);
2058    test(S("abcde"), 6, 0, SV("abcdefghij"), 9, 1, 0);
2059    test(S("abcde"), 6, 0, SV("abcdefghij"), 9, 2, 0);
2060    test(S("abcde"), 6, 0, SV("abcdefghij"), 10, 0, 0);
2061    test(S("abcde"), 6, 0, SV("abcdefghij"), 10, 1, 0);
2062    test(S("abcde"), 6, 0, SV("abcdefghij"), 11, 0, 0);
2063}
2064
2065template <class S, class SV>
2066void test19()
2067{
2068    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
2069    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 0, 1, 0);
2070    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 0, 10, 0);
2071    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 0, 19, 0);
2072    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 0, 20, 0);
2073    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 0, 21, 0);
2074    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
2075    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 1, 1, 0);
2076    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 1, 9, 0);
2077    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 1, 18, 0);
2078    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 1, 19, 0);
2079    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 1, 20, 0);
2080    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
2081    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 10, 1, 0);
2082    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 10, 5, 0);
2083    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 10, 9, 0);
2084    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 10, 10, 0);
2085    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 10, 11, 0);
2086    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
2087    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 19, 1, 0);
2088    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 19, 2, 0);
2089    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
2090    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
2091    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
2092    test(S("abcdefghij"), 0, 0, SV(""), 0, 0, 0);
2093    test(S("abcdefghij"), 0, 0, SV(""), 0, 1, 0);
2094    test(S("abcdefghij"), 0, 0, SV(""), 1, 0, 0);
2095    test(S("abcdefghij"), 0, 0, SV("abcde"), 0, 0, 0);
2096    test(S("abcdefghij"), 0, 0, SV("abcde"), 0, 1, -1);
2097    test(S("abcdefghij"), 0, 0, SV("abcde"), 0, 2, -2);
2098    test(S("abcdefghij"), 0, 0, SV("abcde"), 0, 4, -4);
2099    test(S("abcdefghij"), 0, 0, SV("abcde"), 0, 5, -5);
2100    test(S("abcdefghij"), 0, 0, SV("abcde"), 0, 6, -5);
2101    test(S("abcdefghij"), 0, 0, SV("abcde"), 1, 0, 0);
2102    test(S("abcdefghij"), 0, 0, SV("abcde"), 1, 1, -1);
2103    test(S("abcdefghij"), 0, 0, SV("abcde"), 1, 2, -2);
2104    test(S("abcdefghij"), 0, 0, SV("abcde"), 1, 3, -3);
2105    test(S("abcdefghij"), 0, 0, SV("abcde"), 1, 4, -4);
2106    test(S("abcdefghij"), 0, 0, SV("abcde"), 1, 5, -4);
2107    test(S("abcdefghij"), 0, 0, SV("abcde"), 2, 0, 0);
2108    test(S("abcdefghij"), 0, 0, SV("abcde"), 2, 1, -1);
2109    test(S("abcdefghij"), 0, 0, SV("abcde"), 2, 2, -2);
2110    test(S("abcdefghij"), 0, 0, SV("abcde"), 2, 3, -3);
2111    test(S("abcdefghij"), 0, 0, SV("abcde"), 2, 4, -3);
2112    test(S("abcdefghij"), 0, 0, SV("abcde"), 4, 0, 0);
2113    test(S("abcdefghij"), 0, 0, SV("abcde"), 4, 1, -1);
2114    test(S("abcdefghij"), 0, 0, SV("abcde"), 4, 2, -1);
2115    test(S("abcdefghij"), 0, 0, SV("abcde"), 5, 0, 0);
2116    test(S("abcdefghij"), 0, 0, SV("abcde"), 5, 1, 0);
2117    test(S("abcdefghij"), 0, 0, SV("abcde"), 6, 0, 0);
2118    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 0, 0, 0);
2119    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 0, 1, -1);
2120    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 0, 5, -5);
2121    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 0, 9, -9);
2122    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 0, 10, -10);
2123    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 0, 11, -10);
2124    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 1, 0, 0);
2125    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 1, 1, -1);
2126    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 1, 4, -4);
2127    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 1, 8, -8);
2128    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 1, 9, -9);
2129    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 1, 10, -9);
2130    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 5, 0, 0);
2131    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 5, 1, -1);
2132    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 5, 2, -2);
2133    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 5, 4, -4);
2134    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 5, 5, -5);
2135    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 5, 6, -5);
2136    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 9, 0, 0);
2137    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 9, 1, -1);
2138    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 9, 2, -1);
2139    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 10, 0, 0);
2140    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 10, 1, 0);
2141    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), 11, 0, 0);
2142    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
2143    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 1, -1);
2144    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 10, -10);
2145    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 19, -19);
2146    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 20, -20);
2147    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 21, -20);
2148    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
2149    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 1, -1);
2150    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 9, -9);
2151    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 18, -18);
2152    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 19, -19);
2153    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 20, -19);
2154    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
2155    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 1, -1);
2156    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 5, -5);
2157    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 9, -9);
2158    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 10, -10);
2159    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 11, -10);
2160    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
2161    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 19, 1, -1);
2162    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 19, 2, -1);
2163    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
2164    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
2165    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
2166    test(S("abcdefghij"), 0, 1, SV(""), 0, 0, 1);
2167    test(S("abcdefghij"), 0, 1, SV(""), 0, 1, 1);
2168}
2169
2170template <class S, class SV>
2171void test20()
2172{
2173    test(S("abcdefghij"), 0, 1, SV(""), 1, 0, 0);
2174    test(S("abcdefghij"), 0, 1, SV("abcde"), 0, 0, 1);
2175    test(S("abcdefghij"), 0, 1, SV("abcde"), 0, 1, 0);
2176    test(S("abcdefghij"), 0, 1, SV("abcde"), 0, 2, -1);
2177    test(S("abcdefghij"), 0, 1, SV("abcde"), 0, 4, -3);
2178    test(S("abcdefghij"), 0, 1, SV("abcde"), 0, 5, -4);
2179    test(S("abcdefghij"), 0, 1, SV("abcde"), 0, 6, -4);
2180    test(S("abcdefghij"), 0, 1, SV("abcde"), 1, 0, 1);
2181    test(S("abcdefghij"), 0, 1, SV("abcde"), 1, 1, -1);
2182    test(S("abcdefghij"), 0, 1, SV("abcde"), 1, 2, -1);
2183    test(S("abcdefghij"), 0, 1, SV("abcde"), 1, 3, -1);
2184    test(S("abcdefghij"), 0, 1, SV("abcde"), 1, 4, -1);
2185    test(S("abcdefghij"), 0, 1, SV("abcde"), 1, 5, -1);
2186    test(S("abcdefghij"), 0, 1, SV("abcde"), 2, 0, 1);
2187    test(S("abcdefghij"), 0, 1, SV("abcde"), 2, 1, -2);
2188    test(S("abcdefghij"), 0, 1, SV("abcde"), 2, 2, -2);
2189    test(S("abcdefghij"), 0, 1, SV("abcde"), 2, 3, -2);
2190    test(S("abcdefghij"), 0, 1, SV("abcde"), 2, 4, -2);
2191    test(S("abcdefghij"), 0, 1, SV("abcde"), 4, 0, 1);
2192    test(S("abcdefghij"), 0, 1, SV("abcde"), 4, 1, -4);
2193    test(S("abcdefghij"), 0, 1, SV("abcde"), 4, 2, -4);
2194    test(S("abcdefghij"), 0, 1, SV("abcde"), 5, 0, 1);
2195    test(S("abcdefghij"), 0, 1, SV("abcde"), 5, 1, 1);
2196    test(S("abcdefghij"), 0, 1, SV("abcde"), 6, 0, 0);
2197    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 0, 0, 1);
2198    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 0, 1, 0);
2199    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 0, 5, -4);
2200    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 0, 9, -8);
2201    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 0, 10, -9);
2202    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 0, 11, -9);
2203    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 1, 0, 1);
2204    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 1, 1, -1);
2205    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 1, 4, -1);
2206    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 1, 8, -1);
2207    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 1, 9, -1);
2208    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 1, 10, -1);
2209    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 5, 0, 1);
2210    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 5, 1, -5);
2211    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 5, 2, -5);
2212    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 5, 4, -5);
2213    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 5, 5, -5);
2214    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 5, 6, -5);
2215    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 9, 0, 1);
2216    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 9, 1, -9);
2217    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 9, 2, -9);
2218    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 10, 0, 1);
2219    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 10, 1, 1);
2220    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), 11, 0, 0);
2221    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 0, 1);
2222    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 1, 0);
2223    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 10, -9);
2224    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 19, -18);
2225    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 20, -19);
2226    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 21, -19);
2227    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 0, 1);
2228    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 1, -1);
2229    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 9, -1);
2230    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 18, -1);
2231    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 19, -1);
2232    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 20, -1);
2233    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 0, 1);
2234    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 1, -10);
2235    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 5, -10);
2236    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 9, -10);
2237    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 10, -10);
2238    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 11, -10);
2239    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 19, 0, 1);
2240    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 19, 1, -19);
2241    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 19, 2, -19);
2242    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 20, 0, 1);
2243    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 20, 1, 1);
2244    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), 21, 0, 0);
2245    test(S("abcdefghij"), 0, 5, SV(""), 0, 0, 5);
2246    test(S("abcdefghij"), 0, 5, SV(""), 0, 1, 5);
2247    test(S("abcdefghij"), 0, 5, SV(""), 1, 0, 0);
2248    test(S("abcdefghij"), 0, 5, SV("abcde"), 0, 0, 5);
2249    test(S("abcdefghij"), 0, 5, SV("abcde"), 0, 1, 4);
2250    test(S("abcdefghij"), 0, 5, SV("abcde"), 0, 2, 3);
2251    test(S("abcdefghij"), 0, 5, SV("abcde"), 0, 4, 1);
2252    test(S("abcdefghij"), 0, 5, SV("abcde"), 0, 5, 0);
2253    test(S("abcdefghij"), 0, 5, SV("abcde"), 0, 6, 0);
2254    test(S("abcdefghij"), 0, 5, SV("abcde"), 1, 0, 5);
2255    test(S("abcdefghij"), 0, 5, SV("abcde"), 1, 1, -1);
2256    test(S("abcdefghij"), 0, 5, SV("abcde"), 1, 2, -1);
2257    test(S("abcdefghij"), 0, 5, SV("abcde"), 1, 3, -1);
2258    test(S("abcdefghij"), 0, 5, SV("abcde"), 1, 4, -1);
2259    test(S("abcdefghij"), 0, 5, SV("abcde"), 1, 5, -1);
2260    test(S("abcdefghij"), 0, 5, SV("abcde"), 2, 0, 5);
2261    test(S("abcdefghij"), 0, 5, SV("abcde"), 2, 1, -2);
2262    test(S("abcdefghij"), 0, 5, SV("abcde"), 2, 2, -2);
2263    test(S("abcdefghij"), 0, 5, SV("abcde"), 2, 3, -2);
2264    test(S("abcdefghij"), 0, 5, SV("abcde"), 2, 4, -2);
2265    test(S("abcdefghij"), 0, 5, SV("abcde"), 4, 0, 5);
2266    test(S("abcdefghij"), 0, 5, SV("abcde"), 4, 1, -4);
2267    test(S("abcdefghij"), 0, 5, SV("abcde"), 4, 2, -4);
2268    test(S("abcdefghij"), 0, 5, SV("abcde"), 5, 0, 5);
2269    test(S("abcdefghij"), 0, 5, SV("abcde"), 5, 1, 5);
2270    test(S("abcdefghij"), 0, 5, SV("abcde"), 6, 0, 0);
2271    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 0, 0, 5);
2272    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 0, 1, 4);
2273}
2274
2275template <class S, class SV>
2276void test21()
2277{
2278    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 0, 5, 0);
2279    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 0, 9, -4);
2280    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 0, 10, -5);
2281    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 0, 11, -5);
2282    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 1, 0, 5);
2283    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 1, 1, -1);
2284    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 1, 4, -1);
2285    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 1, 8, -1);
2286    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 1, 9, -1);
2287    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 1, 10, -1);
2288    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 5, 0, 5);
2289    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 5, 1, -5);
2290    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 5, 2, -5);
2291    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 5, 4, -5);
2292    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 5, 5, -5);
2293    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 5, 6, -5);
2294    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 9, 0, 5);
2295    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 9, 1, -9);
2296    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 9, 2, -9);
2297    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 10, 0, 5);
2298    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 10, 1, 5);
2299    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), 11, 0, 0);
2300    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 0, 0, 5);
2301    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 0, 1, 4);
2302    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 0, 10, -5);
2303    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 0, 19, -14);
2304    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 0, 20, -15);
2305    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 0, 21, -15);
2306    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 1, 0, 5);
2307    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 1, 1, -1);
2308    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 1, 9, -1);
2309    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 1, 18, -1);
2310    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 1, 19, -1);
2311    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 1, 20, -1);
2312    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 10, 0, 5);
2313    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 10, 1, -10);
2314    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 10, 5, -10);
2315    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 10, 9, -10);
2316    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 10, 10, -10);
2317    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 10, 11, -10);
2318    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 19, 0, 5);
2319    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 19, 1, -19);
2320    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 19, 2, -19);
2321    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 20, 0, 5);
2322    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 20, 1, 5);
2323    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), 21, 0, 0);
2324    test(S("abcdefghij"), 0, 9, SV(""), 0, 0, 9);
2325    test(S("abcdefghij"), 0, 9, SV(""), 0, 1, 9);
2326    test(S("abcdefghij"), 0, 9, SV(""), 1, 0, 0);
2327    test(S("abcdefghij"), 0, 9, SV("abcde"), 0, 0, 9);
2328    test(S("abcdefghij"), 0, 9, SV("abcde"), 0, 1, 8);
2329    test(S("abcdefghij"), 0, 9, SV("abcde"), 0, 2, 7);
2330    test(S("abcdefghij"), 0, 9, SV("abcde"), 0, 4, 5);
2331    test(S("abcdefghij"), 0, 9, SV("abcde"), 0, 5, 4);
2332    test(S("abcdefghij"), 0, 9, SV("abcde"), 0, 6, 4);
2333    test(S("abcdefghij"), 0, 9, SV("abcde"), 1, 0, 9);
2334    test(S("abcdefghij"), 0, 9, SV("abcde"), 1, 1, -1);
2335    test(S("abcdefghij"), 0, 9, SV("abcde"), 1, 2, -1);
2336    test(S("abcdefghij"), 0, 9, SV("abcde"), 1, 3, -1);
2337    test(S("abcdefghij"), 0, 9, SV("abcde"), 1, 4, -1);
2338    test(S("abcdefghij"), 0, 9, SV("abcde"), 1, 5, -1);
2339    test(S("abcdefghij"), 0, 9, SV("abcde"), 2, 0, 9);
2340    test(S("abcdefghij"), 0, 9, SV("abcde"), 2, 1, -2);
2341    test(S("abcdefghij"), 0, 9, SV("abcde"), 2, 2, -2);
2342    test(S("abcdefghij"), 0, 9, SV("abcde"), 2, 3, -2);
2343    test(S("abcdefghij"), 0, 9, SV("abcde"), 2, 4, -2);
2344    test(S("abcdefghij"), 0, 9, SV("abcde"), 4, 0, 9);
2345    test(S("abcdefghij"), 0, 9, SV("abcde"), 4, 1, -4);
2346    test(S("abcdefghij"), 0, 9, SV("abcde"), 4, 2, -4);
2347    test(S("abcdefghij"), 0, 9, SV("abcde"), 5, 0, 9);
2348    test(S("abcdefghij"), 0, 9, SV("abcde"), 5, 1, 9);
2349    test(S("abcdefghij"), 0, 9, SV("abcde"), 6, 0, 0);
2350    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 0, 0, 9);
2351    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 0, 1, 8);
2352    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 0, 5, 4);
2353    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 0, 9, 0);
2354    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 0, 10, -1);
2355    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 0, 11, -1);
2356    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 1, 0, 9);
2357    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 1, 1, -1);
2358    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 1, 4, -1);
2359    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 1, 8, -1);
2360    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 1, 9, -1);
2361    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 1, 10, -1);
2362    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 5, 0, 9);
2363    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 5, 1, -5);
2364    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 5, 2, -5);
2365    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 5, 4, -5);
2366    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 5, 5, -5);
2367    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 5, 6, -5);
2368    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 9, 0, 9);
2369    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 9, 1, -9);
2370    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 9, 2, -9);
2371    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 10, 0, 9);
2372    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 10, 1, 9);
2373    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), 11, 0, 0);
2374    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 0, 0, 9);
2375    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 0, 1, 8);
2376    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 0, 10, -1);
2377    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 0, 19, -10);
2378}
2379
2380template <class S, class SV>
2381void test22()
2382{
2383    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 0, 20, -11);
2384    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 0, 21, -11);
2385    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 1, 0, 9);
2386    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 1, 1, -1);
2387    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 1, 9, -1);
2388    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 1, 18, -1);
2389    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 1, 19, -1);
2390    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 1, 20, -1);
2391    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 10, 0, 9);
2392    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 10, 1, -10);
2393    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 10, 5, -10);
2394    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 10, 9, -10);
2395    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 10, 10, -10);
2396    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 10, 11, -10);
2397    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 19, 0, 9);
2398    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 19, 1, -19);
2399    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 19, 2, -19);
2400    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 20, 0, 9);
2401    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 20, 1, 9);
2402    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), 21, 0, 0);
2403    test(S("abcdefghij"), 0, 10, SV(""), 0, 0, 10);
2404    test(S("abcdefghij"), 0, 10, SV(""), 0, 1, 10);
2405    test(S("abcdefghij"), 0, 10, SV(""), 1, 0, 0);
2406    test(S("abcdefghij"), 0, 10, SV("abcde"), 0, 0, 10);
2407    test(S("abcdefghij"), 0, 10, SV("abcde"), 0, 1, 9);
2408    test(S("abcdefghij"), 0, 10, SV("abcde"), 0, 2, 8);
2409    test(S("abcdefghij"), 0, 10, SV("abcde"), 0, 4, 6);
2410    test(S("abcdefghij"), 0, 10, SV("abcde"), 0, 5, 5);
2411    test(S("abcdefghij"), 0, 10, SV("abcde"), 0, 6, 5);
2412    test(S("abcdefghij"), 0, 10, SV("abcde"), 1, 0, 10);
2413    test(S("abcdefghij"), 0, 10, SV("abcde"), 1, 1, -1);
2414    test(S("abcdefghij"), 0, 10, SV("abcde"), 1, 2, -1);
2415    test(S("abcdefghij"), 0, 10, SV("abcde"), 1, 3, -1);
2416    test(S("abcdefghij"), 0, 10, SV("abcde"), 1, 4, -1);
2417    test(S("abcdefghij"), 0, 10, SV("abcde"), 1, 5, -1);
2418    test(S("abcdefghij"), 0, 10, SV("abcde"), 2, 0, 10);
2419    test(S("abcdefghij"), 0, 10, SV("abcde"), 2, 1, -2);
2420    test(S("abcdefghij"), 0, 10, SV("abcde"), 2, 2, -2);
2421    test(S("abcdefghij"), 0, 10, SV("abcde"), 2, 3, -2);
2422    test(S("abcdefghij"), 0, 10, SV("abcde"), 2, 4, -2);
2423    test(S("abcdefghij"), 0, 10, SV("abcde"), 4, 0, 10);
2424    test(S("abcdefghij"), 0, 10, SV("abcde"), 4, 1, -4);
2425    test(S("abcdefghij"), 0, 10, SV("abcde"), 4, 2, -4);
2426    test(S("abcdefghij"), 0, 10, SV("abcde"), 5, 0, 10);
2427    test(S("abcdefghij"), 0, 10, SV("abcde"), 5, 1, 10);
2428    test(S("abcdefghij"), 0, 10, SV("abcde"), 6, 0, 0);
2429    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 0, 0, 10);
2430    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 0, 1, 9);
2431    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 0, 5, 5);
2432    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 0, 9, 1);
2433    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 0, 10, 0);
2434    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 0, 11, 0);
2435    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 1, 0, 10);
2436    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 1, 1, -1);
2437    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 1, 4, -1);
2438    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 1, 8, -1);
2439    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 1, 9, -1);
2440    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 1, 10, -1);
2441    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 5, 0, 10);
2442    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 5, 1, -5);
2443    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 5, 2, -5);
2444    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 5, 4, -5);
2445    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 5, 5, -5);
2446    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 5, 6, -5);
2447    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 9, 0, 10);
2448    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 9, 1, -9);
2449    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 9, 2, -9);
2450    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 10, 0, 10);
2451    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 10, 1, 10);
2452    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 11, 0, 0);
2453    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 0, 0, 10);
2454    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 0, 1, 9);
2455    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 0, 10, 0);
2456    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 0, 19, -9);
2457    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 0, 20, -10);
2458    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 0, 21, -10);
2459    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 1, 0, 10);
2460    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 1, 1, -1);
2461    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 1, 9, -1);
2462    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 1, 18, -1);
2463    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 1, 19, -1);
2464    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 1, 20, -1);
2465    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 10, 0, 10);
2466    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 10, 1, -10);
2467    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 10, 5, -10);
2468    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 10, 9, -10);
2469    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 10, 10, -10);
2470    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 10, 11, -10);
2471    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 19, 0, 10);
2472    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 19, 1, -19);
2473    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 19, 2, -19);
2474    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 20, 0, 10);
2475    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 20, 1, 10);
2476    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), 21, 0, 0);
2477    test(S("abcdefghij"), 0, 11, SV(""), 0, 0, 10);
2478    test(S("abcdefghij"), 0, 11, SV(""), 0, 1, 10);
2479    test(S("abcdefghij"), 0, 11, SV(""), 1, 0, 0);
2480    test(S("abcdefghij"), 0, 11, SV("abcde"), 0, 0, 10);
2481    test(S("abcdefghij"), 0, 11, SV("abcde"), 0, 1, 9);
2482    test(S("abcdefghij"), 0, 11, SV("abcde"), 0, 2, 8);
2483}
2484
2485template <class S, class SV>
2486void test23()
2487{
2488    test(S("abcdefghij"), 0, 11, SV("abcde"), 0, 4, 6);
2489    test(S("abcdefghij"), 0, 11, SV("abcde"), 0, 5, 5);
2490    test(S("abcdefghij"), 0, 11, SV("abcde"), 0, 6, 5);
2491    test(S("abcdefghij"), 0, 11, SV("abcde"), 1, 0, 10);
2492    test(S("abcdefghij"), 0, 11, SV("abcde"), 1, 1, -1);
2493    test(S("abcdefghij"), 0, 11, SV("abcde"), 1, 2, -1);
2494    test(S("abcdefghij"), 0, 11, SV("abcde"), 1, 3, -1);
2495    test(S("abcdefghij"), 0, 11, SV("abcde"), 1, 4, -1);
2496    test(S("abcdefghij"), 0, 11, SV("abcde"), 1, 5, -1);
2497    test(S("abcdefghij"), 0, 11, SV("abcde"), 2, 0, 10);
2498    test(S("abcdefghij"), 0, 11, SV("abcde"), 2, 1, -2);
2499    test(S("abcdefghij"), 0, 11, SV("abcde"), 2, 2, -2);
2500    test(S("abcdefghij"), 0, 11, SV("abcde"), 2, 3, -2);
2501    test(S("abcdefghij"), 0, 11, SV("abcde"), 2, 4, -2);
2502    test(S("abcdefghij"), 0, 11, SV("abcde"), 4, 0, 10);
2503    test(S("abcdefghij"), 0, 11, SV("abcde"), 4, 1, -4);
2504    test(S("abcdefghij"), 0, 11, SV("abcde"), 4, 2, -4);
2505    test(S("abcdefghij"), 0, 11, SV("abcde"), 5, 0, 10);
2506    test(S("abcdefghij"), 0, 11, SV("abcde"), 5, 1, 10);
2507    test(S("abcdefghij"), 0, 11, SV("abcde"), 6, 0, 0);
2508    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 0, 0, 10);
2509    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 0, 1, 9);
2510    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 0, 5, 5);
2511    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 0, 9, 1);
2512    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 0, 10, 0);
2513    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 0, 11, 0);
2514    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 1, 0, 10);
2515    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 1, 1, -1);
2516    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 1, 4, -1);
2517    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 1, 8, -1);
2518    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 1, 9, -1);
2519    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 1, 10, -1);
2520    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 5, 0, 10);
2521    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 5, 1, -5);
2522    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 5, 2, -5);
2523    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 5, 4, -5);
2524    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 5, 5, -5);
2525    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 5, 6, -5);
2526    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 9, 0, 10);
2527    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 9, 1, -9);
2528    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 9, 2, -9);
2529    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 10, 0, 10);
2530    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 10, 1, 10);
2531    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 11, 0, 0);
2532    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 0, 0, 10);
2533    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 0, 1, 9);
2534    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 0, 10, 0);
2535    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 0, 19, -9);
2536    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 0, 20, -10);
2537    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 0, 21, -10);
2538    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 1, 0, 10);
2539    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 1, 1, -1);
2540    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 1, 9, -1);
2541    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 1, 18, -1);
2542    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 1, 19, -1);
2543    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 1, 20, -1);
2544    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 10, 0, 10);
2545    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 10, 1, -10);
2546    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 10, 5, -10);
2547    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 10, 9, -10);
2548    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 10, 10, -10);
2549    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 10, 11, -10);
2550    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 19, 0, 10);
2551    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 19, 1, -19);
2552    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 19, 2, -19);
2553    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 20, 0, 10);
2554    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 20, 1, 10);
2555    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), 21, 0, 0);
2556    test(S("abcdefghij"), 1, 0, SV(""), 0, 0, 0);
2557    test(S("abcdefghij"), 1, 0, SV(""), 0, 1, 0);
2558    test(S("abcdefghij"), 1, 0, SV(""), 1, 0, 0);
2559    test(S("abcdefghij"), 1, 0, SV("abcde"), 0, 0, 0);
2560    test(S("abcdefghij"), 1, 0, SV("abcde"), 0, 1, -1);
2561    test(S("abcdefghij"), 1, 0, SV("abcde"), 0, 2, -2);
2562    test(S("abcdefghij"), 1, 0, SV("abcde"), 0, 4, -4);
2563    test(S("abcdefghij"), 1, 0, SV("abcde"), 0, 5, -5);
2564    test(S("abcdefghij"), 1, 0, SV("abcde"), 0, 6, -5);
2565    test(S("abcdefghij"), 1, 0, SV("abcde"), 1, 0, 0);
2566    test(S("abcdefghij"), 1, 0, SV("abcde"), 1, 1, -1);
2567    test(S("abcdefghij"), 1, 0, SV("abcde"), 1, 2, -2);
2568    test(S("abcdefghij"), 1, 0, SV("abcde"), 1, 3, -3);
2569    test(S("abcdefghij"), 1, 0, SV("abcde"), 1, 4, -4);
2570    test(S("abcdefghij"), 1, 0, SV("abcde"), 1, 5, -4);
2571    test(S("abcdefghij"), 1, 0, SV("abcde"), 2, 0, 0);
2572    test(S("abcdefghij"), 1, 0, SV("abcde"), 2, 1, -1);
2573    test(S("abcdefghij"), 1, 0, SV("abcde"), 2, 2, -2);
2574    test(S("abcdefghij"), 1, 0, SV("abcde"), 2, 3, -3);
2575    test(S("abcdefghij"), 1, 0, SV("abcde"), 2, 4, -3);
2576    test(S("abcdefghij"), 1, 0, SV("abcde"), 4, 0, 0);
2577    test(S("abcdefghij"), 1, 0, SV("abcde"), 4, 1, -1);
2578    test(S("abcdefghij"), 1, 0, SV("abcde"), 4, 2, -1);
2579    test(S("abcdefghij"), 1, 0, SV("abcde"), 5, 0, 0);
2580    test(S("abcdefghij"), 1, 0, SV("abcde"), 5, 1, 0);
2581    test(S("abcdefghij"), 1, 0, SV("abcde"), 6, 0, 0);
2582    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 0, 0, 0);
2583    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 0, 1, -1);
2584    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 0, 5, -5);
2585    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 0, 9, -9);
2586    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 0, 10, -10);
2587    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 0, 11, -10);
2588}
2589
2590template <class S, class SV>
2591void test24()
2592{
2593    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 1, 0, 0);
2594    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 1, 1, -1);
2595    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 1, 4, -4);
2596    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 1, 8, -8);
2597    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 1, 9, -9);
2598    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 1, 10, -9);
2599    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 5, 0, 0);
2600    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 5, 1, -1);
2601    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 5, 2, -2);
2602    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 5, 4, -4);
2603    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 5, 5, -5);
2604    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 5, 6, -5);
2605    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 9, 0, 0);
2606    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 9, 1, -1);
2607    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 9, 2, -1);
2608    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 10, 0, 0);
2609    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 10, 1, 0);
2610    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), 11, 0, 0);
2611    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
2612    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 1, -1);
2613    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 10, -10);
2614    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 19, -19);
2615    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 20, -20);
2616    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 21, -20);
2617    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
2618    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 1, -1);
2619    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 9, -9);
2620    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 18, -18);
2621    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 19, -19);
2622    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 20, -19);
2623    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
2624    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 1, -1);
2625    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 5, -5);
2626    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 9, -9);
2627    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 10, -10);
2628    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 11, -10);
2629    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
2630    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 19, 1, -1);
2631    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 19, 2, -1);
2632    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
2633    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
2634    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
2635    test(S("abcdefghij"), 1, 1, SV(""), 0, 0, 1);
2636    test(S("abcdefghij"), 1, 1, SV(""), 0, 1, 1);
2637    test(S("abcdefghij"), 1, 1, SV(""), 1, 0, 0);
2638    test(S("abcdefghij"), 1, 1, SV("abcde"), 0, 0, 1);
2639    test(S("abcdefghij"), 1, 1, SV("abcde"), 0, 1, 1);
2640    test(S("abcdefghij"), 1, 1, SV("abcde"), 0, 2, 1);
2641    test(S("abcdefghij"), 1, 1, SV("abcde"), 0, 4, 1);
2642    test(S("abcdefghij"), 1, 1, SV("abcde"), 0, 5, 1);
2643    test(S("abcdefghij"), 1, 1, SV("abcde"), 0, 6, 1);
2644    test(S("abcdefghij"), 1, 1, SV("abcde"), 1, 0, 1);
2645    test(S("abcdefghij"), 1, 1, SV("abcde"), 1, 1, 0);
2646    test(S("abcdefghij"), 1, 1, SV("abcde"), 1, 2, -1);
2647    test(S("abcdefghij"), 1, 1, SV("abcde"), 1, 3, -2);
2648    test(S("abcdefghij"), 1, 1, SV("abcde"), 1, 4, -3);
2649    test(S("abcdefghij"), 1, 1, SV("abcde"), 1, 5, -3);
2650    test(S("abcdefghij"), 1, 1, SV("abcde"), 2, 0, 1);
2651    test(S("abcdefghij"), 1, 1, SV("abcde"), 2, 1, -1);
2652    test(S("abcdefghij"), 1, 1, SV("abcde"), 2, 2, -1);
2653    test(S("abcdefghij"), 1, 1, SV("abcde"), 2, 3, -1);
2654    test(S("abcdefghij"), 1, 1, SV("abcde"), 2, 4, -1);
2655    test(S("abcdefghij"), 1, 1, SV("abcde"), 4, 0, 1);
2656    test(S("abcdefghij"), 1, 1, SV("abcde"), 4, 1, -3);
2657    test(S("abcdefghij"), 1, 1, SV("abcde"), 4, 2, -3);
2658    test(S("abcdefghij"), 1, 1, SV("abcde"), 5, 0, 1);
2659    test(S("abcdefghij"), 1, 1, SV("abcde"), 5, 1, 1);
2660    test(S("abcdefghij"), 1, 1, SV("abcde"), 6, 0, 0);
2661    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 0, 0, 1);
2662    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 0, 1, 1);
2663    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 0, 5, 1);
2664    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 0, 9, 1);
2665    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 0, 10, 1);
2666    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 0, 11, 1);
2667    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 1, 0, 1);
2668    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 1, 1, 0);
2669    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 1, 4, -3);
2670    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 1, 8, -7);
2671    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 1, 9, -8);
2672    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 1, 10, -8);
2673    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 5, 0, 1);
2674    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 5, 1, -4);
2675    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 5, 2, -4);
2676    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 5, 4, -4);
2677    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 5, 5, -4);
2678    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 5, 6, -4);
2679    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 9, 0, 1);
2680    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 9, 1, -8);
2681    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 9, 2, -8);
2682    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 10, 0, 1);
2683    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 10, 1, 1);
2684    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 11, 0, 0);
2685    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 0, 1);
2686    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 1, 1);
2687    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 10, 1);
2688    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 19, 1);
2689    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 20, 1);
2690    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 21, 1);
2691    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 0, 1);
2692    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 1, 0);
2693}
2694
2695template <class S, class SV>
2696void test25()
2697{
2698    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 9, -8);
2699    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 18, -17);
2700    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 19, -18);
2701    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 20, -18);
2702    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 0, 1);
2703    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 1, -9);
2704    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 5, -9);
2705    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 9, -9);
2706    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 10, -9);
2707    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 11, -9);
2708    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 19, 0, 1);
2709    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 19, 1, -18);
2710    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 19, 2, -18);
2711    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 20, 0, 1);
2712    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 20, 1, 1);
2713    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 21, 0, 0);
2714    test(S("abcdefghij"), 1, 4, SV(""), 0, 0, 4);
2715    test(S("abcdefghij"), 1, 4, SV(""), 0, 1, 4);
2716    test(S("abcdefghij"), 1, 4, SV(""), 1, 0, 0);
2717    test(S("abcdefghij"), 1, 4, SV("abcde"), 0, 0, 4);
2718    test(S("abcdefghij"), 1, 4, SV("abcde"), 0, 1, 1);
2719    test(S("abcdefghij"), 1, 4, SV("abcde"), 0, 2, 1);
2720    test(S("abcdefghij"), 1, 4, SV("abcde"), 0, 4, 1);
2721    test(S("abcdefghij"), 1, 4, SV("abcde"), 0, 5, 1);
2722    test(S("abcdefghij"), 1, 4, SV("abcde"), 0, 6, 1);
2723    test(S("abcdefghij"), 1, 4, SV("abcde"), 1, 0, 4);
2724    test(S("abcdefghij"), 1, 4, SV("abcde"), 1, 1, 3);
2725    test(S("abcdefghij"), 1, 4, SV("abcde"), 1, 2, 2);
2726    test(S("abcdefghij"), 1, 4, SV("abcde"), 1, 3, 1);
2727    test(S("abcdefghij"), 1, 4, SV("abcde"), 1, 4, 0);
2728    test(S("abcdefghij"), 1, 4, SV("abcde"), 1, 5, 0);
2729    test(S("abcdefghij"), 1, 4, SV("abcde"), 2, 0, 4);
2730    test(S("abcdefghij"), 1, 4, SV("abcde"), 2, 1, -1);
2731    test(S("abcdefghij"), 1, 4, SV("abcde"), 2, 2, -1);
2732    test(S("abcdefghij"), 1, 4, SV("abcde"), 2, 3, -1);
2733    test(S("abcdefghij"), 1, 4, SV("abcde"), 2, 4, -1);
2734    test(S("abcdefghij"), 1, 4, SV("abcde"), 4, 0, 4);
2735    test(S("abcdefghij"), 1, 4, SV("abcde"), 4, 1, -3);
2736    test(S("abcdefghij"), 1, 4, SV("abcde"), 4, 2, -3);
2737    test(S("abcdefghij"), 1, 4, SV("abcde"), 5, 0, 4);
2738    test(S("abcdefghij"), 1, 4, SV("abcde"), 5, 1, 4);
2739    test(S("abcdefghij"), 1, 4, SV("abcde"), 6, 0, 0);
2740    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 0, 0, 4);
2741    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 0, 1, 1);
2742    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 0, 5, 1);
2743    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 0, 9, 1);
2744    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 0, 10, 1);
2745    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 0, 11, 1);
2746    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 1, 0, 4);
2747    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 1, 1, 3);
2748    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 1, 4, 0);
2749    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 1, 8, -4);
2750    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 1, 9, -5);
2751    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 1, 10, -5);
2752    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 5, 0, 4);
2753    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 5, 1, -4);
2754    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 5, 2, -4);
2755    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 5, 4, -4);
2756    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 5, 5, -4);
2757    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 5, 6, -4);
2758    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 9, 0, 4);
2759    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 9, 1, -8);
2760    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 9, 2, -8);
2761    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 10, 0, 4);
2762    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 10, 1, 4);
2763    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 11, 0, 0);
2764    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 0, 0, 4);
2765    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 0, 1, 1);
2766    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 0, 10, 1);
2767    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 0, 19, 1);
2768    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 0, 20, 1);
2769    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 0, 21, 1);
2770    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 1, 0, 4);
2771    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 1, 1, 3);
2772    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 1, 9, -5);
2773    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 1, 18, -14);
2774    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 1, 19, -15);
2775    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 1, 20, -15);
2776    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 10, 0, 4);
2777    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 10, 1, -9);
2778    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 10, 5, -9);
2779    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 10, 9, -9);
2780    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 10, 10, -9);
2781    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 10, 11, -9);
2782    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 19, 0, 4);
2783    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 19, 1, -18);
2784    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 19, 2, -18);
2785    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 20, 0, 4);
2786    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 20, 1, 4);
2787    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 21, 0, 0);
2788    test(S("abcdefghij"), 1, 8, SV(""), 0, 0, 8);
2789    test(S("abcdefghij"), 1, 8, SV(""), 0, 1, 8);
2790    test(S("abcdefghij"), 1, 8, SV(""), 1, 0, 0);
2791    test(S("abcdefghij"), 1, 8, SV("abcde"), 0, 0, 8);
2792    test(S("abcdefghij"), 1, 8, SV("abcde"), 0, 1, 1);
2793    test(S("abcdefghij"), 1, 8, SV("abcde"), 0, 2, 1);
2794    test(S("abcdefghij"), 1, 8, SV("abcde"), 0, 4, 1);
2795    test(S("abcdefghij"), 1, 8, SV("abcde"), 0, 5, 1);
2796    test(S("abcdefghij"), 1, 8, SV("abcde"), 0, 6, 1);
2797    test(S("abcdefghij"), 1, 8, SV("abcde"), 1, 0, 8);
2798}
2799
2800template <class S, class SV>
2801void test26()
2802{
2803    test(S("abcdefghij"), 1, 8, SV("abcde"), 1, 1, 7);
2804    test(S("abcdefghij"), 1, 8, SV("abcde"), 1, 2, 6);
2805    test(S("abcdefghij"), 1, 8, SV("abcde"), 1, 3, 5);
2806    test(S("abcdefghij"), 1, 8, SV("abcde"), 1, 4, 4);
2807    test(S("abcdefghij"), 1, 8, SV("abcde"), 1, 5, 4);
2808    test(S("abcdefghij"), 1, 8, SV("abcde"), 2, 0, 8);
2809    test(S("abcdefghij"), 1, 8, SV("abcde"), 2, 1, -1);
2810    test(S("abcdefghij"), 1, 8, SV("abcde"), 2, 2, -1);
2811    test(S("abcdefghij"), 1, 8, SV("abcde"), 2, 3, -1);
2812    test(S("abcdefghij"), 1, 8, SV("abcde"), 2, 4, -1);
2813    test(S("abcdefghij"), 1, 8, SV("abcde"), 4, 0, 8);
2814    test(S("abcdefghij"), 1, 8, SV("abcde"), 4, 1, -3);
2815    test(S("abcdefghij"), 1, 8, SV("abcde"), 4, 2, -3);
2816    test(S("abcdefghij"), 1, 8, SV("abcde"), 5, 0, 8);
2817    test(S("abcdefghij"), 1, 8, SV("abcde"), 5, 1, 8);
2818    test(S("abcdefghij"), 1, 8, SV("abcde"), 6, 0, 0);
2819    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 0, 0, 8);
2820    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 0, 1, 1);
2821    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 0, 5, 1);
2822    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 0, 9, 1);
2823    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 0, 10, 1);
2824    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 0, 11, 1);
2825    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 1, 0, 8);
2826    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 1, 1, 7);
2827    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 1, 4, 4);
2828    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 1, 8, 0);
2829    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 1, 9, -1);
2830    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 1, 10, -1);
2831    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 5, 0, 8);
2832    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 5, 1, -4);
2833    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 5, 2, -4);
2834    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 5, 4, -4);
2835    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 5, 5, -4);
2836    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 5, 6, -4);
2837    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 9, 0, 8);
2838    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 9, 1, -8);
2839    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 9, 2, -8);
2840    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 10, 0, 8);
2841    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 10, 1, 8);
2842    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 11, 0, 0);
2843    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 0, 0, 8);
2844    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 0, 1, 1);
2845    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 0, 10, 1);
2846    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 0, 19, 1);
2847    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 0, 20, 1);
2848    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 0, 21, 1);
2849    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 1, 0, 8);
2850    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 1, 1, 7);
2851    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 1, 9, -1);
2852    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 1, 18, -10);
2853    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 1, 19, -11);
2854    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 1, 20, -11);
2855    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 10, 0, 8);
2856    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 10, 1, -9);
2857    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 10, 5, -9);
2858    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 10, 9, -9);
2859    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 10, 10, -9);
2860    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 10, 11, -9);
2861    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 19, 0, 8);
2862    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 19, 1, -18);
2863    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 19, 2, -18);
2864    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 20, 0, 8);
2865    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 20, 1, 8);
2866    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 21, 0, 0);
2867    test(S("abcdefghij"), 1, 9, SV(""), 0, 0, 9);
2868    test(S("abcdefghij"), 1, 9, SV(""), 0, 1, 9);
2869    test(S("abcdefghij"), 1, 9, SV(""), 1, 0, 0);
2870    test(S("abcdefghij"), 1, 9, SV("abcde"), 0, 0, 9);
2871    test(S("abcdefghij"), 1, 9, SV("abcde"), 0, 1, 1);
2872    test(S("abcdefghij"), 1, 9, SV("abcde"), 0, 2, 1);
2873    test(S("abcdefghij"), 1, 9, SV("abcde"), 0, 4, 1);
2874    test(S("abcdefghij"), 1, 9, SV("abcde"), 0, 5, 1);
2875    test(S("abcdefghij"), 1, 9, SV("abcde"), 0, 6, 1);
2876    test(S("abcdefghij"), 1, 9, SV("abcde"), 1, 0, 9);
2877    test(S("abcdefghij"), 1, 9, SV("abcde"), 1, 1, 8);
2878    test(S("abcdefghij"), 1, 9, SV("abcde"), 1, 2, 7);
2879    test(S("abcdefghij"), 1, 9, SV("abcde"), 1, 3, 6);
2880    test(S("abcdefghij"), 1, 9, SV("abcde"), 1, 4, 5);
2881    test(S("abcdefghij"), 1, 9, SV("abcde"), 1, 5, 5);
2882    test(S("abcdefghij"), 1, 9, SV("abcde"), 2, 0, 9);
2883    test(S("abcdefghij"), 1, 9, SV("abcde"), 2, 1, -1);
2884    test(S("abcdefghij"), 1, 9, SV("abcde"), 2, 2, -1);
2885    test(S("abcdefghij"), 1, 9, SV("abcde"), 2, 3, -1);
2886    test(S("abcdefghij"), 1, 9, SV("abcde"), 2, 4, -1);
2887    test(S("abcdefghij"), 1, 9, SV("abcde"), 4, 0, 9);
2888    test(S("abcdefghij"), 1, 9, SV("abcde"), 4, 1, -3);
2889    test(S("abcdefghij"), 1, 9, SV("abcde"), 4, 2, -3);
2890    test(S("abcdefghij"), 1, 9, SV("abcde"), 5, 0, 9);
2891    test(S("abcdefghij"), 1, 9, SV("abcde"), 5, 1, 9);
2892    test(S("abcdefghij"), 1, 9, SV("abcde"), 6, 0, 0);
2893    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 0, 0, 9);
2894    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 0, 1, 1);
2895    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 0, 5, 1);
2896    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 0, 9, 1);
2897    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 0, 10, 1);
2898    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 0, 11, 1);
2899    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 1, 0, 9);
2900    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 1, 1, 8);
2901    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 1, 4, 5);
2902    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 1, 8, 1);
2903}
2904
2905template <class S, class SV>
2906void test27()
2907{
2908    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 1, 9, 0);
2909    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 1, 10, 0);
2910    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 5, 0, 9);
2911    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 5, 1, -4);
2912    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 5, 2, -4);
2913    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 5, 4, -4);
2914    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 5, 5, -4);
2915    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 5, 6, -4);
2916    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 9, 0, 9);
2917    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 9, 1, -8);
2918    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 9, 2, -8);
2919    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 10, 0, 9);
2920    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 10, 1, 9);
2921    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 11, 0, 0);
2922    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 0, 0, 9);
2923    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 0, 1, 1);
2924    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 0, 10, 1);
2925    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 0, 19, 1);
2926    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 0, 20, 1);
2927    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 0, 21, 1);
2928    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 1, 0, 9);
2929    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 1, 1, 8);
2930    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 1, 9, 0);
2931    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 1, 18, -9);
2932    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 1, 19, -10);
2933    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 1, 20, -10);
2934    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 10, 0, 9);
2935    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 10, 1, -9);
2936    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 10, 5, -9);
2937    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 10, 9, -9);
2938    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 10, 10, -9);
2939    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 10, 11, -9);
2940    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 19, 0, 9);
2941    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 19, 1, -18);
2942    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 19, 2, -18);
2943    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 20, 0, 9);
2944    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 20, 1, 9);
2945    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 21, 0, 0);
2946    test(S("abcdefghij"), 1, 10, SV(""), 0, 0, 9);
2947    test(S("abcdefghij"), 1, 10, SV(""), 0, 1, 9);
2948    test(S("abcdefghij"), 1, 10, SV(""), 1, 0, 0);
2949    test(S("abcdefghij"), 1, 10, SV("abcde"), 0, 0, 9);
2950    test(S("abcdefghij"), 1, 10, SV("abcde"), 0, 1, 1);
2951    test(S("abcdefghij"), 1, 10, SV("abcde"), 0, 2, 1);
2952    test(S("abcdefghij"), 1, 10, SV("abcde"), 0, 4, 1);
2953    test(S("abcdefghij"), 1, 10, SV("abcde"), 0, 5, 1);
2954    test(S("abcdefghij"), 1, 10, SV("abcde"), 0, 6, 1);
2955    test(S("abcdefghij"), 1, 10, SV("abcde"), 1, 0, 9);
2956    test(S("abcdefghij"), 1, 10, SV("abcde"), 1, 1, 8);
2957    test(S("abcdefghij"), 1, 10, SV("abcde"), 1, 2, 7);
2958    test(S("abcdefghij"), 1, 10, SV("abcde"), 1, 3, 6);
2959    test(S("abcdefghij"), 1, 10, SV("abcde"), 1, 4, 5);
2960    test(S("abcdefghij"), 1, 10, SV("abcde"), 1, 5, 5);
2961    test(S("abcdefghij"), 1, 10, SV("abcde"), 2, 0, 9);
2962    test(S("abcdefghij"), 1, 10, SV("abcde"), 2, 1, -1);
2963    test(S("abcdefghij"), 1, 10, SV("abcde"), 2, 2, -1);
2964    test(S("abcdefghij"), 1, 10, SV("abcde"), 2, 3, -1);
2965    test(S("abcdefghij"), 1, 10, SV("abcde"), 2, 4, -1);
2966    test(S("abcdefghij"), 1, 10, SV("abcde"), 4, 0, 9);
2967    test(S("abcdefghij"), 1, 10, SV("abcde"), 4, 1, -3);
2968    test(S("abcdefghij"), 1, 10, SV("abcde"), 4, 2, -3);
2969    test(S("abcdefghij"), 1, 10, SV("abcde"), 5, 0, 9);
2970    test(S("abcdefghij"), 1, 10, SV("abcde"), 5, 1, 9);
2971    test(S("abcdefghij"), 1, 10, SV("abcde"), 6, 0, 0);
2972    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 0, 0, 9);
2973    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 0, 1, 1);
2974    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 0, 5, 1);
2975    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 0, 9, 1);
2976    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 0, 10, 1);
2977    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 0, 11, 1);
2978    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 1, 0, 9);
2979    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 1, 1, 8);
2980    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 1, 4, 5);
2981    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 1, 8, 1);
2982    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 1, 9, 0);
2983    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 1, 10, 0);
2984    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 5, 0, 9);
2985    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 5, 1, -4);
2986    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 5, 2, -4);
2987    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 5, 4, -4);
2988    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 5, 5, -4);
2989    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 5, 6, -4);
2990    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 9, 0, 9);
2991    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 9, 1, -8);
2992    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 9, 2, -8);
2993    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 10, 0, 9);
2994    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 10, 1, 9);
2995    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 11, 0, 0);
2996    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 0, 0, 9);
2997    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 0, 1, 1);
2998    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 0, 10, 1);
2999    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 0, 19, 1);
3000    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 0, 20, 1);
3001    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 0, 21, 1);
3002    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 1, 0, 9);
3003    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 1, 1, 8);
3004    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 1, 9, 0);
3005    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 1, 18, -9);
3006    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 1, 19, -10);
3007    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 1, 20, -10);
3008}
3009
3010template <class S, class SV>
3011void test28()
3012{
3013    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 10, 0, 9);
3014    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 10, 1, -9);
3015    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 10, 5, -9);
3016    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 10, 9, -9);
3017    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 10, 10, -9);
3018    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 10, 11, -9);
3019    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 19, 0, 9);
3020    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 19, 1, -18);
3021    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 19, 2, -18);
3022    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 20, 0, 9);
3023    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 20, 1, 9);
3024    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 21, 0, 0);
3025    test(S("abcdefghij"), 5, 0, SV(""), 0, 0, 0);
3026    test(S("abcdefghij"), 5, 0, SV(""), 0, 1, 0);
3027    test(S("abcdefghij"), 5, 0, SV(""), 1, 0, 0);
3028    test(S("abcdefghij"), 5, 0, SV("abcde"), 0, 0, 0);
3029    test(S("abcdefghij"), 5, 0, SV("abcde"), 0, 1, -1);
3030    test(S("abcdefghij"), 5, 0, SV("abcde"), 0, 2, -2);
3031    test(S("abcdefghij"), 5, 0, SV("abcde"), 0, 4, -4);
3032    test(S("abcdefghij"), 5, 0, SV("abcde"), 0, 5, -5);
3033    test(S("abcdefghij"), 5, 0, SV("abcde"), 0, 6, -5);
3034    test(S("abcdefghij"), 5, 0, SV("abcde"), 1, 0, 0);
3035    test(S("abcdefghij"), 5, 0, SV("abcde"), 1, 1, -1);
3036    test(S("abcdefghij"), 5, 0, SV("abcde"), 1, 2, -2);
3037    test(S("abcdefghij"), 5, 0, SV("abcde"), 1, 3, -3);
3038    test(S("abcdefghij"), 5, 0, SV("abcde"), 1, 4, -4);
3039    test(S("abcdefghij"), 5, 0, SV("abcde"), 1, 5, -4);
3040    test(S("abcdefghij"), 5, 0, SV("abcde"), 2, 0, 0);
3041    test(S("abcdefghij"), 5, 0, SV("abcde"), 2, 1, -1);
3042    test(S("abcdefghij"), 5, 0, SV("abcde"), 2, 2, -2);
3043    test(S("abcdefghij"), 5, 0, SV("abcde"), 2, 3, -3);
3044    test(S("abcdefghij"), 5, 0, SV("abcde"), 2, 4, -3);
3045    test(S("abcdefghij"), 5, 0, SV("abcde"), 4, 0, 0);
3046    test(S("abcdefghij"), 5, 0, SV("abcde"), 4, 1, -1);
3047    test(S("abcdefghij"), 5, 0, SV("abcde"), 4, 2, -1);
3048    test(S("abcdefghij"), 5, 0, SV("abcde"), 5, 0, 0);
3049    test(S("abcdefghij"), 5, 0, SV("abcde"), 5, 1, 0);
3050    test(S("abcdefghij"), 5, 0, SV("abcde"), 6, 0, 0);
3051    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 0, 0, 0);
3052    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 0, 1, -1);
3053    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 0, 5, -5);
3054    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 0, 9, -9);
3055    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 0, 10, -10);
3056    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 0, 11, -10);
3057    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 1, 0, 0);
3058    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 1, 1, -1);
3059    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 1, 4, -4);
3060    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 1, 8, -8);
3061    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 1, 9, -9);
3062    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 1, 10, -9);
3063    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 5, 0, 0);
3064    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 5, 1, -1);
3065    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 5, 2, -2);
3066    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 5, 4, -4);
3067    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 5, 5, -5);
3068    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 5, 6, -5);
3069    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 9, 0, 0);
3070    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 9, 1, -1);
3071    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 9, 2, -1);
3072    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 10, 0, 0);
3073    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 10, 1, 0);
3074    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), 11, 0, 0);
3075    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
3076    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 0, 1, -1);
3077    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 0, 10, -10);
3078    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 0, 19, -19);
3079    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 0, 20, -20);
3080    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 0, 21, -20);
3081    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
3082    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 1, 1, -1);
3083    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 1, 9, -9);
3084    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 1, 18, -18);
3085    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 1, 19, -19);
3086    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 1, 20, -19);
3087    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
3088    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 10, 1, -1);
3089    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 10, 5, -5);
3090    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 10, 9, -9);
3091    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 10, 10, -10);
3092    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 10, 11, -10);
3093    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
3094    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 19, 1, -1);
3095    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 19, 2, -1);
3096    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
3097    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
3098    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
3099    test(S("abcdefghij"), 5, 1, SV(""), 0, 0, 1);
3100    test(S("abcdefghij"), 5, 1, SV(""), 0, 1, 1);
3101    test(S("abcdefghij"), 5, 1, SV(""), 1, 0, 0);
3102    test(S("abcdefghij"), 5, 1, SV("abcde"), 0, 0, 1);
3103    test(S("abcdefghij"), 5, 1, SV("abcde"), 0, 1, 5);
3104    test(S("abcdefghij"), 5, 1, SV("abcde"), 0, 2, 5);
3105    test(S("abcdefghij"), 5, 1, SV("abcde"), 0, 4, 5);
3106    test(S("abcdefghij"), 5, 1, SV("abcde"), 0, 5, 5);
3107    test(S("abcdefghij"), 5, 1, SV("abcde"), 0, 6, 5);
3108    test(S("abcdefghij"), 5, 1, SV("abcde"), 1, 0, 1);
3109    test(S("abcdefghij"), 5, 1, SV("abcde"), 1, 1, 4);
3110    test(S("abcdefghij"), 5, 1, SV("abcde"), 1, 2, 4);
3111    test(S("abcdefghij"), 5, 1, SV("abcde"), 1, 3, 4);
3112    test(S("abcdefghij"), 5, 1, SV("abcde"), 1, 4, 4);
3113}
3114
3115template <class S, class SV>
3116void test29()
3117{
3118    test(S("abcdefghij"), 5, 1, SV("abcde"), 1, 5, 4);
3119    test(S("abcdefghij"), 5, 1, SV("abcde"), 2, 0, 1);
3120    test(S("abcdefghij"), 5, 1, SV("abcde"), 2, 1, 3);
3121    test(S("abcdefghij"), 5, 1, SV("abcde"), 2, 2, 3);
3122    test(S("abcdefghij"), 5, 1, SV("abcde"), 2, 3, 3);
3123    test(S("abcdefghij"), 5, 1, SV("abcde"), 2, 4, 3);
3124    test(S("abcdefghij"), 5, 1, SV("abcde"), 4, 0, 1);
3125    test(S("abcdefghij"), 5, 1, SV("abcde"), 4, 1, 1);
3126    test(S("abcdefghij"), 5, 1, SV("abcde"), 4, 2, 1);
3127    test(S("abcdefghij"), 5, 1, SV("abcde"), 5, 0, 1);
3128    test(S("abcdefghij"), 5, 1, SV("abcde"), 5, 1, 1);
3129    test(S("abcdefghij"), 5, 1, SV("abcde"), 6, 0, 0);
3130    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 0, 0, 1);
3131    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 0, 1, 5);
3132    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 0, 5, 5);
3133    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 0, 9, 5);
3134    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 0, 10, 5);
3135    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 0, 11, 5);
3136    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 1, 0, 1);
3137    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 1, 1, 4);
3138    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 1, 4, 4);
3139    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 1, 8, 4);
3140    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 1, 9, 4);
3141    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 1, 10, 4);
3142    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 5, 0, 1);
3143    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 5, 1, 0);
3144    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 5, 2, -1);
3145    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 5, 4, -3);
3146    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 5, 5, -4);
3147    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 5, 6, -4);
3148    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 9, 0, 1);
3149    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 9, 1, -4);
3150    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 9, 2, -4);
3151    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 10, 0, 1);
3152    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 10, 1, 1);
3153    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 11, 0, 0);
3154    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 0, 0, 1);
3155    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 0, 1, 5);
3156    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 0, 10, 5);
3157    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 0, 19, 5);
3158    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 0, 20, 5);
3159    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 0, 21, 5);
3160    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 1, 0, 1);
3161    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 1, 1, 4);
3162    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 1, 9, 4);
3163    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 1, 18, 4);
3164    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 1, 19, 4);
3165    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 1, 20, 4);
3166    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 10, 0, 1);
3167    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 10, 1, -5);
3168    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 10, 5, -5);
3169    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 10, 9, -5);
3170    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 10, 10, -5);
3171    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 10, 11, -5);
3172    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 19, 0, 1);
3173    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 19, 1, -14);
3174    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 19, 2, -14);
3175    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 20, 0, 1);
3176    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 20, 1, 1);
3177    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 21, 0, 0);
3178    test(S("abcdefghij"), 5, 2, SV(""), 0, 0, 2);
3179    test(S("abcdefghij"), 5, 2, SV(""), 0, 1, 2);
3180    test(S("abcdefghij"), 5, 2, SV(""), 1, 0, 0);
3181    test(S("abcdefghij"), 5, 2, SV("abcde"), 0, 0, 2);
3182    test(S("abcdefghij"), 5, 2, SV("abcde"), 0, 1, 5);
3183    test(S("abcdefghij"), 5, 2, SV("abcde"), 0, 2, 5);
3184    test(S("abcdefghij"), 5, 2, SV("abcde"), 0, 4, 5);
3185    test(S("abcdefghij"), 5, 2, SV("abcde"), 0, 5, 5);
3186    test(S("abcdefghij"), 5, 2, SV("abcde"), 0, 6, 5);
3187    test(S("abcdefghij"), 5, 2, SV("abcde"), 1, 0, 2);
3188    test(S("abcdefghij"), 5, 2, SV("abcde"), 1, 1, 4);
3189    test(S("abcdefghij"), 5, 2, SV("abcde"), 1, 2, 4);
3190    test(S("abcdefghij"), 5, 2, SV("abcde"), 1, 3, 4);
3191    test(S("abcdefghij"), 5, 2, SV("abcde"), 1, 4, 4);
3192    test(S("abcdefghij"), 5, 2, SV("abcde"), 1, 5, 4);
3193    test(S("abcdefghij"), 5, 2, SV("abcde"), 2, 0, 2);
3194    test(S("abcdefghij"), 5, 2, SV("abcde"), 2, 1, 3);
3195    test(S("abcdefghij"), 5, 2, SV("abcde"), 2, 2, 3);
3196    test(S("abcdefghij"), 5, 2, SV("abcde"), 2, 3, 3);
3197    test(S("abcdefghij"), 5, 2, SV("abcde"), 2, 4, 3);
3198    test(S("abcdefghij"), 5, 2, SV("abcde"), 4, 0, 2);
3199    test(S("abcdefghij"), 5, 2, SV("abcde"), 4, 1, 1);
3200    test(S("abcdefghij"), 5, 2, SV("abcde"), 4, 2, 1);
3201    test(S("abcdefghij"), 5, 2, SV("abcde"), 5, 0, 2);
3202    test(S("abcdefghij"), 5, 2, SV("abcde"), 5, 1, 2);
3203    test(S("abcdefghij"), 5, 2, SV("abcde"), 6, 0, 0);
3204    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 0, 0, 2);
3205    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 0, 1, 5);
3206    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 0, 5, 5);
3207    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 0, 9, 5);
3208    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 0, 10, 5);
3209    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 0, 11, 5);
3210    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 1, 0, 2);
3211    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 1, 1, 4);
3212    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 1, 4, 4);
3213    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 1, 8, 4);
3214    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 1, 9, 4);
3215    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 1, 10, 4);
3216    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 5, 0, 2);
3217    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 5, 1, 1);
3218}
3219
3220template <class S, class SV>
3221void test30()
3222{
3223    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 5, 2, 0);
3224    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 5, 4, -2);
3225    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 5, 5, -3);
3226    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 5, 6, -3);
3227    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 9, 0, 2);
3228    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 9, 1, -4);
3229    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 9, 2, -4);
3230    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 10, 0, 2);
3231    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 10, 1, 2);
3232    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 11, 0, 0);
3233    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 0, 0, 2);
3234    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 0, 1, 5);
3235    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 0, 10, 5);
3236    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 0, 19, 5);
3237    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 0, 20, 5);
3238    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 0, 21, 5);
3239    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 1, 0, 2);
3240    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 1, 1, 4);
3241    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 1, 9, 4);
3242    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 1, 18, 4);
3243    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 1, 19, 4);
3244    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 1, 20, 4);
3245    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 10, 0, 2);
3246    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 10, 1, -5);
3247    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 10, 5, -5);
3248    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 10, 9, -5);
3249    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 10, 10, -5);
3250    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 10, 11, -5);
3251    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 19, 0, 2);
3252    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 19, 1, -14);
3253    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 19, 2, -14);
3254    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 20, 0, 2);
3255    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 20, 1, 2);
3256    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 21, 0, 0);
3257    test(S("abcdefghij"), 5, 4, SV(""), 0, 0, 4);
3258    test(S("abcdefghij"), 5, 4, SV(""), 0, 1, 4);
3259    test(S("abcdefghij"), 5, 4, SV(""), 1, 0, 0);
3260    test(S("abcdefghij"), 5, 4, SV("abcde"), 0, 0, 4);
3261    test(S("abcdefghij"), 5, 4, SV("abcde"), 0, 1, 5);
3262    test(S("abcdefghij"), 5, 4, SV("abcde"), 0, 2, 5);
3263    test(S("abcdefghij"), 5, 4, SV("abcde"), 0, 4, 5);
3264    test(S("abcdefghij"), 5, 4, SV("abcde"), 0, 5, 5);
3265    test(S("abcdefghij"), 5, 4, SV("abcde"), 0, 6, 5);
3266    test(S("abcdefghij"), 5, 4, SV("abcde"), 1, 0, 4);
3267    test(S("abcdefghij"), 5, 4, SV("abcde"), 1, 1, 4);
3268    test(S("abcdefghij"), 5, 4, SV("abcde"), 1, 2, 4);
3269    test(S("abcdefghij"), 5, 4, SV("abcde"), 1, 3, 4);
3270    test(S("abcdefghij"), 5, 4, SV("abcde"), 1, 4, 4);
3271    test(S("abcdefghij"), 5, 4, SV("abcde"), 1, 5, 4);
3272    test(S("abcdefghij"), 5, 4, SV("abcde"), 2, 0, 4);
3273    test(S("abcdefghij"), 5, 4, SV("abcde"), 2, 1, 3);
3274    test(S("abcdefghij"), 5, 4, SV("abcde"), 2, 2, 3);
3275    test(S("abcdefghij"), 5, 4, SV("abcde"), 2, 3, 3);
3276    test(S("abcdefghij"), 5, 4, SV("abcde"), 2, 4, 3);
3277    test(S("abcdefghij"), 5, 4, SV("abcde"), 4, 0, 4);
3278    test(S("abcdefghij"), 5, 4, SV("abcde"), 4, 1, 1);
3279    test(S("abcdefghij"), 5, 4, SV("abcde"), 4, 2, 1);
3280    test(S("abcdefghij"), 5, 4, SV("abcde"), 5, 0, 4);
3281    test(S("abcdefghij"), 5, 4, SV("abcde"), 5, 1, 4);
3282    test(S("abcdefghij"), 5, 4, SV("abcde"), 6, 0, 0);
3283    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 0, 0, 4);
3284    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 0, 1, 5);
3285    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 0, 5, 5);
3286    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 0, 9, 5);
3287    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 0, 10, 5);
3288    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 0, 11, 5);
3289    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 1, 0, 4);
3290    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 1, 1, 4);
3291    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 1, 4, 4);
3292    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 1, 8, 4);
3293    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 1, 9, 4);
3294    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 1, 10, 4);
3295    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 5, 0, 4);
3296    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 5, 1, 3);
3297    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 5, 2, 2);
3298    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 5, 4, 0);
3299    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 5, 5, -1);
3300    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 5, 6, -1);
3301    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 9, 0, 4);
3302    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 9, 1, -4);
3303    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 9, 2, -4);
3304    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 10, 0, 4);
3305    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 10, 1, 4);
3306    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 11, 0, 0);
3307    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 0, 0, 4);
3308    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 0, 1, 5);
3309    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 0, 10, 5);
3310    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 0, 19, 5);
3311    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 0, 20, 5);
3312    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 0, 21, 5);
3313    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 1, 0, 4);
3314    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 1, 1, 4);
3315    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 1, 9, 4);
3316    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 1, 18, 4);
3317    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 1, 19, 4);
3318    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 1, 20, 4);
3319    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 10, 0, 4);
3320    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 10, 1, -5);
3321    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 10, 5, -5);
3322    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 10, 9, -5);
3323}
3324
3325template <class S, class SV>
3326void test31()
3327{
3328    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 10, 10, -5);
3329    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 10, 11, -5);
3330    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 19, 0, 4);
3331    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 19, 1, -14);
3332    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 19, 2, -14);
3333    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 20, 0, 4);
3334    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 20, 1, 4);
3335    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 21, 0, 0);
3336    test(S("abcdefghij"), 5, 5, SV(""), 0, 0, 5);
3337    test(S("abcdefghij"), 5, 5, SV(""), 0, 1, 5);
3338    test(S("abcdefghij"), 5, 5, SV(""), 1, 0, 0);
3339    test(S("abcdefghij"), 5, 5, SV("abcde"), 0, 0, 5);
3340    test(S("abcdefghij"), 5, 5, SV("abcde"), 0, 1, 5);
3341    test(S("abcdefghij"), 5, 5, SV("abcde"), 0, 2, 5);
3342    test(S("abcdefghij"), 5, 5, SV("abcde"), 0, 4, 5);
3343    test(S("abcdefghij"), 5, 5, SV("abcde"), 0, 5, 5);
3344    test(S("abcdefghij"), 5, 5, SV("abcde"), 0, 6, 5);
3345    test(S("abcdefghij"), 5, 5, SV("abcde"), 1, 0, 5);
3346    test(S("abcdefghij"), 5, 5, SV("abcde"), 1, 1, 4);
3347    test(S("abcdefghij"), 5, 5, SV("abcde"), 1, 2, 4);
3348    test(S("abcdefghij"), 5, 5, SV("abcde"), 1, 3, 4);
3349    test(S("abcdefghij"), 5, 5, SV("abcde"), 1, 4, 4);
3350    test(S("abcdefghij"), 5, 5, SV("abcde"), 1, 5, 4);
3351    test(S("abcdefghij"), 5, 5, SV("abcde"), 2, 0, 5);
3352    test(S("abcdefghij"), 5, 5, SV("abcde"), 2, 1, 3);
3353    test(S("abcdefghij"), 5, 5, SV("abcde"), 2, 2, 3);
3354    test(S("abcdefghij"), 5, 5, SV("abcde"), 2, 3, 3);
3355    test(S("abcdefghij"), 5, 5, SV("abcde"), 2, 4, 3);
3356    test(S("abcdefghij"), 5, 5, SV("abcde"), 4, 0, 5);
3357    test(S("abcdefghij"), 5, 5, SV("abcde"), 4, 1, 1);
3358    test(S("abcdefghij"), 5, 5, SV("abcde"), 4, 2, 1);
3359    test(S("abcdefghij"), 5, 5, SV("abcde"), 5, 0, 5);
3360    test(S("abcdefghij"), 5, 5, SV("abcde"), 5, 1, 5);
3361    test(S("abcdefghij"), 5, 5, SV("abcde"), 6, 0, 0);
3362    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 0, 0, 5);
3363    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 0, 1, 5);
3364    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 0, 5, 5);
3365    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 0, 9, 5);
3366    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 0, 10, 5);
3367    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 0, 11, 5);
3368    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 1, 0, 5);
3369    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 1, 1, 4);
3370    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 1, 4, 4);
3371    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 1, 8, 4);
3372    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 1, 9, 4);
3373    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 1, 10, 4);
3374    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 5, 0, 5);
3375    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 5, 1, 4);
3376    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 5, 2, 3);
3377    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 5, 4, 1);
3378    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 5, 5, 0);
3379    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 5, 6, 0);
3380    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 9, 0, 5);
3381    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 9, 1, -4);
3382    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 9, 2, -4);
3383    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 10, 0, 5);
3384    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 10, 1, 5);
3385    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 11, 0, 0);
3386    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 0, 0, 5);
3387    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 0, 1, 5);
3388    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 0, 10, 5);
3389    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 0, 19, 5);
3390    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 0, 20, 5);
3391    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 0, 21, 5);
3392    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 1, 0, 5);
3393    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 1, 1, 4);
3394    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 1, 9, 4);
3395    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 1, 18, 4);
3396    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 1, 19, 4);
3397    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 1, 20, 4);
3398    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 10, 0, 5);
3399    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 10, 1, -5);
3400    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 10, 5, -5);
3401    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 10, 9, -5);
3402    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 10, 10, -5);
3403    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 10, 11, -5);
3404    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 19, 0, 5);
3405    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 19, 1, -14);
3406    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 19, 2, -14);
3407    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 20, 0, 5);
3408    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 20, 1, 5);
3409    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 21, 0, 0);
3410    test(S("abcdefghij"), 5, 6, SV(""), 0, 0, 5);
3411    test(S("abcdefghij"), 5, 6, SV(""), 0, 1, 5);
3412    test(S("abcdefghij"), 5, 6, SV(""), 1, 0, 0);
3413    test(S("abcdefghij"), 5, 6, SV("abcde"), 0, 0, 5);
3414    test(S("abcdefghij"), 5, 6, SV("abcde"), 0, 1, 5);
3415    test(S("abcdefghij"), 5, 6, SV("abcde"), 0, 2, 5);
3416    test(S("abcdefghij"), 5, 6, SV("abcde"), 0, 4, 5);
3417    test(S("abcdefghij"), 5, 6, SV("abcde"), 0, 5, 5);
3418    test(S("abcdefghij"), 5, 6, SV("abcde"), 0, 6, 5);
3419    test(S("abcdefghij"), 5, 6, SV("abcde"), 1, 0, 5);
3420    test(S("abcdefghij"), 5, 6, SV("abcde"), 1, 1, 4);
3421    test(S("abcdefghij"), 5, 6, SV("abcde"), 1, 2, 4);
3422    test(S("abcdefghij"), 5, 6, SV("abcde"), 1, 3, 4);
3423    test(S("abcdefghij"), 5, 6, SV("abcde"), 1, 4, 4);
3424    test(S("abcdefghij"), 5, 6, SV("abcde"), 1, 5, 4);
3425    test(S("abcdefghij"), 5, 6, SV("abcde"), 2, 0, 5);
3426    test(S("abcdefghij"), 5, 6, SV("abcde"), 2, 1, 3);
3427    test(S("abcdefghij"), 5, 6, SV("abcde"), 2, 2, 3);
3428}
3429
3430template <class S, class SV>
3431void test32()
3432{
3433    test(S("abcdefghij"), 5, 6, SV("abcde"), 2, 3, 3);
3434    test(S("abcdefghij"), 5, 6, SV("abcde"), 2, 4, 3);
3435    test(S("abcdefghij"), 5, 6, SV("abcde"), 4, 0, 5);
3436    test(S("abcdefghij"), 5, 6, SV("abcde"), 4, 1, 1);
3437    test(S("abcdefghij"), 5, 6, SV("abcde"), 4, 2, 1);
3438    test(S("abcdefghij"), 5, 6, SV("abcde"), 5, 0, 5);
3439    test(S("abcdefghij"), 5, 6, SV("abcde"), 5, 1, 5);
3440    test(S("abcdefghij"), 5, 6, SV("abcde"), 6, 0, 0);
3441    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 0, 0, 5);
3442    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 0, 1, 5);
3443    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 0, 5, 5);
3444    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 0, 9, 5);
3445    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 0, 10, 5);
3446    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 0, 11, 5);
3447    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 1, 0, 5);
3448    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 1, 1, 4);
3449    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 1, 4, 4);
3450    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 1, 8, 4);
3451    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 1, 9, 4);
3452    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 1, 10, 4);
3453    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 5, 0, 5);
3454    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 5, 1, 4);
3455    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 5, 2, 3);
3456    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 5, 4, 1);
3457    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 5, 5, 0);
3458    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 5, 6, 0);
3459    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 9, 0, 5);
3460    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 9, 1, -4);
3461    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 9, 2, -4);
3462    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 10, 0, 5);
3463    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 10, 1, 5);
3464    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 11, 0, 0);
3465    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 0, 0, 5);
3466    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 0, 1, 5);
3467    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 0, 10, 5);
3468    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 0, 19, 5);
3469    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 0, 20, 5);
3470    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 0, 21, 5);
3471    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 1, 0, 5);
3472    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 1, 1, 4);
3473    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 1, 9, 4);
3474    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 1, 18, 4);
3475    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 1, 19, 4);
3476    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 1, 20, 4);
3477    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 10, 0, 5);
3478    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 10, 1, -5);
3479    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 10, 5, -5);
3480    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 10, 9, -5);
3481    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 10, 10, -5);
3482    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 10, 11, -5);
3483    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 19, 0, 5);
3484    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 19, 1, -14);
3485    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 19, 2, -14);
3486    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 20, 0, 5);
3487    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 20, 1, 5);
3488    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 21, 0, 0);
3489    test(S("abcdefghij"), 9, 0, SV(""), 0, 0, 0);
3490    test(S("abcdefghij"), 9, 0, SV(""), 0, 1, 0);
3491    test(S("abcdefghij"), 9, 0, SV(""), 1, 0, 0);
3492    test(S("abcdefghij"), 9, 0, SV("abcde"), 0, 0, 0);
3493    test(S("abcdefghij"), 9, 0, SV("abcde"), 0, 1, -1);
3494    test(S("abcdefghij"), 9, 0, SV("abcde"), 0, 2, -2);
3495    test(S("abcdefghij"), 9, 0, SV("abcde"), 0, 4, -4);
3496    test(S("abcdefghij"), 9, 0, SV("abcde"), 0, 5, -5);
3497    test(S("abcdefghij"), 9, 0, SV("abcde"), 0, 6, -5);
3498    test(S("abcdefghij"), 9, 0, SV("abcde"), 1, 0, 0);
3499    test(S("abcdefghij"), 9, 0, SV("abcde"), 1, 1, -1);
3500    test(S("abcdefghij"), 9, 0, SV("abcde"), 1, 2, -2);
3501    test(S("abcdefghij"), 9, 0, SV("abcde"), 1, 3, -3);
3502    test(S("abcdefghij"), 9, 0, SV("abcde"), 1, 4, -4);
3503    test(S("abcdefghij"), 9, 0, SV("abcde"), 1, 5, -4);
3504    test(S("abcdefghij"), 9, 0, SV("abcde"), 2, 0, 0);
3505    test(S("abcdefghij"), 9, 0, SV("abcde"), 2, 1, -1);
3506    test(S("abcdefghij"), 9, 0, SV("abcde"), 2, 2, -2);
3507    test(S("abcdefghij"), 9, 0, SV("abcde"), 2, 3, -3);
3508    test(S("abcdefghij"), 9, 0, SV("abcde"), 2, 4, -3);
3509    test(S("abcdefghij"), 9, 0, SV("abcde"), 4, 0, 0);
3510    test(S("abcdefghij"), 9, 0, SV("abcde"), 4, 1, -1);
3511    test(S("abcdefghij"), 9, 0, SV("abcde"), 4, 2, -1);
3512    test(S("abcdefghij"), 9, 0, SV("abcde"), 5, 0, 0);
3513    test(S("abcdefghij"), 9, 0, SV("abcde"), 5, 1, 0);
3514    test(S("abcdefghij"), 9, 0, SV("abcde"), 6, 0, 0);
3515    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 0, 0, 0);
3516    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 0, 1, -1);
3517    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 0, 5, -5);
3518    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 0, 9, -9);
3519    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 0, 10, -10);
3520    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 0, 11, -10);
3521    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 1, 0, 0);
3522    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 1, 1, -1);
3523    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 1, 4, -4);
3524    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 1, 8, -8);
3525    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 1, 9, -9);
3526    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 1, 10, -9);
3527    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 5, 0, 0);
3528    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 5, 1, -1);
3529    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 5, 2, -2);
3530    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 5, 4, -4);
3531    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 5, 5, -5);
3532    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 5, 6, -5);
3533}
3534
3535template <class S, class SV>
3536void test33()
3537{
3538    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 9, 0, 0);
3539    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 9, 1, -1);
3540    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 9, 2, -1);
3541    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 10, 0, 0);
3542    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 10, 1, 0);
3543    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), 11, 0, 0);
3544    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
3545    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 0, 1, -1);
3546    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 0, 10, -10);
3547    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 0, 19, -19);
3548    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 0, 20, -20);
3549    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 0, 21, -20);
3550    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
3551    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 1, 1, -1);
3552    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 1, 9, -9);
3553    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 1, 18, -18);
3554    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 1, 19, -19);
3555    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 1, 20, -19);
3556    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
3557    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 10, 1, -1);
3558    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 10, 5, -5);
3559    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 10, 9, -9);
3560    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 10, 10, -10);
3561    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 10, 11, -10);
3562    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
3563    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 19, 1, -1);
3564    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 19, 2, -1);
3565    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
3566    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
3567    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
3568    test(S("abcdefghij"), 9, 1, SV(""), 0, 0, 1);
3569    test(S("abcdefghij"), 9, 1, SV(""), 0, 1, 1);
3570    test(S("abcdefghij"), 9, 1, SV(""), 1, 0, 0);
3571    test(S("abcdefghij"), 9, 1, SV("abcde"), 0, 0, 1);
3572    test(S("abcdefghij"), 9, 1, SV("abcde"), 0, 1, 9);
3573    test(S("abcdefghij"), 9, 1, SV("abcde"), 0, 2, 9);
3574    test(S("abcdefghij"), 9, 1, SV("abcde"), 0, 4, 9);
3575    test(S("abcdefghij"), 9, 1, SV("abcde"), 0, 5, 9);
3576    test(S("abcdefghij"), 9, 1, SV("abcde"), 0, 6, 9);
3577    test(S("abcdefghij"), 9, 1, SV("abcde"), 1, 0, 1);
3578    test(S("abcdefghij"), 9, 1, SV("abcde"), 1, 1, 8);
3579    test(S("abcdefghij"), 9, 1, SV("abcde"), 1, 2, 8);
3580    test(S("abcdefghij"), 9, 1, SV("abcde"), 1, 3, 8);
3581    test(S("abcdefghij"), 9, 1, SV("abcde"), 1, 4, 8);
3582    test(S("abcdefghij"), 9, 1, SV("abcde"), 1, 5, 8);
3583    test(S("abcdefghij"), 9, 1, SV("abcde"), 2, 0, 1);
3584    test(S("abcdefghij"), 9, 1, SV("abcde"), 2, 1, 7);
3585    test(S("abcdefghij"), 9, 1, SV("abcde"), 2, 2, 7);
3586    test(S("abcdefghij"), 9, 1, SV("abcde"), 2, 3, 7);
3587    test(S("abcdefghij"), 9, 1, SV("abcde"), 2, 4, 7);
3588    test(S("abcdefghij"), 9, 1, SV("abcde"), 4, 0, 1);
3589    test(S("abcdefghij"), 9, 1, SV("abcde"), 4, 1, 5);
3590    test(S("abcdefghij"), 9, 1, SV("abcde"), 4, 2, 5);
3591    test(S("abcdefghij"), 9, 1, SV("abcde"), 5, 0, 1);
3592    test(S("abcdefghij"), 9, 1, SV("abcde"), 5, 1, 1);
3593    test(S("abcdefghij"), 9, 1, SV("abcde"), 6, 0, 0);
3594    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 0, 0, 1);
3595    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 0, 1, 9);
3596    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 0, 5, 9);
3597    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 0, 9, 9);
3598    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 0, 10, 9);
3599    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 0, 11, 9);
3600    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 1, 0, 1);
3601    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 1, 1, 8);
3602    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 1, 4, 8);
3603    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 1, 8, 8);
3604    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 1, 9, 8);
3605    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 1, 10, 8);
3606    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 5, 0, 1);
3607    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 5, 1, 4);
3608    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 5, 2, 4);
3609    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 5, 4, 4);
3610    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 5, 5, 4);
3611    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 5, 6, 4);
3612    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 9, 0, 1);
3613    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 9, 1, 0);
3614    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 9, 2, 0);
3615    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 10, 0, 1);
3616    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 10, 1, 1);
3617    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 11, 0, 0);
3618    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 0, 0, 1);
3619    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 0, 1, 9);
3620    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 0, 10, 9);
3621    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 0, 19, 9);
3622    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 0, 20, 9);
3623    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 0, 21, 9);
3624    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 1, 0, 1);
3625    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 1, 1, 8);
3626    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 1, 9, 8);
3627    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 1, 18, 8);
3628    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 1, 19, 8);
3629    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 1, 20, 8);
3630    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 10, 0, 1);
3631    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 10, 1, -1);
3632    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 10, 5, -1);
3633    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 10, 9, -1);
3634    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 10, 10, -1);
3635    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 10, 11, -1);
3636    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 19, 0, 1);
3637    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 19, 1, -10);
3638}
3639
3640template <class S, class SV>
3641void test34()
3642{
3643    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 19, 2, -10);
3644    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 20, 0, 1);
3645    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 20, 1, 1);
3646    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 21, 0, 0);
3647    test(S("abcdefghij"), 9, 2, SV(""), 0, 0, 1);
3648    test(S("abcdefghij"), 9, 2, SV(""), 0, 1, 1);
3649    test(S("abcdefghij"), 9, 2, SV(""), 1, 0, 0);
3650    test(S("abcdefghij"), 9, 2, SV("abcde"), 0, 0, 1);
3651    test(S("abcdefghij"), 9, 2, SV("abcde"), 0, 1, 9);
3652    test(S("abcdefghij"), 9, 2, SV("abcde"), 0, 2, 9);
3653    test(S("abcdefghij"), 9, 2, SV("abcde"), 0, 4, 9);
3654    test(S("abcdefghij"), 9, 2, SV("abcde"), 0, 5, 9);
3655    test(S("abcdefghij"), 9, 2, SV("abcde"), 0, 6, 9);
3656    test(S("abcdefghij"), 9, 2, SV("abcde"), 1, 0, 1);
3657    test(S("abcdefghij"), 9, 2, SV("abcde"), 1, 1, 8);
3658    test(S("abcdefghij"), 9, 2, SV("abcde"), 1, 2, 8);
3659    test(S("abcdefghij"), 9, 2, SV("abcde"), 1, 3, 8);
3660    test(S("abcdefghij"), 9, 2, SV("abcde"), 1, 4, 8);
3661    test(S("abcdefghij"), 9, 2, SV("abcde"), 1, 5, 8);
3662    test(S("abcdefghij"), 9, 2, SV("abcde"), 2, 0, 1);
3663    test(S("abcdefghij"), 9, 2, SV("abcde"), 2, 1, 7);
3664    test(S("abcdefghij"), 9, 2, SV("abcde"), 2, 2, 7);
3665    test(S("abcdefghij"), 9, 2, SV("abcde"), 2, 3, 7);
3666    test(S("abcdefghij"), 9, 2, SV("abcde"), 2, 4, 7);
3667    test(S("abcdefghij"), 9, 2, SV("abcde"), 4, 0, 1);
3668    test(S("abcdefghij"), 9, 2, SV("abcde"), 4, 1, 5);
3669    test(S("abcdefghij"), 9, 2, SV("abcde"), 4, 2, 5);
3670    test(S("abcdefghij"), 9, 2, SV("abcde"), 5, 0, 1);
3671    test(S("abcdefghij"), 9, 2, SV("abcde"), 5, 1, 1);
3672    test(S("abcdefghij"), 9, 2, SV("abcde"), 6, 0, 0);
3673    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 0, 0, 1);
3674    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 0, 1, 9);
3675    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 0, 5, 9);
3676    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 0, 9, 9);
3677    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 0, 10, 9);
3678    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 0, 11, 9);
3679    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 1, 0, 1);
3680    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 1, 1, 8);
3681    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 1, 4, 8);
3682    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 1, 8, 8);
3683    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 1, 9, 8);
3684    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 1, 10, 8);
3685    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 5, 0, 1);
3686    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 5, 1, 4);
3687    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 5, 2, 4);
3688    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 5, 4, 4);
3689    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 5, 5, 4);
3690    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 5, 6, 4);
3691    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 9, 0, 1);
3692    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 9, 1, 0);
3693    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 9, 2, 0);
3694    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 10, 0, 1);
3695    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 10, 1, 1);
3696    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 11, 0, 0);
3697    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 0, 0, 1);
3698    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 0, 1, 9);
3699    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 0, 10, 9);
3700    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 0, 19, 9);
3701    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 0, 20, 9);
3702    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 0, 21, 9);
3703    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 1, 0, 1);
3704    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 1, 1, 8);
3705    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 1, 9, 8);
3706    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 1, 18, 8);
3707    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 1, 19, 8);
3708    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 1, 20, 8);
3709    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 10, 0, 1);
3710    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 10, 1, -1);
3711    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 10, 5, -1);
3712    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 10, 9, -1);
3713    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 10, 10, -1);
3714    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 10, 11, -1);
3715    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 19, 0, 1);
3716    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 19, 1, -10);
3717    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 19, 2, -10);
3718    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 20, 0, 1);
3719    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 20, 1, 1);
3720    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 21, 0, 0);
3721    test(S("abcdefghij"), 10, 0, SV(""), 0, 0, 0);
3722    test(S("abcdefghij"), 10, 0, SV(""), 0, 1, 0);
3723    test(S("abcdefghij"), 10, 0, SV(""), 1, 0, 0);
3724    test(S("abcdefghij"), 10, 0, SV("abcde"), 0, 0, 0);
3725    test(S("abcdefghij"), 10, 0, SV("abcde"), 0, 1, -1);
3726    test(S("abcdefghij"), 10, 0, SV("abcde"), 0, 2, -2);
3727    test(S("abcdefghij"), 10, 0, SV("abcde"), 0, 4, -4);
3728    test(S("abcdefghij"), 10, 0, SV("abcde"), 0, 5, -5);
3729    test(S("abcdefghij"), 10, 0, SV("abcde"), 0, 6, -5);
3730    test(S("abcdefghij"), 10, 0, SV("abcde"), 1, 0, 0);
3731    test(S("abcdefghij"), 10, 0, SV("abcde"), 1, 1, -1);
3732    test(S("abcdefghij"), 10, 0, SV("abcde"), 1, 2, -2);
3733    test(S("abcdefghij"), 10, 0, SV("abcde"), 1, 3, -3);
3734    test(S("abcdefghij"), 10, 0, SV("abcde"), 1, 4, -4);
3735    test(S("abcdefghij"), 10, 0, SV("abcde"), 1, 5, -4);
3736    test(S("abcdefghij"), 10, 0, SV("abcde"), 2, 0, 0);
3737    test(S("abcdefghij"), 10, 0, SV("abcde"), 2, 1, -1);
3738    test(S("abcdefghij"), 10, 0, SV("abcde"), 2, 2, -2);
3739    test(S("abcdefghij"), 10, 0, SV("abcde"), 2, 3, -3);
3740    test(S("abcdefghij"), 10, 0, SV("abcde"), 2, 4, -3);
3741    test(S("abcdefghij"), 10, 0, SV("abcde"), 4, 0, 0);
3742    test(S("abcdefghij"), 10, 0, SV("abcde"), 4, 1, -1);
3743}
3744
3745template <class S, class SV>
3746void test35()
3747{
3748    test(S("abcdefghij"), 10, 0, SV("abcde"), 4, 2, -1);
3749    test(S("abcdefghij"), 10, 0, SV("abcde"), 5, 0, 0);
3750    test(S("abcdefghij"), 10, 0, SV("abcde"), 5, 1, 0);
3751    test(S("abcdefghij"), 10, 0, SV("abcde"), 6, 0, 0);
3752    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 0, 0, 0);
3753    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 0, 1, -1);
3754    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 0, 5, -5);
3755    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 0, 9, -9);
3756    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 0, 10, -10);
3757    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 0, 11, -10);
3758    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 1, 0, 0);
3759    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 1, 1, -1);
3760    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 1, 4, -4);
3761    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 1, 8, -8);
3762    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 1, 9, -9);
3763    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 1, 10, -9);
3764    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 5, 0, 0);
3765    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 5, 1, -1);
3766    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 5, 2, -2);
3767    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 5, 4, -4);
3768    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 5, 5, -5);
3769    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 5, 6, -5);
3770    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 9, 0, 0);
3771    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 9, 1, -1);
3772    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 9, 2, -1);
3773    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 10, 0, 0);
3774    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 10, 1, 0);
3775    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), 11, 0, 0);
3776    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
3777    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 0, 1, -1);
3778    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 0, 10, -10);
3779    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 0, 19, -19);
3780    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 0, 20, -20);
3781    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 0, 21, -20);
3782    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
3783    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 1, 1, -1);
3784    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 1, 9, -9);
3785    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 1, 18, -18);
3786    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 1, 19, -19);
3787    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 1, 20, -19);
3788    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
3789    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 10, 1, -1);
3790    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 10, 5, -5);
3791    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 10, 9, -9);
3792    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 10, 10, -10);
3793    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 10, 11, -10);
3794    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
3795    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 19, 1, -1);
3796    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 19, 2, -1);
3797    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
3798    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
3799    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
3800    test(S("abcdefghij"), 10, 1, SV(""), 0, 0, 0);
3801    test(S("abcdefghij"), 10, 1, SV(""), 0, 1, 0);
3802    test(S("abcdefghij"), 10, 1, SV(""), 1, 0, 0);
3803    test(S("abcdefghij"), 10, 1, SV("abcde"), 0, 0, 0);
3804    test(S("abcdefghij"), 10, 1, SV("abcde"), 0, 1, -1);
3805    test(S("abcdefghij"), 10, 1, SV("abcde"), 0, 2, -2);
3806    test(S("abcdefghij"), 10, 1, SV("abcde"), 0, 4, -4);
3807    test(S("abcdefghij"), 10, 1, SV("abcde"), 0, 5, -5);
3808    test(S("abcdefghij"), 10, 1, SV("abcde"), 0, 6, -5);
3809    test(S("abcdefghij"), 10, 1, SV("abcde"), 1, 0, 0);
3810    test(S("abcdefghij"), 10, 1, SV("abcde"), 1, 1, -1);
3811    test(S("abcdefghij"), 10, 1, SV("abcde"), 1, 2, -2);
3812    test(S("abcdefghij"), 10, 1, SV("abcde"), 1, 3, -3);
3813    test(S("abcdefghij"), 10, 1, SV("abcde"), 1, 4, -4);
3814    test(S("abcdefghij"), 10, 1, SV("abcde"), 1, 5, -4);
3815    test(S("abcdefghij"), 10, 1, SV("abcde"), 2, 0, 0);
3816    test(S("abcdefghij"), 10, 1, SV("abcde"), 2, 1, -1);
3817    test(S("abcdefghij"), 10, 1, SV("abcde"), 2, 2, -2);
3818    test(S("abcdefghij"), 10, 1, SV("abcde"), 2, 3, -3);
3819    test(S("abcdefghij"), 10, 1, SV("abcde"), 2, 4, -3);
3820    test(S("abcdefghij"), 10, 1, SV("abcde"), 4, 0, 0);
3821    test(S("abcdefghij"), 10, 1, SV("abcde"), 4, 1, -1);
3822    test(S("abcdefghij"), 10, 1, SV("abcde"), 4, 2, -1);
3823    test(S("abcdefghij"), 10, 1, SV("abcde"), 5, 0, 0);
3824    test(S("abcdefghij"), 10, 1, SV("abcde"), 5, 1, 0);
3825    test(S("abcdefghij"), 10, 1, SV("abcde"), 6, 0, 0);
3826    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 0, 0, 0);
3827    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 0, 1, -1);
3828    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 0, 5, -5);
3829    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 0, 9, -9);
3830    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 0, 10, -10);
3831    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 0, 11, -10);
3832    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 1, 0, 0);
3833    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 1, 1, -1);
3834    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 1, 4, -4);
3835    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 1, 8, -8);
3836    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 1, 9, -9);
3837    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 1, 10, -9);
3838    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 5, 0, 0);
3839    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 5, 1, -1);
3840    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 5, 2, -2);
3841    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 5, 4, -4);
3842    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 5, 5, -5);
3843    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 5, 6, -5);
3844    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 9, 0, 0);
3845    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 9, 1, -1);
3846    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 9, 2, -1);
3847    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 10, 0, 0);
3848}
3849
3850template <class S, class SV>
3851void test36()
3852{
3853    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 10, 1, 0);
3854    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), 11, 0, 0);
3855    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 0, 0, 0);
3856    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 0, 1, -1);
3857    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 0, 10, -10);
3858    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 0, 19, -19);
3859    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 0, 20, -20);
3860    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 0, 21, -20);
3861    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 1, 0, 0);
3862    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 1, 1, -1);
3863    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 1, 9, -9);
3864    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 1, 18, -18);
3865    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 1, 19, -19);
3866    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 1, 20, -19);
3867    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 10, 0, 0);
3868    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 10, 1, -1);
3869    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 10, 5, -5);
3870    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 10, 9, -9);
3871    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 10, 10, -10);
3872    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 10, 11, -10);
3873    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 19, 0, 0);
3874    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 19, 1, -1);
3875    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 19, 2, -1);
3876    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 20, 0, 0);
3877    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 20, 1, 0);
3878    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), 21, 0, 0);
3879    test(S("abcdefghij"), 11, 0, SV(""), 0, 0, 0);
3880    test(S("abcdefghij"), 11, 0, SV(""), 0, 1, 0);
3881    test(S("abcdefghij"), 11, 0, SV(""), 1, 0, 0);
3882    test(S("abcdefghij"), 11, 0, SV("abcde"), 0, 0, 0);
3883    test(S("abcdefghij"), 11, 0, SV("abcde"), 0, 1, 0);
3884    test(S("abcdefghij"), 11, 0, SV("abcde"), 0, 2, 0);
3885    test(S("abcdefghij"), 11, 0, SV("abcde"), 0, 4, 0);
3886    test(S("abcdefghij"), 11, 0, SV("abcde"), 0, 5, 0);
3887    test(S("abcdefghij"), 11, 0, SV("abcde"), 0, 6, 0);
3888    test(S("abcdefghij"), 11, 0, SV("abcde"), 1, 0, 0);
3889    test(S("abcdefghij"), 11, 0, SV("abcde"), 1, 1, 0);
3890    test(S("abcdefghij"), 11, 0, SV("abcde"), 1, 2, 0);
3891    test(S("abcdefghij"), 11, 0, SV("abcde"), 1, 3, 0);
3892    test(S("abcdefghij"), 11, 0, SV("abcde"), 1, 4, 0);
3893    test(S("abcdefghij"), 11, 0, SV("abcde"), 1, 5, 0);
3894    test(S("abcdefghij"), 11, 0, SV("abcde"), 2, 0, 0);
3895    test(S("abcdefghij"), 11, 0, SV("abcde"), 2, 1, 0);
3896    test(S("abcdefghij"), 11, 0, SV("abcde"), 2, 2, 0);
3897    test(S("abcdefghij"), 11, 0, SV("abcde"), 2, 3, 0);
3898    test(S("abcdefghij"), 11, 0, SV("abcde"), 2, 4, 0);
3899    test(S("abcdefghij"), 11, 0, SV("abcde"), 4, 0, 0);
3900    test(S("abcdefghij"), 11, 0, SV("abcde"), 4, 1, 0);
3901    test(S("abcdefghij"), 11, 0, SV("abcde"), 4, 2, 0);
3902    test(S("abcdefghij"), 11, 0, SV("abcde"), 5, 0, 0);
3903    test(S("abcdefghij"), 11, 0, SV("abcde"), 5, 1, 0);
3904    test(S("abcdefghij"), 11, 0, SV("abcde"), 6, 0, 0);
3905    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 0, 0, 0);
3906    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 0, 1, 0);
3907    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 0, 5, 0);
3908    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 0, 9, 0);
3909    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 0, 10, 0);
3910    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 0, 11, 0);
3911    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 1, 0, 0);
3912    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 1, 1, 0);
3913    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 1, 4, 0);
3914    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 1, 8, 0);
3915    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 1, 9, 0);
3916    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 1, 10, 0);
3917    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 5, 0, 0);
3918    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 5, 1, 0);
3919    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 5, 2, 0);
3920    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 5, 4, 0);
3921    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 5, 5, 0);
3922    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 5, 6, 0);
3923    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 9, 0, 0);
3924    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 9, 1, 0);
3925    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 9, 2, 0);
3926    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 10, 0, 0);
3927    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 10, 1, 0);
3928    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 11, 0, 0);
3929    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
3930    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 0, 1, 0);
3931    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 0, 10, 0);
3932    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 0, 19, 0);
3933    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 0, 20, 0);
3934    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 0, 21, 0);
3935    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
3936    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 1, 1, 0);
3937    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 1, 9, 0);
3938    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 1, 18, 0);
3939    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 1, 19, 0);
3940    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 1, 20, 0);
3941    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
3942    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 10, 1, 0);
3943    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 10, 5, 0);
3944    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 10, 9, 0);
3945    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 10, 10, 0);
3946    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 10, 11, 0);
3947    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
3948    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 19, 1, 0);
3949    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 19, 2, 0);
3950    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
3951    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
3952    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
3953}
3954
3955template <class S, class SV>
3956void test37()
3957{
3958    test(S("abcdefghijklmnopqrst"), 0, 0, SV(""), 0, 0, 0);
3959    test(S("abcdefghijklmnopqrst"), 0, 0, SV(""), 0, 1, 0);
3960    test(S("abcdefghijklmnopqrst"), 0, 0, SV(""), 1, 0, 0);
3961    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 0, 0, 0);
3962    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 0, 1, -1);
3963    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 0, 2, -2);
3964    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 0, 4, -4);
3965    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 0, 5, -5);
3966    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 0, 6, -5);
3967    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 1, 0, 0);
3968    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 1, 1, -1);
3969    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 1, 2, -2);
3970    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 1, 3, -3);
3971    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 1, 4, -4);
3972    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 1, 5, -4);
3973    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 2, 0, 0);
3974    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 2, 1, -1);
3975    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 2, 2, -2);
3976    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 2, 3, -3);
3977    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 2, 4, -3);
3978    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 4, 0, 0);
3979    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 4, 1, -1);
3980    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 4, 2, -1);
3981    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 5, 0, 0);
3982    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 5, 1, 0);
3983    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), 6, 0, 0);
3984    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 0, 0, 0);
3985    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 0, 1, -1);
3986    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 0, 5, -5);
3987    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 0, 9, -9);
3988    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 0, 10, -10);
3989    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 0, 11, -10);
3990    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 1, 0, 0);
3991    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 1, 1, -1);
3992    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 1, 4, -4);
3993    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 1, 8, -8);
3994    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 1, 9, -9);
3995    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 1, 10, -9);
3996    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 5, 0, 0);
3997    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 5, 1, -1);
3998    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 5, 2, -2);
3999    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 5, 4, -4);
4000    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 5, 5, -5);
4001    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 5, 6, -5);
4002    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 9, 0, 0);
4003    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 9, 1, -1);
4004    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 9, 2, -1);
4005    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 10, 0, 0);
4006    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 10, 1, 0);
4007    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), 11, 0, 0);
4008    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
4009    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 1, -1);
4010    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 10, -10);
4011    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 19, -19);
4012    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 20, -20);
4013    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 0, 21, -20);
4014    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
4015    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 1, -1);
4016    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 9, -9);
4017    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 18, -18);
4018    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 19, -19);
4019    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 1, 20, -19);
4020    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
4021    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 1, -1);
4022    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 5, -5);
4023    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 9, -9);
4024    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 10, -10);
4025    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 10, 11, -10);
4026    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
4027    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 19, 1, -1);
4028    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 19, 2, -1);
4029    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
4030    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
4031    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
4032    test(S("abcdefghijklmnopqrst"), 0, 1, SV(""), 0, 0, 1);
4033    test(S("abcdefghijklmnopqrst"), 0, 1, SV(""), 0, 1, 1);
4034    test(S("abcdefghijklmnopqrst"), 0, 1, SV(""), 1, 0, 0);
4035    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 0, 0, 1);
4036    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 0, 1, 0);
4037    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 0, 2, -1);
4038    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 0, 4, -3);
4039    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 0, 5, -4);
4040    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 0, 6, -4);
4041    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 1, 0, 1);
4042    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 1, 1, -1);
4043    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 1, 2, -1);
4044    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 1, 3, -1);
4045    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 1, 4, -1);
4046    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 1, 5, -1);
4047    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 2, 0, 1);
4048    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 2, 1, -2);
4049    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 2, 2, -2);
4050    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 2, 3, -2);
4051    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 2, 4, -2);
4052    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 4, 0, 1);
4053    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 4, 1, -4);
4054    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 4, 2, -4);
4055    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 5, 0, 1);
4056    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 5, 1, 1);
4057    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), 6, 0, 0);
4058}
4059
4060template <class S, class SV>
4061void test38()
4062{
4063    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 0, 0, 1);
4064    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 0, 1, 0);
4065    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 0, 5, -4);
4066    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 0, 9, -8);
4067    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 0, 10, -9);
4068    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 0, 11, -9);
4069    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 1, 0, 1);
4070    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 1, 1, -1);
4071    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 1, 4, -1);
4072    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 1, 8, -1);
4073    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 1, 9, -1);
4074    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 1, 10, -1);
4075    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 5, 0, 1);
4076    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 5, 1, -5);
4077    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 5, 2, -5);
4078    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 5, 4, -5);
4079    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 5, 5, -5);
4080    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 5, 6, -5);
4081    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 9, 0, 1);
4082    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 9, 1, -9);
4083    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 9, 2, -9);
4084    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 10, 0, 1);
4085    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 10, 1, 1);
4086    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), 11, 0, 0);
4087    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 0, 1);
4088    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 1, 0);
4089    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 10, -9);
4090    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 19, -18);
4091    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 20, -19);
4092    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 0, 21, -19);
4093    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 0, 1);
4094    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 1, -1);
4095    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 9, -1);
4096    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 18, -1);
4097    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 19, -1);
4098    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 1, 20, -1);
4099    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 0, 1);
4100    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 1, -10);
4101    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 5, -10);
4102    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 9, -10);
4103    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 10, -10);
4104    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 10, 11, -10);
4105    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 19, 0, 1);
4106    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 19, 1, -19);
4107    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 19, 2, -19);
4108    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 20, 0, 1);
4109    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 20, 1, 1);
4110    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), 21, 0, 0);
4111    test(S("abcdefghijklmnopqrst"), 0, 10, SV(""), 0, 0, 10);
4112    test(S("abcdefghijklmnopqrst"), 0, 10, SV(""), 0, 1, 10);
4113    test(S("abcdefghijklmnopqrst"), 0, 10, SV(""), 1, 0, 0);
4114    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 0, 0, 10);
4115    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 0, 1, 9);
4116    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 0, 2, 8);
4117    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 0, 4, 6);
4118    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 0, 5, 5);
4119    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 0, 6, 5);
4120    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 1, 0, 10);
4121    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 1, 1, -1);
4122    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 1, 2, -1);
4123    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 1, 3, -1);
4124    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 1, 4, -1);
4125    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 1, 5, -1);
4126    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 2, 0, 10);
4127    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 2, 1, -2);
4128    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 2, 2, -2);
4129    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 2, 3, -2);
4130    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 2, 4, -2);
4131    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 4, 0, 10);
4132    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 4, 1, -4);
4133    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 4, 2, -4);
4134    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 5, 0, 10);
4135    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 5, 1, 10);
4136    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 6, 0, 0);
4137    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 0, 0, 10);
4138    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 0, 1, 9);
4139    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 0, 5, 5);
4140    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 0, 9, 1);
4141    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 0, 10, 0);
4142    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 0, 11, 0);
4143    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 1, 0, 10);
4144    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 1, 1, -1);
4145    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 1, 4, -1);
4146    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 1, 8, -1);
4147    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 1, 9, -1);
4148    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 1, 10, -1);
4149    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 5, 0, 10);
4150    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 5, 1, -5);
4151    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 5, 2, -5);
4152    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 5, 4, -5);
4153    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 5, 5, -5);
4154    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 5, 6, -5);
4155    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 9, 0, 10);
4156    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 9, 1, -9);
4157    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 9, 2, -9);
4158    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 10, 0, 10);
4159    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 10, 1, 10);
4160    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 11, 0, 0);
4161    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 0, 0, 10);
4162    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 0, 1, 9);
4163}
4164
4165template <class S, class SV>
4166void test39()
4167{
4168    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 0, 10, 0);
4169    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 0, 19, -9);
4170    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 0, 20, -10);
4171    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 0, 21, -10);
4172    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 1, 0, 10);
4173    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 1, 1, -1);
4174    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 1, 9, -1);
4175    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 1, 18, -1);
4176    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 1, 19, -1);
4177    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 1, 20, -1);
4178    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 10, 0, 10);
4179    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 10, 1, -10);
4180    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 10, 5, -10);
4181    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 10, 9, -10);
4182    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 10, 10, -10);
4183    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 10, 11, -10);
4184    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 19, 0, 10);
4185    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 19, 1, -19);
4186    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 19, 2, -19);
4187    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 20, 0, 10);
4188    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 20, 1, 10);
4189    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), 21, 0, 0);
4190    test(S("abcdefghijklmnopqrst"), 0, 19, SV(""), 0, 0, 19);
4191    test(S("abcdefghijklmnopqrst"), 0, 19, SV(""), 0, 1, 19);
4192    test(S("abcdefghijklmnopqrst"), 0, 19, SV(""), 1, 0, 0);
4193    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 0, 0, 19);
4194    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 0, 1, 18);
4195    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 0, 2, 17);
4196    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 0, 4, 15);
4197    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 0, 5, 14);
4198    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 0, 6, 14);
4199    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 1, 0, 19);
4200    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 1, 1, -1);
4201    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 1, 2, -1);
4202    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 1, 3, -1);
4203    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 1, 4, -1);
4204    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 1, 5, -1);
4205    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 2, 0, 19);
4206    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 2, 1, -2);
4207    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 2, 2, -2);
4208    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 2, 3, -2);
4209    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 2, 4, -2);
4210    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 4, 0, 19);
4211    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 4, 1, -4);
4212    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 4, 2, -4);
4213    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 5, 0, 19);
4214    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 5, 1, 19);
4215    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 6, 0, 0);
4216    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 0, 0, 19);
4217    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 0, 1, 18);
4218    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 0, 5, 14);
4219    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 0, 9, 10);
4220    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 0, 10, 9);
4221    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 0, 11, 9);
4222    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 1, 0, 19);
4223    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 1, 1, -1);
4224    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 1, 4, -1);
4225    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 1, 8, -1);
4226    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 1, 9, -1);
4227    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 1, 10, -1);
4228    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 5, 0, 19);
4229    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 5, 1, -5);
4230    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 5, 2, -5);
4231    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 5, 4, -5);
4232    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 5, 5, -5);
4233    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 5, 6, -5);
4234    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 9, 0, 19);
4235    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 9, 1, -9);
4236    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 9, 2, -9);
4237    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 10, 0, 19);
4238    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 10, 1, 19);
4239    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 11, 0, 0);
4240    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 0, 0, 19);
4241    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 0, 1, 18);
4242    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 0, 10, 9);
4243    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 0, 19, 0);
4244    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 0, 20, -1);
4245    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 0, 21, -1);
4246    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 1, 0, 19);
4247    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 1, 1, -1);
4248    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 1, 9, -1);
4249    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 1, 18, -1);
4250    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 1, 19, -1);
4251    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 1, 20, -1);
4252    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 10, 0, 19);
4253    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 10, 1, -10);
4254    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 10, 5, -10);
4255    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 10, 9, -10);
4256    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 10, 10, -10);
4257    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 10, 11, -10);
4258    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 19, 0, 19);
4259    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 19, 1, -19);
4260    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 19, 2, -19);
4261    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 20, 0, 19);
4262    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 20, 1, 19);
4263    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), 21, 0, 0);
4264    test(S("abcdefghijklmnopqrst"), 0, 20, SV(""), 0, 0, 20);
4265    test(S("abcdefghijklmnopqrst"), 0, 20, SV(""), 0, 1, 20);
4266    test(S("abcdefghijklmnopqrst"), 0, 20, SV(""), 1, 0, 0);
4267    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 0, 0, 20);
4268}
4269
4270template <class S, class SV>
4271void test40()
4272{
4273    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 0, 1, 19);
4274    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 0, 2, 18);
4275    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 0, 4, 16);
4276    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 0, 5, 15);
4277    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 0, 6, 15);
4278    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 1, 0, 20);
4279    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 1, 1, -1);
4280    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 1, 2, -1);
4281    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 1, 3, -1);
4282    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 1, 4, -1);
4283    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 1, 5, -1);
4284    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 2, 0, 20);
4285    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 2, 1, -2);
4286    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 2, 2, -2);
4287    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 2, 3, -2);
4288    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 2, 4, -2);
4289    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 4, 0, 20);
4290    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 4, 1, -4);
4291    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 4, 2, -4);
4292    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 5, 0, 20);
4293    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 5, 1, 20);
4294    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 6, 0, 0);
4295    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 0, 0, 20);
4296    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 0, 1, 19);
4297    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 0, 5, 15);
4298    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 0, 9, 11);
4299    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 0, 10, 10);
4300    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 0, 11, 10);
4301    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 1, 0, 20);
4302    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 1, 1, -1);
4303    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 1, 4, -1);
4304    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 1, 8, -1);
4305    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 1, 9, -1);
4306    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 1, 10, -1);
4307    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 5, 0, 20);
4308    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 5, 1, -5);
4309    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 5, 2, -5);
4310    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 5, 4, -5);
4311    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 5, 5, -5);
4312    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 5, 6, -5);
4313    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 9, 0, 20);
4314    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 9, 1, -9);
4315    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 9, 2, -9);
4316    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 10, 0, 20);
4317    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 10, 1, 20);
4318    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 11, 0, 0);
4319    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 0, 0, 20);
4320    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 0, 1, 19);
4321    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 0, 10, 10);
4322    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 0, 19, 1);
4323    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 0, 20, 0);
4324    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 0, 21, 0);
4325    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 1, 0, 20);
4326    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 1, 1, -1);
4327    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 1, 9, -1);
4328    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 1, 18, -1);
4329    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 1, 19, -1);
4330    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 1, 20, -1);
4331    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 10, 0, 20);
4332    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 10, 1, -10);
4333    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 10, 5, -10);
4334    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 10, 9, -10);
4335    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 10, 10, -10);
4336    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 10, 11, -10);
4337    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 19, 0, 20);
4338    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 19, 1, -19);
4339    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 19, 2, -19);
4340    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 20, 0, 20);
4341    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 20, 1, 20);
4342    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 21, 0, 0);
4343    test(S("abcdefghijklmnopqrst"), 0, 21, SV(""), 0, 0, 20);
4344    test(S("abcdefghijklmnopqrst"), 0, 21, SV(""), 0, 1, 20);
4345    test(S("abcdefghijklmnopqrst"), 0, 21, SV(""), 1, 0, 0);
4346    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 0, 0, 20);
4347    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 0, 1, 19);
4348    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 0, 2, 18);
4349    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 0, 4, 16);
4350    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 0, 5, 15);
4351    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 0, 6, 15);
4352    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 1, 0, 20);
4353    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 1, 1, -1);
4354    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 1, 2, -1);
4355    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 1, 3, -1);
4356    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 1, 4, -1);
4357    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 1, 5, -1);
4358    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 2, 0, 20);
4359    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 2, 1, -2);
4360    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 2, 2, -2);
4361    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 2, 3, -2);
4362    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 2, 4, -2);
4363    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 4, 0, 20);
4364    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 4, 1, -4);
4365    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 4, 2, -4);
4366    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 5, 0, 20);
4367    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 5, 1, 20);
4368    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 6, 0, 0);
4369    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 0, 0, 20);
4370    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 0, 1, 19);
4371    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 0, 5, 15);
4372    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 0, 9, 11);
4373}
4374
4375template <class S, class SV>
4376void test41()
4377{
4378    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 0, 10, 10);
4379    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 0, 11, 10);
4380    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 1, 0, 20);
4381    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 1, 1, -1);
4382    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 1, 4, -1);
4383    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 1, 8, -1);
4384    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 1, 9, -1);
4385    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 1, 10, -1);
4386    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 5, 0, 20);
4387    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 5, 1, -5);
4388    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 5, 2, -5);
4389    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 5, 4, -5);
4390    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 5, 5, -5);
4391    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 5, 6, -5);
4392    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 9, 0, 20);
4393    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 9, 1, -9);
4394    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 9, 2, -9);
4395    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 10, 0, 20);
4396    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 10, 1, 20);
4397    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 11, 0, 0);
4398    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 0, 0, 20);
4399    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 0, 1, 19);
4400    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 0, 10, 10);
4401    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 0, 19, 1);
4402    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 0, 20, 0);
4403    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 0, 21, 0);
4404    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 1, 0, 20);
4405    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 1, 1, -1);
4406    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 1, 9, -1);
4407    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 1, 18, -1);
4408    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 1, 19, -1);
4409    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 1, 20, -1);
4410    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 10, 0, 20);
4411    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 10, 1, -10);
4412    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 10, 5, -10);
4413    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 10, 9, -10);
4414    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 10, 10, -10);
4415    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 10, 11, -10);
4416    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 19, 0, 20);
4417    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 19, 1, -19);
4418    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 19, 2, -19);
4419    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 20, 0, 20);
4420    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 20, 1, 20);
4421    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 21, 0, 0);
4422    test(S("abcdefghijklmnopqrst"), 1, 0, SV(""), 0, 0, 0);
4423    test(S("abcdefghijklmnopqrst"), 1, 0, SV(""), 0, 1, 0);
4424    test(S("abcdefghijklmnopqrst"), 1, 0, SV(""), 1, 0, 0);
4425    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 0, 0, 0);
4426    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 0, 1, -1);
4427    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 0, 2, -2);
4428    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 0, 4, -4);
4429    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 0, 5, -5);
4430    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 0, 6, -5);
4431    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 1, 0, 0);
4432    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 1, 1, -1);
4433    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 1, 2, -2);
4434    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 1, 3, -3);
4435    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 1, 4, -4);
4436    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 1, 5, -4);
4437    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 2, 0, 0);
4438    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 2, 1, -1);
4439    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 2, 2, -2);
4440    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 2, 3, -3);
4441    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 2, 4, -3);
4442    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 4, 0, 0);
4443    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 4, 1, -1);
4444    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 4, 2, -1);
4445    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 5, 0, 0);
4446    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 5, 1, 0);
4447    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), 6, 0, 0);
4448    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 0, 0, 0);
4449    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 0, 1, -1);
4450    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 0, 5, -5);
4451    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 0, 9, -9);
4452    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 0, 10, -10);
4453    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 0, 11, -10);
4454    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 1, 0, 0);
4455    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 1, 1, -1);
4456    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 1, 4, -4);
4457    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 1, 8, -8);
4458    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 1, 9, -9);
4459    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 1, 10, -9);
4460    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 5, 0, 0);
4461    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 5, 1, -1);
4462    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 5, 2, -2);
4463    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 5, 4, -4);
4464    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 5, 5, -5);
4465    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 5, 6, -5);
4466    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 9, 0, 0);
4467    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 9, 1, -1);
4468    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 9, 2, -1);
4469    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 10, 0, 0);
4470    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 10, 1, 0);
4471    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), 11, 0, 0);
4472    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
4473    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 1, -1);
4474    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 10, -10);
4475    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 19, -19);
4476    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 20, -20);
4477    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 0, 21, -20);
4478}
4479
4480template <class S, class SV>
4481void test42()
4482{
4483    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
4484    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 1, -1);
4485    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 9, -9);
4486    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 18, -18);
4487    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 19, -19);
4488    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 1, 20, -19);
4489    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
4490    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 1, -1);
4491    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 5, -5);
4492    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 9, -9);
4493    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 10, -10);
4494    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 10, 11, -10);
4495    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
4496    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 19, 1, -1);
4497    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 19, 2, -1);
4498    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
4499    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
4500    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
4501    test(S("abcdefghijklmnopqrst"), 1, 1, SV(""), 0, 0, 1);
4502    test(S("abcdefghijklmnopqrst"), 1, 1, SV(""), 0, 1, 1);
4503    test(S("abcdefghijklmnopqrst"), 1, 1, SV(""), 1, 0, 0);
4504    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 0, 0, 1);
4505    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 0, 1, 1);
4506    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 0, 2, 1);
4507    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 0, 4, 1);
4508    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 0, 5, 1);
4509    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 0, 6, 1);
4510    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 1, 0, 1);
4511    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 1, 1, 0);
4512    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 1, 2, -1);
4513    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 1, 3, -2);
4514    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 1, 4, -3);
4515    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 1, 5, -3);
4516    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 2, 0, 1);
4517    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 2, 1, -1);
4518    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 2, 2, -1);
4519    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 2, 3, -1);
4520    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 2, 4, -1);
4521    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 4, 0, 1);
4522    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 4, 1, -3);
4523    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 4, 2, -3);
4524    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 5, 0, 1);
4525    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 5, 1, 1);
4526    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 6, 0, 0);
4527    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 0, 0, 1);
4528    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 0, 1, 1);
4529    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 0, 5, 1);
4530    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 0, 9, 1);
4531    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 0, 10, 1);
4532    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 0, 11, 1);
4533    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 1, 0, 1);
4534    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 1, 1, 0);
4535    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 1, 4, -3);
4536    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 1, 8, -7);
4537    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 1, 9, -8);
4538    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 1, 10, -8);
4539    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 5, 0, 1);
4540    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 5, 1, -4);
4541    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 5, 2, -4);
4542    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 5, 4, -4);
4543    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 5, 5, -4);
4544    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 5, 6, -4);
4545    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 9, 0, 1);
4546    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 9, 1, -8);
4547    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 9, 2, -8);
4548    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 10, 0, 1);
4549    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 10, 1, 1);
4550    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 11, 0, 0);
4551    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 0, 1);
4552    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 1, 1);
4553    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 10, 1);
4554    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 19, 1);
4555    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 20, 1);
4556    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 0, 21, 1);
4557    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 0, 1);
4558    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 1, 0);
4559    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 9, -8);
4560    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 18, -17);
4561    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 19, -18);
4562    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 1, 20, -18);
4563    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 0, 1);
4564    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 1, -9);
4565    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 5, -9);
4566    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 9, -9);
4567    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 10, -9);
4568    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 10, 11, -9);
4569    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 19, 0, 1);
4570    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 19, 1, -18);
4571    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 19, 2, -18);
4572    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 20, 0, 1);
4573    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 20, 1, 1);
4574    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 21, 0, 0);
4575    test(S("abcdefghijklmnopqrst"), 1, 9, SV(""), 0, 0, 9);
4576    test(S("abcdefghijklmnopqrst"), 1, 9, SV(""), 0, 1, 9);
4577    test(S("abcdefghijklmnopqrst"), 1, 9, SV(""), 1, 0, 0);
4578    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 0, 0, 9);
4579    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 0, 1, 1);
4580    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 0, 2, 1);
4581    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 0, 4, 1);
4582    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 0, 5, 1);
4583}
4584
4585template <class S, class SV>
4586void test43()
4587{
4588    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 0, 6, 1);
4589    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 1, 0, 9);
4590    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 1, 1, 8);
4591    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 1, 2, 7);
4592    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 1, 3, 6);
4593    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 1, 4, 5);
4594    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 1, 5, 5);
4595    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 2, 0, 9);
4596    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 2, 1, -1);
4597    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 2, 2, -1);
4598    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 2, 3, -1);
4599    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 2, 4, -1);
4600    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 4, 0, 9);
4601    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 4, 1, -3);
4602    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 4, 2, -3);
4603    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 5, 0, 9);
4604    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 5, 1, 9);
4605    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 6, 0, 0);
4606    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 0, 0, 9);
4607    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 0, 1, 1);
4608    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 0, 5, 1);
4609    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 0, 9, 1);
4610    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 0, 10, 1);
4611    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 0, 11, 1);
4612    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 1, 0, 9);
4613    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 1, 1, 8);
4614    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 1, 4, 5);
4615    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 1, 8, 1);
4616    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 1, 9, 0);
4617    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 1, 10, 0);
4618    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 5, 0, 9);
4619    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 5, 1, -4);
4620    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 5, 2, -4);
4621    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 5, 4, -4);
4622    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 5, 5, -4);
4623    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 5, 6, -4);
4624    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 9, 0, 9);
4625    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 9, 1, -8);
4626    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 9, 2, -8);
4627    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 10, 0, 9);
4628    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 10, 1, 9);
4629    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 11, 0, 0);
4630    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 0, 0, 9);
4631    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 0, 1, 1);
4632    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 0, 10, 1);
4633    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 0, 19, 1);
4634    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 0, 20, 1);
4635    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 0, 21, 1);
4636    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 1, 0, 9);
4637    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 1, 1, 8);
4638    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 1, 9, 0);
4639    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 1, 18, -9);
4640    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 1, 19, -10);
4641    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 1, 20, -10);
4642    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 10, 0, 9);
4643    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 10, 1, -9);
4644    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 10, 5, -9);
4645    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 10, 9, -9);
4646    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 10, 10, -9);
4647    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 10, 11, -9);
4648    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 19, 0, 9);
4649    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 19, 1, -18);
4650    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 19, 2, -18);
4651    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 20, 0, 9);
4652    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 20, 1, 9);
4653    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 21, 0, 0);
4654    test(S("abcdefghijklmnopqrst"), 1, 18, SV(""), 0, 0, 18);
4655    test(S("abcdefghijklmnopqrst"), 1, 18, SV(""), 0, 1, 18);
4656    test(S("abcdefghijklmnopqrst"), 1, 18, SV(""), 1, 0, 0);
4657    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 0, 0, 18);
4658    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 0, 1, 1);
4659    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 0, 2, 1);
4660    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 0, 4, 1);
4661    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 0, 5, 1);
4662    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 0, 6, 1);
4663    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 1, 0, 18);
4664    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 1, 1, 17);
4665    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 1, 2, 16);
4666    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 1, 3, 15);
4667    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 1, 4, 14);
4668    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 1, 5, 14);
4669    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 2, 0, 18);
4670    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 2, 1, -1);
4671    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 2, 2, -1);
4672    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 2, 3, -1);
4673    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 2, 4, -1);
4674    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 4, 0, 18);
4675    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 4, 1, -3);
4676    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 4, 2, -3);
4677    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 5, 0, 18);
4678    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 5, 1, 18);
4679    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 6, 0, 0);
4680    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 0, 0, 18);
4681    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 0, 1, 1);
4682    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 0, 5, 1);
4683    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 0, 9, 1);
4684    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 0, 10, 1);
4685    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 0, 11, 1);
4686    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 1, 0, 18);
4687    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 1, 1, 17);
4688}
4689
4690template <class S, class SV>
4691void test44()
4692{
4693    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 1, 4, 14);
4694    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 1, 8, 10);
4695    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 1, 9, 9);
4696    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 1, 10, 9);
4697    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 5, 0, 18);
4698    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 5, 1, -4);
4699    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 5, 2, -4);
4700    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 5, 4, -4);
4701    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 5, 5, -4);
4702    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 5, 6, -4);
4703    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 9, 0, 18);
4704    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 9, 1, -8);
4705    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 9, 2, -8);
4706    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 10, 0, 18);
4707    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 10, 1, 18);
4708    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 11, 0, 0);
4709    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 0, 0, 18);
4710    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 0, 1, 1);
4711    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 0, 10, 1);
4712    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 0, 19, 1);
4713    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 0, 20, 1);
4714    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 0, 21, 1);
4715    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 1, 0, 18);
4716    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 1, 1, 17);
4717    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 1, 9, 9);
4718    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 1, 18, 0);
4719    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 1, 19, -1);
4720    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 1, 20, -1);
4721    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 10, 0, 18);
4722    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 10, 1, -9);
4723    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 10, 5, -9);
4724    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 10, 9, -9);
4725    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 10, 10, -9);
4726    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 10, 11, -9);
4727    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 19, 0, 18);
4728    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 19, 1, -18);
4729    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 19, 2, -18);
4730    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 20, 0, 18);
4731    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 20, 1, 18);
4732    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 21, 0, 0);
4733    test(S("abcdefghijklmnopqrst"), 1, 19, SV(""), 0, 0, 19);
4734    test(S("abcdefghijklmnopqrst"), 1, 19, SV(""), 0, 1, 19);
4735    test(S("abcdefghijklmnopqrst"), 1, 19, SV(""), 1, 0, 0);
4736    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 0, 0, 19);
4737    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 0, 1, 1);
4738    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 0, 2, 1);
4739    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 0, 4, 1);
4740    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 0, 5, 1);
4741    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 0, 6, 1);
4742    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 1, 0, 19);
4743    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 1, 1, 18);
4744    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 1, 2, 17);
4745    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 1, 3, 16);
4746    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 1, 4, 15);
4747    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 1, 5, 15);
4748    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 2, 0, 19);
4749    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 2, 1, -1);
4750    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 2, 2, -1);
4751    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 2, 3, -1);
4752    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 2, 4, -1);
4753    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 4, 0, 19);
4754    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 4, 1, -3);
4755    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 4, 2, -3);
4756    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 5, 0, 19);
4757    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 5, 1, 19);
4758    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 6, 0, 0);
4759    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 0, 0, 19);
4760    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 0, 1, 1);
4761    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 0, 5, 1);
4762    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 0, 9, 1);
4763    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 0, 10, 1);
4764    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 0, 11, 1);
4765    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 1, 0, 19);
4766    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 1, 1, 18);
4767    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 1, 4, 15);
4768    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 1, 8, 11);
4769    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 1, 9, 10);
4770    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 1, 10, 10);
4771    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 5, 0, 19);
4772    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 5, 1, -4);
4773    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 5, 2, -4);
4774    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 5, 4, -4);
4775    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 5, 5, -4);
4776    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 5, 6, -4);
4777    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 9, 0, 19);
4778    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 9, 1, -8);
4779    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 9, 2, -8);
4780    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 10, 0, 19);
4781    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 10, 1, 19);
4782    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 11, 0, 0);
4783    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 0, 0, 19);
4784    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 0, 1, 1);
4785    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 0, 10, 1);
4786    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 0, 19, 1);
4787    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 0, 20, 1);
4788    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 0, 21, 1);
4789    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 1, 0, 19);
4790    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 1, 1, 18);
4791    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 1, 9, 10);
4792    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 1, 18, 1);
4793}
4794
4795template <class S, class SV>
4796void test45()
4797{
4798    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 1, 19, 0);
4799    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 1, 20, 0);
4800    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 10, 0, 19);
4801    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 10, 1, -9);
4802    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 10, 5, -9);
4803    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 10, 9, -9);
4804    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 10, 10, -9);
4805    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 10, 11, -9);
4806    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 19, 0, 19);
4807    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 19, 1, -18);
4808    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 19, 2, -18);
4809    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 20, 0, 19);
4810    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 20, 1, 19);
4811    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 21, 0, 0);
4812    test(S("abcdefghijklmnopqrst"), 1, 20, SV(""), 0, 0, 19);
4813    test(S("abcdefghijklmnopqrst"), 1, 20, SV(""), 0, 1, 19);
4814    test(S("abcdefghijklmnopqrst"), 1, 20, SV(""), 1, 0, 0);
4815    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 0, 0, 19);
4816    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 0, 1, 1);
4817    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 0, 2, 1);
4818    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 0, 4, 1);
4819    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 0, 5, 1);
4820    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 0, 6, 1);
4821    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 1, 0, 19);
4822    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 1, 1, 18);
4823    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 1, 2, 17);
4824    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 1, 3, 16);
4825    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 1, 4, 15);
4826    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 1, 5, 15);
4827    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 2, 0, 19);
4828    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 2, 1, -1);
4829    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 2, 2, -1);
4830    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 2, 3, -1);
4831    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 2, 4, -1);
4832    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 4, 0, 19);
4833    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 4, 1, -3);
4834    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 4, 2, -3);
4835    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 5, 0, 19);
4836    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 5, 1, 19);
4837    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 6, 0, 0);
4838    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 0, 0, 19);
4839    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 0, 1, 1);
4840    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 0, 5, 1);
4841    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 0, 9, 1);
4842    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 0, 10, 1);
4843    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 0, 11, 1);
4844    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 1, 0, 19);
4845    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 1, 1, 18);
4846    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 1, 4, 15);
4847    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 1, 8, 11);
4848    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 1, 9, 10);
4849    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 1, 10, 10);
4850    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 5, 0, 19);
4851    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 5, 1, -4);
4852    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 5, 2, -4);
4853    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 5, 4, -4);
4854    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 5, 5, -4);
4855    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 5, 6, -4);
4856    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 9, 0, 19);
4857    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 9, 1, -8);
4858    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 9, 2, -8);
4859    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 10, 0, 19);
4860    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 10, 1, 19);
4861    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 11, 0, 0);
4862    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 0, 0, 19);
4863    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 0, 1, 1);
4864    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 0, 10, 1);
4865    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 0, 19, 1);
4866    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 0, 20, 1);
4867    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 0, 21, 1);
4868    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 1, 0, 19);
4869    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 1, 1, 18);
4870    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 1, 9, 10);
4871    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 1, 18, 1);
4872    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 1, 19, 0);
4873    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 1, 20, 0);
4874    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 10, 0, 19);
4875    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 10, 1, -9);
4876    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 10, 5, -9);
4877    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 10, 9, -9);
4878    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 10, 10, -9);
4879    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 10, 11, -9);
4880    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 19, 0, 19);
4881    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 19, 1, -18);
4882    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 19, 2, -18);
4883    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 20, 0, 19);
4884    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 20, 1, 19);
4885    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 21, 0, 0);
4886    test(S("abcdefghijklmnopqrst"), 10, 0, SV(""), 0, 0, 0);
4887    test(S("abcdefghijklmnopqrst"), 10, 0, SV(""), 0, 1, 0);
4888    test(S("abcdefghijklmnopqrst"), 10, 0, SV(""), 1, 0, 0);
4889    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 0, 0, 0);
4890    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 0, 1, -1);
4891    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 0, 2, -2);
4892    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 0, 4, -4);
4893    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 0, 5, -5);
4894    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 0, 6, -5);
4895    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 1, 0, 0);
4896    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 1, 1, -1);
4897    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 1, 2, -2);
4898}
4899
4900template <class S, class SV>
4901void test46()
4902{
4903    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 1, 3, -3);
4904    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 1, 4, -4);
4905    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 1, 5, -4);
4906    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 2, 0, 0);
4907    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 2, 1, -1);
4908    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 2, 2, -2);
4909    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 2, 3, -3);
4910    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 2, 4, -3);
4911    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 4, 0, 0);
4912    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 4, 1, -1);
4913    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 4, 2, -1);
4914    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 5, 0, 0);
4915    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 5, 1, 0);
4916    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), 6, 0, 0);
4917    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 0, 0, 0);
4918    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 0, 1, -1);
4919    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 0, 5, -5);
4920    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 0, 9, -9);
4921    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 0, 10, -10);
4922    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 0, 11, -10);
4923    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 1, 0, 0);
4924    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 1, 1, -1);
4925    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 1, 4, -4);
4926    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 1, 8, -8);
4927    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 1, 9, -9);
4928    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 1, 10, -9);
4929    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 5, 0, 0);
4930    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 5, 1, -1);
4931    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 5, 2, -2);
4932    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 5, 4, -4);
4933    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 5, 5, -5);
4934    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 5, 6, -5);
4935    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 9, 0, 0);
4936    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 9, 1, -1);
4937    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 9, 2, -1);
4938    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 10, 0, 0);
4939    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 10, 1, 0);
4940    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), 11, 0, 0);
4941    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
4942    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 0, 1, -1);
4943    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 0, 10, -10);
4944    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 0, 19, -19);
4945    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 0, 20, -20);
4946    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 0, 21, -20);
4947    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
4948    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 1, 1, -1);
4949    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 1, 9, -9);
4950    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 1, 18, -18);
4951    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 1, 19, -19);
4952    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 1, 20, -19);
4953    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
4954    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 10, 1, -1);
4955    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 10, 5, -5);
4956    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 10, 9, -9);
4957    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 10, 10, -10);
4958    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 10, 11, -10);
4959    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
4960    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 19, 1, -1);
4961    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 19, 2, -1);
4962    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
4963    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
4964    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
4965    test(S("abcdefghijklmnopqrst"), 10, 1, SV(""), 0, 0, 1);
4966    test(S("abcdefghijklmnopqrst"), 10, 1, SV(""), 0, 1, 1);
4967    test(S("abcdefghijklmnopqrst"), 10, 1, SV(""), 1, 0, 0);
4968    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 0, 0, 1);
4969    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 0, 1, 10);
4970    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 0, 2, 10);
4971    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 0, 4, 10);
4972    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 0, 5, 10);
4973    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 0, 6, 10);
4974    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 1, 0, 1);
4975    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 1, 1, 9);
4976    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 1, 2, 9);
4977    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 1, 3, 9);
4978    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 1, 4, 9);
4979    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 1, 5, 9);
4980    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 2, 0, 1);
4981    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 2, 1, 8);
4982    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 2, 2, 8);
4983    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 2, 3, 8);
4984    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 2, 4, 8);
4985    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 4, 0, 1);
4986    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 4, 1, 6);
4987    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 4, 2, 6);
4988    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 5, 0, 1);
4989    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 5, 1, 1);
4990    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 6, 0, 0);
4991    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 0, 0, 1);
4992    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 0, 1, 10);
4993    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 0, 5, 10);
4994    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 0, 9, 10);
4995    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 0, 10, 10);
4996    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 0, 11, 10);
4997    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 1, 0, 1);
4998    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 1, 1, 9);
4999    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 1, 4, 9);
5000    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 1, 8, 9);
5001    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 1, 9, 9);
5002    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 1, 10, 9);
5003}
5004
5005template <class S, class SV>
5006void test47()
5007{
5008    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 5, 0, 1);
5009    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 5, 1, 5);
5010    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 5, 2, 5);
5011    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 5, 4, 5);
5012    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 5, 5, 5);
5013    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 5, 6, 5);
5014    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 9, 0, 1);
5015    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 9, 1, 1);
5016    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 9, 2, 1);
5017    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 10, 0, 1);
5018    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 10, 1, 1);
5019    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 11, 0, 0);
5020    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 0, 0, 1);
5021    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 0, 1, 10);
5022    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 0, 10, 10);
5023    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 0, 19, 10);
5024    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 0, 20, 10);
5025    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 0, 21, 10);
5026    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 1, 0, 1);
5027    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 1, 1, 9);
5028    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 1, 9, 9);
5029    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 1, 18, 9);
5030    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 1, 19, 9);
5031    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 1, 20, 9);
5032    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 10, 0, 1);
5033    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 10, 1, 0);
5034    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 10, 5, -4);
5035    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 10, 9, -8);
5036    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 10, 10, -9);
5037    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 10, 11, -9);
5038    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 19, 0, 1);
5039    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 19, 1, -9);
5040    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 19, 2, -9);
5041    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 20, 0, 1);
5042    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 20, 1, 1);
5043    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 21, 0, 0);
5044    test(S("abcdefghijklmnopqrst"), 10, 5, SV(""), 0, 0, 5);
5045    test(S("abcdefghijklmnopqrst"), 10, 5, SV(""), 0, 1, 5);
5046    test(S("abcdefghijklmnopqrst"), 10, 5, SV(""), 1, 0, 0);
5047    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 0, 0, 5);
5048    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 0, 1, 10);
5049    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 0, 2, 10);
5050    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 0, 4, 10);
5051    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 0, 5, 10);
5052    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 0, 6, 10);
5053    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 1, 0, 5);
5054    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 1, 1, 9);
5055    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 1, 2, 9);
5056    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 1, 3, 9);
5057    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 1, 4, 9);
5058    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 1, 5, 9);
5059    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 2, 0, 5);
5060    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 2, 1, 8);
5061    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 2, 2, 8);
5062    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 2, 3, 8);
5063    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 2, 4, 8);
5064    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 4, 0, 5);
5065    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 4, 1, 6);
5066    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 4, 2, 6);
5067    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 5, 0, 5);
5068    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 5, 1, 5);
5069    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 6, 0, 0);
5070    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 0, 0, 5);
5071    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 0, 1, 10);
5072    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 0, 5, 10);
5073    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 0, 9, 10);
5074    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 0, 10, 10);
5075    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 0, 11, 10);
5076    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 1, 0, 5);
5077    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 1, 1, 9);
5078    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 1, 4, 9);
5079    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 1, 8, 9);
5080    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 1, 9, 9);
5081    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 1, 10, 9);
5082    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 5, 0, 5);
5083    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 5, 1, 5);
5084    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 5, 2, 5);
5085    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 5, 4, 5);
5086    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 5, 5, 5);
5087    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 5, 6, 5);
5088    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 9, 0, 5);
5089    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 9, 1, 1);
5090    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 9, 2, 1);
5091    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 10, 0, 5);
5092    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 10, 1, 5);
5093    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 11, 0, 0);
5094    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 0, 0, 5);
5095    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 0, 1, 10);
5096    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 0, 10, 10);
5097    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 0, 19, 10);
5098    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 0, 20, 10);
5099    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 0, 21, 10);
5100    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 1, 0, 5);
5101    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 1, 1, 9);
5102    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 1, 9, 9);
5103    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 1, 18, 9);
5104    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 1, 19, 9);
5105    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 1, 20, 9);
5106    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 10, 0, 5);
5107    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 10, 1, 4);
5108}
5109
5110template <class S, class SV>
5111void test48()
5112{
5113    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 10, 5, 0);
5114    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 10, 9, -4);
5115    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 10, 10, -5);
5116    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 10, 11, -5);
5117    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 19, 0, 5);
5118    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 19, 1, -9);
5119    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 19, 2, -9);
5120    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 20, 0, 5);
5121    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 20, 1, 5);
5122    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 21, 0, 0);
5123    test(S("abcdefghijklmnopqrst"), 10, 9, SV(""), 0, 0, 9);
5124    test(S("abcdefghijklmnopqrst"), 10, 9, SV(""), 0, 1, 9);
5125    test(S("abcdefghijklmnopqrst"), 10, 9, SV(""), 1, 0, 0);
5126    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 0, 0, 9);
5127    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 0, 1, 10);
5128    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 0, 2, 10);
5129    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 0, 4, 10);
5130    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 0, 5, 10);
5131    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 0, 6, 10);
5132    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 1, 0, 9);
5133    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 1, 1, 9);
5134    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 1, 2, 9);
5135    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 1, 3, 9);
5136    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 1, 4, 9);
5137    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 1, 5, 9);
5138    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 2, 0, 9);
5139    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 2, 1, 8);
5140    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 2, 2, 8);
5141    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 2, 3, 8);
5142    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 2, 4, 8);
5143    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 4, 0, 9);
5144    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 4, 1, 6);
5145    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 4, 2, 6);
5146    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 5, 0, 9);
5147    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 5, 1, 9);
5148    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 6, 0, 0);
5149    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 0, 0, 9);
5150    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 0, 1, 10);
5151    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 0, 5, 10);
5152    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 0, 9, 10);
5153    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 0, 10, 10);
5154    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 0, 11, 10);
5155    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 1, 0, 9);
5156    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 1, 1, 9);
5157    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 1, 4, 9);
5158    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 1, 8, 9);
5159    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 1, 9, 9);
5160    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 1, 10, 9);
5161    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 5, 0, 9);
5162    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 5, 1, 5);
5163    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 5, 2, 5);
5164    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 5, 4, 5);
5165    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 5, 5, 5);
5166    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 5, 6, 5);
5167    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 9, 0, 9);
5168    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 9, 1, 1);
5169    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 9, 2, 1);
5170    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 10, 0, 9);
5171    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 10, 1, 9);
5172    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 11, 0, 0);
5173    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 0, 0, 9);
5174    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 0, 1, 10);
5175    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 0, 10, 10);
5176    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 0, 19, 10);
5177    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 0, 20, 10);
5178    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 0, 21, 10);
5179    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 1, 0, 9);
5180    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 1, 1, 9);
5181    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 1, 9, 9);
5182    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 1, 18, 9);
5183    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 1, 19, 9);
5184    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 1, 20, 9);
5185    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 10, 0, 9);
5186    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 10, 1, 8);
5187    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 10, 5, 4);
5188    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 10, 9, 0);
5189    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 10, 10, -1);
5190    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 10, 11, -1);
5191    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 19, 0, 9);
5192    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 19, 1, -9);
5193    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 19, 2, -9);
5194    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 20, 0, 9);
5195    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 20, 1, 9);
5196    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 21, 0, 0);
5197    test(S("abcdefghijklmnopqrst"), 10, 10, SV(""), 0, 0, 10);
5198    test(S("abcdefghijklmnopqrst"), 10, 10, SV(""), 0, 1, 10);
5199    test(S("abcdefghijklmnopqrst"), 10, 10, SV(""), 1, 0, 0);
5200    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 0, 0, 10);
5201    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 0, 1, 10);
5202    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 0, 2, 10);
5203    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 0, 4, 10);
5204    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 0, 5, 10);
5205    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 0, 6, 10);
5206    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 1, 0, 10);
5207    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 1, 1, 9);
5208    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 1, 2, 9);
5209    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 1, 3, 9);
5210    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 1, 4, 9);
5211    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 1, 5, 9);
5212    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 2, 0, 10);
5213}
5214
5215template <class S, class SV>
5216void test49()
5217{
5218    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 2, 1, 8);
5219    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 2, 2, 8);
5220    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 2, 3, 8);
5221    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 2, 4, 8);
5222    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 4, 0, 10);
5223    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 4, 1, 6);
5224    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 4, 2, 6);
5225    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 5, 0, 10);
5226    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 5, 1, 10);
5227    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 6, 0, 0);
5228    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 0, 0, 10);
5229    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 0, 1, 10);
5230    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 0, 5, 10);
5231    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 0, 9, 10);
5232    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 0, 10, 10);
5233    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 0, 11, 10);
5234    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 1, 0, 10);
5235    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 1, 1, 9);
5236    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 1, 4, 9);
5237    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 1, 8, 9);
5238    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 1, 9, 9);
5239    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 1, 10, 9);
5240    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 5, 0, 10);
5241    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 5, 1, 5);
5242    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 5, 2, 5);
5243    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 5, 4, 5);
5244    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 5, 5, 5);
5245    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 5, 6, 5);
5246    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 9, 0, 10);
5247    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 9, 1, 1);
5248    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 9, 2, 1);
5249    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 10, 0, 10);
5250    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 10, 1, 10);
5251    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 11, 0, 0);
5252    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 0, 0, 10);
5253    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 0, 1, 10);
5254    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 0, 10, 10);
5255    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 0, 19, 10);
5256    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 0, 20, 10);
5257    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 0, 21, 10);
5258    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 1, 0, 10);
5259    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 1, 1, 9);
5260    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 1, 9, 9);
5261    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 1, 18, 9);
5262    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 1, 19, 9);
5263    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 1, 20, 9);
5264    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 10, 0, 10);
5265    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 10, 1, 9);
5266    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 10, 5, 5);
5267    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 10, 9, 1);
5268    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 10, 10, 0);
5269    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 10, 11, 0);
5270    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 19, 0, 10);
5271    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 19, 1, -9);
5272    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 19, 2, -9);
5273    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 20, 0, 10);
5274    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 20, 1, 10);
5275    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 21, 0, 0);
5276    test(S("abcdefghijklmnopqrst"), 10, 11, SV(""), 0, 0, 10);
5277    test(S("abcdefghijklmnopqrst"), 10, 11, SV(""), 0, 1, 10);
5278    test(S("abcdefghijklmnopqrst"), 10, 11, SV(""), 1, 0, 0);
5279    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 0, 0, 10);
5280    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 0, 1, 10);
5281    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 0, 2, 10);
5282    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 0, 4, 10);
5283    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 0, 5, 10);
5284    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 0, 6, 10);
5285    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 1, 0, 10);
5286    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 1, 1, 9);
5287    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 1, 2, 9);
5288    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 1, 3, 9);
5289    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 1, 4, 9);
5290    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 1, 5, 9);
5291    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 2, 0, 10);
5292    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 2, 1, 8);
5293    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 2, 2, 8);
5294    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 2, 3, 8);
5295    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 2, 4, 8);
5296    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 4, 0, 10);
5297    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 4, 1, 6);
5298    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 4, 2, 6);
5299    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 5, 0, 10);
5300    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 5, 1, 10);
5301    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 6, 0, 0);
5302    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 0, 0, 10);
5303    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 0, 1, 10);
5304    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 0, 5, 10);
5305    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 0, 9, 10);
5306    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 0, 10, 10);
5307    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 0, 11, 10);
5308    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 1, 0, 10);
5309    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 1, 1, 9);
5310    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 1, 4, 9);
5311    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 1, 8, 9);
5312    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 1, 9, 9);
5313    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 1, 10, 9);
5314    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 5, 0, 10);
5315    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 5, 1, 5);
5316    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 5, 2, 5);
5317    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 5, 4, 5);
5318}
5319
5320template <class S, class SV>
5321void test50()
5322{
5323    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 5, 5, 5);
5324    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 5, 6, 5);
5325    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 9, 0, 10);
5326    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 9, 1, 1);
5327    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 9, 2, 1);
5328    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 10, 0, 10);
5329    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 10, 1, 10);
5330    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 11, 0, 0);
5331    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 0, 0, 10);
5332    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 0, 1, 10);
5333    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 0, 10, 10);
5334    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 0, 19, 10);
5335    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 0, 20, 10);
5336    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 0, 21, 10);
5337    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 1, 0, 10);
5338    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 1, 1, 9);
5339    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 1, 9, 9);
5340    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 1, 18, 9);
5341    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 1, 19, 9);
5342    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 1, 20, 9);
5343    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 10, 0, 10);
5344    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 10, 1, 9);
5345    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 10, 5, 5);
5346    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 10, 9, 1);
5347    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 10, 10, 0);
5348    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 10, 11, 0);
5349    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 19, 0, 10);
5350    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 19, 1, -9);
5351    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 19, 2, -9);
5352    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 20, 0, 10);
5353    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 20, 1, 10);
5354    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 21, 0, 0);
5355    test(S("abcdefghijklmnopqrst"), 19, 0, SV(""), 0, 0, 0);
5356    test(S("abcdefghijklmnopqrst"), 19, 0, SV(""), 0, 1, 0);
5357    test(S("abcdefghijklmnopqrst"), 19, 0, SV(""), 1, 0, 0);
5358    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 0, 0, 0);
5359    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 0, 1, -1);
5360    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 0, 2, -2);
5361    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 0, 4, -4);
5362    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 0, 5, -5);
5363    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 0, 6, -5);
5364    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 1, 0, 0);
5365    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 1, 1, -1);
5366    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 1, 2, -2);
5367    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 1, 3, -3);
5368    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 1, 4, -4);
5369    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 1, 5, -4);
5370    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 2, 0, 0);
5371    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 2, 1, -1);
5372    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 2, 2, -2);
5373    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 2, 3, -3);
5374    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 2, 4, -3);
5375    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 4, 0, 0);
5376    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 4, 1, -1);
5377    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 4, 2, -1);
5378    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 5, 0, 0);
5379    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 5, 1, 0);
5380    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), 6, 0, 0);
5381    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 0, 0, 0);
5382    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 0, 1, -1);
5383    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 0, 5, -5);
5384    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 0, 9, -9);
5385    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 0, 10, -10);
5386    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 0, 11, -10);
5387    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 1, 0, 0);
5388    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 1, 1, -1);
5389    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 1, 4, -4);
5390    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 1, 8, -8);
5391    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 1, 9, -9);
5392    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 1, 10, -9);
5393    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 5, 0, 0);
5394    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 5, 1, -1);
5395    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 5, 2, -2);
5396    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 5, 4, -4);
5397    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 5, 5, -5);
5398    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 5, 6, -5);
5399    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 9, 0, 0);
5400    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 9, 1, -1);
5401    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 9, 2, -1);
5402    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 10, 0, 0);
5403    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 10, 1, 0);
5404    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), 11, 0, 0);
5405    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
5406    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 0, 1, -1);
5407    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 0, 10, -10);
5408    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 0, 19, -19);
5409    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 0, 20, -20);
5410    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 0, 21, -20);
5411    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
5412    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 1, 1, -1);
5413    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 1, 9, -9);
5414    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 1, 18, -18);
5415    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 1, 19, -19);
5416    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 1, 20, -19);
5417    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
5418    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 10, 1, -1);
5419    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 10, 5, -5);
5420    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 10, 9, -9);
5421    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 10, 10, -10);
5422    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 10, 11, -10);
5423}
5424
5425template <class S, class SV>
5426void test51()
5427{
5428    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
5429    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 19, 1, -1);
5430    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 19, 2, -1);
5431    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
5432    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
5433    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
5434    test(S("abcdefghijklmnopqrst"), 19, 1, SV(""), 0, 0, 1);
5435    test(S("abcdefghijklmnopqrst"), 19, 1, SV(""), 0, 1, 1);
5436    test(S("abcdefghijklmnopqrst"), 19, 1, SV(""), 1, 0, 0);
5437    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 0, 0, 1);
5438    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 0, 1, 19);
5439    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 0, 2, 19);
5440    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 0, 4, 19);
5441    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 0, 5, 19);
5442    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 0, 6, 19);
5443    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 1, 0, 1);
5444    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 1, 1, 18);
5445    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 1, 2, 18);
5446    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 1, 3, 18);
5447    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 1, 4, 18);
5448    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 1, 5, 18);
5449    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 2, 0, 1);
5450    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 2, 1, 17);
5451    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 2, 2, 17);
5452    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 2, 3, 17);
5453    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 2, 4, 17);
5454    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 4, 0, 1);
5455    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 4, 1, 15);
5456    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 4, 2, 15);
5457    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 5, 0, 1);
5458    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 5, 1, 1);
5459    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 6, 0, 0);
5460    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 0, 0, 1);
5461    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 0, 1, 19);
5462    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 0, 5, 19);
5463    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 0, 9, 19);
5464    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 0, 10, 19);
5465    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 0, 11, 19);
5466    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 1, 0, 1);
5467    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 1, 1, 18);
5468    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 1, 4, 18);
5469    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 1, 8, 18);
5470    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 1, 9, 18);
5471    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 1, 10, 18);
5472    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 5, 0, 1);
5473    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 5, 1, 14);
5474    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 5, 2, 14);
5475    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 5, 4, 14);
5476    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 5, 5, 14);
5477    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 5, 6, 14);
5478    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 9, 0, 1);
5479    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 9, 1, 10);
5480    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 9, 2, 10);
5481    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 10, 0, 1);
5482    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 10, 1, 1);
5483    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 11, 0, 0);
5484    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 0, 0, 1);
5485    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 0, 1, 19);
5486    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 0, 10, 19);
5487    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 0, 19, 19);
5488    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 0, 20, 19);
5489    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 0, 21, 19);
5490    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 1, 0, 1);
5491    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 1, 1, 18);
5492    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 1, 9, 18);
5493    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 1, 18, 18);
5494    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 1, 19, 18);
5495    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 1, 20, 18);
5496    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 10, 0, 1);
5497    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 10, 1, 9);
5498    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 10, 5, 9);
5499    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 10, 9, 9);
5500    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 10, 10, 9);
5501    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 10, 11, 9);
5502    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 19, 0, 1);
5503    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 19, 1, 0);
5504    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 19, 2, 0);
5505    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 20, 0, 1);
5506    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 20, 1, 1);
5507    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 21, 0, 0);
5508    test(S("abcdefghijklmnopqrst"), 19, 2, SV(""), 0, 0, 1);
5509    test(S("abcdefghijklmnopqrst"), 19, 2, SV(""), 0, 1, 1);
5510    test(S("abcdefghijklmnopqrst"), 19, 2, SV(""), 1, 0, 0);
5511    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 0, 0, 1);
5512    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 0, 1, 19);
5513    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 0, 2, 19);
5514    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 0, 4, 19);
5515    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 0, 5, 19);
5516    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 0, 6, 19);
5517    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 1, 0, 1);
5518    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 1, 1, 18);
5519    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 1, 2, 18);
5520    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 1, 3, 18);
5521    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 1, 4, 18);
5522    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 1, 5, 18);
5523    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 2, 0, 1);
5524    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 2, 1, 17);
5525    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 2, 2, 17);
5526    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 2, 3, 17);
5527    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 2, 4, 17);
5528}
5529
5530template <class S, class SV>
5531void test52()
5532{
5533    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 4, 0, 1);
5534    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 4, 1, 15);
5535    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 4, 2, 15);
5536    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 5, 0, 1);
5537    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 5, 1, 1);
5538    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 6, 0, 0);
5539    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 0, 0, 1);
5540    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 0, 1, 19);
5541    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 0, 5, 19);
5542    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 0, 9, 19);
5543    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 0, 10, 19);
5544    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 0, 11, 19);
5545    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 1, 0, 1);
5546    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 1, 1, 18);
5547    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 1, 4, 18);
5548    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 1, 8, 18);
5549    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 1, 9, 18);
5550    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 1, 10, 18);
5551    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 5, 0, 1);
5552    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 5, 1, 14);
5553    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 5, 2, 14);
5554    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 5, 4, 14);
5555    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 5, 5, 14);
5556    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 5, 6, 14);
5557    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 9, 0, 1);
5558    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 9, 1, 10);
5559    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 9, 2, 10);
5560    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 10, 0, 1);
5561    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 10, 1, 1);
5562    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 11, 0, 0);
5563    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 0, 0, 1);
5564    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 0, 1, 19);
5565    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 0, 10, 19);
5566    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 0, 19, 19);
5567    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 0, 20, 19);
5568    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 0, 21, 19);
5569    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 1, 0, 1);
5570    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 1, 1, 18);
5571    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 1, 9, 18);
5572    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 1, 18, 18);
5573    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 1, 19, 18);
5574    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 1, 20, 18);
5575    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 10, 0, 1);
5576    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 10, 1, 9);
5577    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 10, 5, 9);
5578    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 10, 9, 9);
5579    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 10, 10, 9);
5580    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 10, 11, 9);
5581    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 19, 0, 1);
5582    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 19, 1, 0);
5583    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 19, 2, 0);
5584    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 20, 0, 1);
5585    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 20, 1, 1);
5586    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 21, 0, 0);
5587    test(S("abcdefghijklmnopqrst"), 20, 0, SV(""), 0, 0, 0);
5588    test(S("abcdefghijklmnopqrst"), 20, 0, SV(""), 0, 1, 0);
5589    test(S("abcdefghijklmnopqrst"), 20, 0, SV(""), 1, 0, 0);
5590    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 0, 0, 0);
5591    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 0, 1, -1);
5592    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 0, 2, -2);
5593    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 0, 4, -4);
5594    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 0, 5, -5);
5595    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 0, 6, -5);
5596    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 1, 0, 0);
5597    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 1, 1, -1);
5598    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 1, 2, -2);
5599    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 1, 3, -3);
5600    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 1, 4, -4);
5601    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 1, 5, -4);
5602    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 2, 0, 0);
5603    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 2, 1, -1);
5604    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 2, 2, -2);
5605    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 2, 3, -3);
5606    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 2, 4, -3);
5607    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 4, 0, 0);
5608    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 4, 1, -1);
5609    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 4, 2, -1);
5610    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 5, 0, 0);
5611    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 5, 1, 0);
5612    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), 6, 0, 0);
5613    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 0, 0, 0);
5614    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 0, 1, -1);
5615    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 0, 5, -5);
5616    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 0, 9, -9);
5617    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 0, 10, -10);
5618    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 0, 11, -10);
5619    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 1, 0, 0);
5620    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 1, 1, -1);
5621    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 1, 4, -4);
5622    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 1, 8, -8);
5623    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 1, 9, -9);
5624    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 1, 10, -9);
5625    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 5, 0, 0);
5626    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 5, 1, -1);
5627    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 5, 2, -2);
5628    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 5, 4, -4);
5629    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 5, 5, -5);
5630    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 5, 6, -5);
5631    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 9, 0, 0);
5632    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 9, 1, -1);
5633}
5634
5635template <class S, class SV>
5636void test53()
5637{
5638    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 9, 2, -1);
5639    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 10, 0, 0);
5640    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 10, 1, 0);
5641    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), 11, 0, 0);
5642    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
5643    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 0, 1, -1);
5644    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 0, 10, -10);
5645    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 0, 19, -19);
5646    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 0, 20, -20);
5647    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 0, 21, -20);
5648    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
5649    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 1, 1, -1);
5650    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 1, 9, -9);
5651    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 1, 18, -18);
5652    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 1, 19, -19);
5653    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 1, 20, -19);
5654    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
5655    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 10, 1, -1);
5656    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 10, 5, -5);
5657    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 10, 9, -9);
5658    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 10, 10, -10);
5659    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 10, 11, -10);
5660    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
5661    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 19, 1, -1);
5662    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 19, 2, -1);
5663    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
5664    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
5665    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
5666    test(S("abcdefghijklmnopqrst"), 20, 1, SV(""), 0, 0, 0);
5667    test(S("abcdefghijklmnopqrst"), 20, 1, SV(""), 0, 1, 0);
5668    test(S("abcdefghijklmnopqrst"), 20, 1, SV(""), 1, 0, 0);
5669    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 0, 0, 0);
5670    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 0, 1, -1);
5671    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 0, 2, -2);
5672    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 0, 4, -4);
5673    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 0, 5, -5);
5674    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 0, 6, -5);
5675    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 1, 0, 0);
5676    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 1, 1, -1);
5677    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 1, 2, -2);
5678    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 1, 3, -3);
5679    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 1, 4, -4);
5680    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 1, 5, -4);
5681    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 2, 0, 0);
5682    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 2, 1, -1);
5683    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 2, 2, -2);
5684    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 2, 3, -3);
5685    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 2, 4, -3);
5686    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 4, 0, 0);
5687    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 4, 1, -1);
5688    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 4, 2, -1);
5689    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 5, 0, 0);
5690    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 5, 1, 0);
5691    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), 6, 0, 0);
5692    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 0, 0, 0);
5693    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 0, 1, -1);
5694    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 0, 5, -5);
5695    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 0, 9, -9);
5696    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 0, 10, -10);
5697    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 0, 11, -10);
5698    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 1, 0, 0);
5699    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 1, 1, -1);
5700    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 1, 4, -4);
5701    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 1, 8, -8);
5702    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 1, 9, -9);
5703    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 1, 10, -9);
5704    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 5, 0, 0);
5705    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 5, 1, -1);
5706    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 5, 2, -2);
5707    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 5, 4, -4);
5708    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 5, 5, -5);
5709    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 5, 6, -5);
5710    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 9, 0, 0);
5711    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 9, 1, -1);
5712    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 9, 2, -1);
5713    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 10, 0, 0);
5714    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 10, 1, 0);
5715    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), 11, 0, 0);
5716    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 0, 0, 0);
5717    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 0, 1, -1);
5718    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 0, 10, -10);
5719    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 0, 19, -19);
5720    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 0, 20, -20);
5721    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 0, 21, -20);
5722    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 1, 0, 0);
5723    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 1, 1, -1);
5724    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 1, 9, -9);
5725    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 1, 18, -18);
5726    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 1, 19, -19);
5727    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 1, 20, -19);
5728    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 10, 0, 0);
5729    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 10, 1, -1);
5730    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 10, 5, -5);
5731    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 10, 9, -9);
5732    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 10, 10, -10);
5733    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 10, 11, -10);
5734    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 19, 0, 0);
5735    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 19, 1, -1);
5736    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 19, 2, -1);
5737    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 20, 0, 0);
5738}
5739
5740template <class S, class SV>
5741void test54()
5742{
5743    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 20, 1, 0);
5744    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), 21, 0, 0);
5745    test(S("abcdefghijklmnopqrst"), 21, 0, SV(""), 0, 0, 0);
5746    test(S("abcdefghijklmnopqrst"), 21, 0, SV(""), 0, 1, 0);
5747    test(S("abcdefghijklmnopqrst"), 21, 0, SV(""), 1, 0, 0);
5748    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 0, 0, 0);
5749    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 0, 1, 0);
5750    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 0, 2, 0);
5751    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 0, 4, 0);
5752    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 0, 5, 0);
5753    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 0, 6, 0);
5754    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 1, 0, 0);
5755    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 1, 1, 0);
5756    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 1, 2, 0);
5757    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 1, 3, 0);
5758    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 1, 4, 0);
5759    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 1, 5, 0);
5760    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 2, 0, 0);
5761    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 2, 1, 0);
5762    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 2, 2, 0);
5763    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 2, 3, 0);
5764    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 2, 4, 0);
5765    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 4, 0, 0);
5766    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 4, 1, 0);
5767    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 4, 2, 0);
5768    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 5, 0, 0);
5769    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 5, 1, 0);
5770    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 6, 0, 0);
5771    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 0, 0, 0);
5772    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 0, 1, 0);
5773    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 0, 5, 0);
5774    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 0, 9, 0);
5775    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 0, 10, 0);
5776    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 0, 11, 0);
5777    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 1, 0, 0);
5778    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 1, 1, 0);
5779    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 1, 4, 0);
5780    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 1, 8, 0);
5781    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 1, 9, 0);
5782    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 1, 10, 0);
5783    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 5, 0, 0);
5784    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 5, 1, 0);
5785    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 5, 2, 0);
5786    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 5, 4, 0);
5787    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 5, 5, 0);
5788    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 5, 6, 0);
5789    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 9, 0, 0);
5790    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 9, 1, 0);
5791    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 9, 2, 0);
5792    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 10, 0, 0);
5793    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 10, 1, 0);
5794    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 11, 0, 0);
5795    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 0, 0, 0);
5796    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 0, 1, 0);
5797    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 0, 10, 0);
5798    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 0, 19, 0);
5799    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 0, 20, 0);
5800    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 0, 21, 0);
5801    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 1, 0, 0);
5802    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 1, 1, 0);
5803    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 1, 9, 0);
5804    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 1, 18, 0);
5805    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 1, 19, 0);
5806    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 1, 20, 0);
5807    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 10, 0, 0);
5808    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 10, 1, 0);
5809    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 10, 5, 0);
5810    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 10, 9, 0);
5811    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 10, 10, 0);
5812    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 10, 11, 0);
5813    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 19, 0, 0);
5814    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 19, 1, 0);
5815    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 19, 2, 0);
5816    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 20, 0, 0);
5817    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 20, 1, 0);
5818    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 21, 0, 0);
5819}
5820
5821template <class S, class SV>
5822void test55()
5823{
5824    test_npos(S(""), 0, 0, SV(""), 0, 0);
5825    test_npos(S(""), 0, 0, SV("abcde"), 0, -5);
5826    test_npos(S("abcde"), 0, 0, SV("abcdefghij"), 0, -10);
5827    test_npos(S("abcde"), 0, 0, SV("abcdefghij"), 1, -9);
5828    test_npos(S("abcde"), 0, 0, SV("abcdefghij"), 5, -5);
5829}
5830
5831int main()
5832{
5833    {
5834    typedef std::string S;
5835    typedef std::string_view SV;
5836    test0<S, SV>();
5837    test1<S, SV>();
5838    test2<S, SV>();
5839    test3<S, SV>();
5840    test4<S, SV>();
5841    test5<S, SV>();
5842    test6<S, SV>();
5843    test7<S, SV>();
5844    test8<S, SV>();
5845    test9<S, SV>();
5846    test10<S, SV>();
5847    test11<S, SV>();
5848    test12<S, SV>();
5849    test13<S, SV>();
5850    test14<S, SV>();
5851    test15<S, SV>();
5852    test16<S, SV>();
5853    test17<S, SV>();
5854    test18<S, SV>();
5855    test19<S, SV>();
5856    test20<S, SV>();
5857    test21<S, SV>();
5858    test22<S, SV>();
5859    test23<S, SV>();
5860    test24<S, SV>();
5861    test25<S, SV>();
5862    test26<S, SV>();
5863    test27<S, SV>();
5864    test28<S, SV>();
5865    test29<S, SV>();
5866    test30<S, SV>();
5867    test31<S, SV>();
5868    test32<S, SV>();
5869    test33<S, SV>();
5870    test34<S, SV>();
5871    test35<S, SV>();
5872    test36<S, SV>();
5873    test37<S, SV>();
5874    test38<S, SV>();
5875    test39<S, SV>();
5876    test40<S, SV>();
5877    test41<S, SV>();
5878    test42<S, SV>();
5879    test43<S, SV>();
5880    test44<S, SV>();
5881    test45<S, SV>();
5882    test46<S, SV>();
5883    test47<S, SV>();
5884    test48<S, SV>();
5885    test49<S, SV>();
5886    test50<S, SV>();
5887    test51<S, SV>();
5888    test52<S, SV>();
5889    test53<S, SV>();
5890    test54<S, SV>();
5891    test55<S, SV>();
5892    }
5893#if TEST_STD_VER >= 11
5894    {
5895    typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
5896    typedef std::basic_string_view<char, std::char_traits<char>> SV;
5897    test0<S, SV>();
5898    test1<S, SV>();
5899    test2<S, SV>();
5900    test3<S, SV>();
5901    test4<S, SV>();
5902    test5<S, SV>();
5903    test6<S, SV>();
5904    test7<S, SV>();
5905    test8<S, SV>();
5906    test9<S, SV>();
5907    test10<S, SV>();
5908    test11<S, SV>();
5909    test12<S, SV>();
5910    test13<S, SV>();
5911    test14<S, SV>();
5912    test15<S, SV>();
5913    test16<S, SV>();
5914    test17<S, SV>();
5915    test18<S, SV>();
5916    test19<S, SV>();
5917    test20<S, SV>();
5918    test21<S, SV>();
5919    test22<S, SV>();
5920    test23<S, SV>();
5921    test24<S, SV>();
5922    test25<S, SV>();
5923    test26<S, SV>();
5924    test27<S, SV>();
5925    test28<S, SV>();
5926    test29<S, SV>();
5927    test30<S, SV>();
5928    test31<S, SV>();
5929    test32<S, SV>();
5930    test33<S, SV>();
5931    test34<S, SV>();
5932    test35<S, SV>();
5933    test36<S, SV>();
5934    test37<S, SV>();
5935    test38<S, SV>();
5936    test39<S, SV>();
5937    test40<S, SV>();
5938    test41<S, SV>();
5939    test42<S, SV>();
5940    test43<S, SV>();
5941    test44<S, SV>();
5942    test45<S, SV>();
5943    test46<S, SV>();
5944    test47<S, SV>();
5945    test48<S, SV>();
5946    test49<S, SV>();
5947    test50<S, SV>();
5948    test51<S, SV>();
5949    test52<S, SV>();
5950    test53<S, SV>();
5951    test54<S, SV>();
5952    test55<S, SV>();
5953    }
5954#endif
5955    {
5956    typedef std::string S;
5957    typedef std::string_view SV;
5958    S s = "MNOP";
5959    SV sv = "CDEF";
5960    char arr[] = "MNOP";
5961
5962//  calls compare(pos, n1, const char *, 0)
5963    assert(s.compare(0, 4, "QRST", 0) > 0);
5964
5965//  calls compare(pos, n1, string("QRST"), 0, npos)
5966    assert(s.compare(0, 4, "QRST", 0, std::string::npos) < 0);
5967
5968//  calls compare(pos, n1, T, 0, npos)
5969    assert(s.compare(0, 4, sv, 0) > 0);
5970
5971//  calls compare(pos, n1, T, 0, npos)
5972    assert(s.compare(0, 4, sv, 0, std::string::npos) > 0);
5973
5974// calls compare(pos, n1, const char *, 0)
5975    assert(s.compare(0, 4, arr, 0) > 0);
5976
5977//  calls compare(size, size, string(arr), 0, npos)
5978    assert(s.compare(0, 4, arr, 0, std::string::npos) == 0);
5979    }
5980}
5981