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// <string>
11
12// int compare(size_type pos1, size_type n1, const basic_string& str,
13//             size_type pos2, size_type n2=npos) const;
14//  the "=npos" was added in C++14
15
16#include <string>
17#include <stdexcept>
18#include <cassert>
19
20#include "min_allocator.h"
21
22#include "test_macros.h"
23
24int sign(int x)
25{
26    if (x == 0)
27        return 0;
28    if (x < 0)
29        return -1;
30    return 1;
31}
32
33template <class S>
34void
35test(const S& s,   typename S::size_type pos1, typename S::size_type n1,
36     const S& str, typename S::size_type pos2, typename S::size_type n2, int x)
37{
38    if (pos1 <= s.size() && pos2 <= str.size())
39        assert(sign(s.compare(pos1, n1, str, pos2, n2)) == sign(x));
40#ifndef TEST_HAS_NO_EXCEPTIONS
41    else
42    {
43        try
44        {
45            s.compare(pos1, n1, str, pos2, n2);
46            assert(false);
47        }
48        catch (const std::out_of_range&)
49        {
50            assert(pos1 > s.size() || pos2 > str.size());
51        }
52    }
53#endif
54}
55
56template <class S>
57void
58test_npos(const S& s,   typename S::size_type pos1, typename S::size_type n1,
59          const S& str, typename S::size_type pos2, int x)
60{
61    if (pos1 <= s.size() && pos2 <= str.size())
62        assert(sign(s.compare(pos1, n1, str, pos2)) == sign(x));
63#ifndef TEST_HAS_NO_EXCEPTIONS
64    else
65    {
66        try
67        {
68            s.compare(pos1, n1, str, pos2);
69            assert(false);
70        }
71        catch (const std::out_of_range&)
72        {
73            assert(pos1 > s.size() || pos2 > str.size());
74        }
75    }
76#endif
77}
78
79template <class S>
80void test0()
81{
82    test(S(""), 0, 0, S(""), 0, 0, 0);
83    test(S(""), 0, 0, S(""), 0, 1, 0);
84    test(S(""), 0, 0, S(""), 1, 0, 0);
85    test(S(""), 0, 0, S("abcde"), 0, 0, 0);
86    test(S(""), 0, 0, S("abcde"), 0, 1, -1);
87    test(S(""), 0, 0, S("abcde"), 0, 2, -2);
88    test(S(""), 0, 0, S("abcde"), 0, 4, -4);
89    test(S(""), 0, 0, S("abcde"), 0, 5, -5);
90    test(S(""), 0, 0, S("abcde"), 0, 6, -5);
91    test(S(""), 0, 0, S("abcde"), 1, 0, 0);
92    test(S(""), 0, 0, S("abcde"), 1, 1, -1);
93    test(S(""), 0, 0, S("abcde"), 1, 2, -2);
94    test(S(""), 0, 0, S("abcde"), 1, 3, -3);
95    test(S(""), 0, 0, S("abcde"), 1, 4, -4);
96    test(S(""), 0, 0, S("abcde"), 1, 5, -4);
97    test(S(""), 0, 0, S("abcde"), 2, 0, 0);
98    test(S(""), 0, 0, S("abcde"), 2, 1, -1);
99    test(S(""), 0, 0, S("abcde"), 2, 2, -2);
100    test(S(""), 0, 0, S("abcde"), 2, 3, -3);
101    test(S(""), 0, 0, S("abcde"), 2, 4, -3);
102    test(S(""), 0, 0, S("abcde"), 4, 0, 0);
103    test(S(""), 0, 0, S("abcde"), 4, 1, -1);
104    test(S(""), 0, 0, S("abcde"), 4, 2, -1);
105    test(S(""), 0, 0, S("abcde"), 5, 0, 0);
106    test(S(""), 0, 0, S("abcde"), 5, 1, 0);
107    test(S(""), 0, 0, S("abcde"), 6, 0, 0);
108    test(S(""), 0, 0, S("abcdefghij"), 0, 0, 0);
109    test(S(""), 0, 0, S("abcdefghij"), 0, 1, -1);
110    test(S(""), 0, 0, S("abcdefghij"), 0, 5, -5);
111    test(S(""), 0, 0, S("abcdefghij"), 0, 9, -9);
112    test(S(""), 0, 0, S("abcdefghij"), 0, 10, -10);
113    test(S(""), 0, 0, S("abcdefghij"), 0, 11, -10);
114    test(S(""), 0, 0, S("abcdefghij"), 1, 0, 0);
115    test(S(""), 0, 0, S("abcdefghij"), 1, 1, -1);
116    test(S(""), 0, 0, S("abcdefghij"), 1, 4, -4);
117    test(S(""), 0, 0, S("abcdefghij"), 1, 8, -8);
118    test(S(""), 0, 0, S("abcdefghij"), 1, 9, -9);
119    test(S(""), 0, 0, S("abcdefghij"), 1, 10, -9);
120    test(S(""), 0, 0, S("abcdefghij"), 5, 0, 0);
121    test(S(""), 0, 0, S("abcdefghij"), 5, 1, -1);
122    test(S(""), 0, 0, S("abcdefghij"), 5, 2, -2);
123    test(S(""), 0, 0, S("abcdefghij"), 5, 4, -4);
124    test(S(""), 0, 0, S("abcdefghij"), 5, 5, -5);
125    test(S(""), 0, 0, S("abcdefghij"), 5, 6, -5);
126    test(S(""), 0, 0, S("abcdefghij"), 9, 0, 0);
127    test(S(""), 0, 0, S("abcdefghij"), 9, 1, -1);
128    test(S(""), 0, 0, S("abcdefghij"), 9, 2, -1);
129    test(S(""), 0, 0, S("abcdefghij"), 10, 0, 0);
130    test(S(""), 0, 0, S("abcdefghij"), 10, 1, 0);
131    test(S(""), 0, 0, S("abcdefghij"), 11, 0, 0);
132    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
133    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
134    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
135    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
136    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
137    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
138    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
139    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
140    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
141    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
142    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
143    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
144    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
145    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
146    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
147    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
148    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
149    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
150    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
151    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
152    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
153    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
154    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
155    test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
156    test(S(""), 0, 1, S(""), 0, 0, 0);
157    test(S(""), 0, 1, S(""), 0, 1, 0);
158    test(S(""), 0, 1, S(""), 1, 0, 0);
159    test(S(""), 0, 1, S("abcde"), 0, 0, 0);
160    test(S(""), 0, 1, S("abcde"), 0, 1, -1);
161    test(S(""), 0, 1, S("abcde"), 0, 2, -2);
162    test(S(""), 0, 1, S("abcde"), 0, 4, -4);
163    test(S(""), 0, 1, S("abcde"), 0, 5, -5);
164    test(S(""), 0, 1, S("abcde"), 0, 6, -5);
165    test(S(""), 0, 1, S("abcde"), 1, 0, 0);
166    test(S(""), 0, 1, S("abcde"), 1, 1, -1);
167    test(S(""), 0, 1, S("abcde"), 1, 2, -2);
168    test(S(""), 0, 1, S("abcde"), 1, 3, -3);
169    test(S(""), 0, 1, S("abcde"), 1, 4, -4);
170    test(S(""), 0, 1, S("abcde"), 1, 5, -4);
171    test(S(""), 0, 1, S("abcde"), 2, 0, 0);
172    test(S(""), 0, 1, S("abcde"), 2, 1, -1);
173    test(S(""), 0, 1, S("abcde"), 2, 2, -2);
174    test(S(""), 0, 1, S("abcde"), 2, 3, -3);
175    test(S(""), 0, 1, S("abcde"), 2, 4, -3);
176    test(S(""), 0, 1, S("abcde"), 4, 0, 0);
177    test(S(""), 0, 1, S("abcde"), 4, 1, -1);
178    test(S(""), 0, 1, S("abcde"), 4, 2, -1);
179    test(S(""), 0, 1, S("abcde"), 5, 0, 0);
180    test(S(""), 0, 1, S("abcde"), 5, 1, 0);
181    test(S(""), 0, 1, S("abcde"), 6, 0, 0);
182}
183
184template <class S>
185void test1()
186{
187    test(S(""), 0, 1, S("abcdefghij"), 0, 0, 0);
188    test(S(""), 0, 1, S("abcdefghij"), 0, 1, -1);
189    test(S(""), 0, 1, S("abcdefghij"), 0, 5, -5);
190    test(S(""), 0, 1, S("abcdefghij"), 0, 9, -9);
191    test(S(""), 0, 1, S("abcdefghij"), 0, 10, -10);
192    test(S(""), 0, 1, S("abcdefghij"), 0, 11, -10);
193    test(S(""), 0, 1, S("abcdefghij"), 1, 0, 0);
194    test(S(""), 0, 1, S("abcdefghij"), 1, 1, -1);
195    test(S(""), 0, 1, S("abcdefghij"), 1, 4, -4);
196    test(S(""), 0, 1, S("abcdefghij"), 1, 8, -8);
197    test(S(""), 0, 1, S("abcdefghij"), 1, 9, -9);
198    test(S(""), 0, 1, S("abcdefghij"), 1, 10, -9);
199    test(S(""), 0, 1, S("abcdefghij"), 5, 0, 0);
200    test(S(""), 0, 1, S("abcdefghij"), 5, 1, -1);
201    test(S(""), 0, 1, S("abcdefghij"), 5, 2, -2);
202    test(S(""), 0, 1, S("abcdefghij"), 5, 4, -4);
203    test(S(""), 0, 1, S("abcdefghij"), 5, 5, -5);
204    test(S(""), 0, 1, S("abcdefghij"), 5, 6, -5);
205    test(S(""), 0, 1, S("abcdefghij"), 9, 0, 0);
206    test(S(""), 0, 1, S("abcdefghij"), 9, 1, -1);
207    test(S(""), 0, 1, S("abcdefghij"), 9, 2, -1);
208    test(S(""), 0, 1, S("abcdefghij"), 10, 0, 0);
209    test(S(""), 0, 1, S("abcdefghij"), 10, 1, 0);
210    test(S(""), 0, 1, S("abcdefghij"), 11, 0, 0);
211    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 0);
212    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, -1);
213    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -10);
214    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -19);
215    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -20);
216    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -20);
217    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 0);
218    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
219    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -9);
220    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -18);
221    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -19);
222    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -19);
223    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 0);
224    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
225    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
226    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
227    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
228    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
229    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 0);
230    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -1);
231    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -1);
232    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 0);
233    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 0);
234    test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
235    test(S(""), 1, 0, S(""), 0, 0, 0);
236    test(S(""), 1, 0, S(""), 0, 1, 0);
237    test(S(""), 1, 0, S(""), 1, 0, 0);
238    test(S(""), 1, 0, S("abcde"), 0, 0, 0);
239    test(S(""), 1, 0, S("abcde"), 0, 1, 0);
240    test(S(""), 1, 0, S("abcde"), 0, 2, 0);
241    test(S(""), 1, 0, S("abcde"), 0, 4, 0);
242    test(S(""), 1, 0, S("abcde"), 0, 5, 0);
243    test(S(""), 1, 0, S("abcde"), 0, 6, 0);
244    test(S(""), 1, 0, S("abcde"), 1, 0, 0);
245    test(S(""), 1, 0, S("abcde"), 1, 1, 0);
246    test(S(""), 1, 0, S("abcde"), 1, 2, 0);
247    test(S(""), 1, 0, S("abcde"), 1, 3, 0);
248    test(S(""), 1, 0, S("abcde"), 1, 4, 0);
249    test(S(""), 1, 0, S("abcde"), 1, 5, 0);
250    test(S(""), 1, 0, S("abcde"), 2, 0, 0);
251    test(S(""), 1, 0, S("abcde"), 2, 1, 0);
252    test(S(""), 1, 0, S("abcde"), 2, 2, 0);
253    test(S(""), 1, 0, S("abcde"), 2, 3, 0);
254    test(S(""), 1, 0, S("abcde"), 2, 4, 0);
255    test(S(""), 1, 0, S("abcde"), 4, 0, 0);
256    test(S(""), 1, 0, S("abcde"), 4, 1, 0);
257    test(S(""), 1, 0, S("abcde"), 4, 2, 0);
258    test(S(""), 1, 0, S("abcde"), 5, 0, 0);
259    test(S(""), 1, 0, S("abcde"), 5, 1, 0);
260    test(S(""), 1, 0, S("abcde"), 6, 0, 0);
261    test(S(""), 1, 0, S("abcdefghij"), 0, 0, 0);
262    test(S(""), 1, 0, S("abcdefghij"), 0, 1, 0);
263    test(S(""), 1, 0, S("abcdefghij"), 0, 5, 0);
264    test(S(""), 1, 0, S("abcdefghij"), 0, 9, 0);
265    test(S(""), 1, 0, S("abcdefghij"), 0, 10, 0);
266    test(S(""), 1, 0, S("abcdefghij"), 0, 11, 0);
267    test(S(""), 1, 0, S("abcdefghij"), 1, 0, 0);
268    test(S(""), 1, 0, S("abcdefghij"), 1, 1, 0);
269    test(S(""), 1, 0, S("abcdefghij"), 1, 4, 0);
270    test(S(""), 1, 0, S("abcdefghij"), 1, 8, 0);
271    test(S(""), 1, 0, S("abcdefghij"), 1, 9, 0);
272    test(S(""), 1, 0, S("abcdefghij"), 1, 10, 0);
273    test(S(""), 1, 0, S("abcdefghij"), 5, 0, 0);
274    test(S(""), 1, 0, S("abcdefghij"), 5, 1, 0);
275    test(S(""), 1, 0, S("abcdefghij"), 5, 2, 0);
276    test(S(""), 1, 0, S("abcdefghij"), 5, 4, 0);
277    test(S(""), 1, 0, S("abcdefghij"), 5, 5, 0);
278    test(S(""), 1, 0, S("abcdefghij"), 5, 6, 0);
279    test(S(""), 1, 0, S("abcdefghij"), 9, 0, 0);
280    test(S(""), 1, 0, S("abcdefghij"), 9, 1, 0);
281    test(S(""), 1, 0, S("abcdefghij"), 9, 2, 0);
282    test(S(""), 1, 0, S("abcdefghij"), 10, 0, 0);
283    test(S(""), 1, 0, S("abcdefghij"), 10, 1, 0);
284    test(S(""), 1, 0, S("abcdefghij"), 11, 0, 0);
285    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
286    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, 0);
287}
288
289template <class S>
290void test2()
291{
292    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, 0);
293    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, 0);
294    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, 0);
295    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, 0);
296    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
297    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, 0);
298    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, 0);
299    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, 0);
300    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, 0);
301    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, 0);
302    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
303    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, 0);
304    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, 0);
305    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, 0);
306    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, 0);
307    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, 0);
308    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
309    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, 0);
310    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, 0);
311    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
312    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
313    test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
314    test(S("abcde"), 0, 0, S(""), 0, 0, 0);
315    test(S("abcde"), 0, 0, S(""), 0, 1, 0);
316    test(S("abcde"), 0, 0, S(""), 1, 0, 0);
317    test(S("abcde"), 0, 0, S("abcde"), 0, 0, 0);
318    test(S("abcde"), 0, 0, S("abcde"), 0, 1, -1);
319    test(S("abcde"), 0, 0, S("abcde"), 0, 2, -2);
320    test(S("abcde"), 0, 0, S("abcde"), 0, 4, -4);
321    test(S("abcde"), 0, 0, S("abcde"), 0, 5, -5);
322    test(S("abcde"), 0, 0, S("abcde"), 0, 6, -5);
323    test(S("abcde"), 0, 0, S("abcde"), 1, 0, 0);
324    test(S("abcde"), 0, 0, S("abcde"), 1, 1, -1);
325    test(S("abcde"), 0, 0, S("abcde"), 1, 2, -2);
326    test(S("abcde"), 0, 0, S("abcde"), 1, 3, -3);
327    test(S("abcde"), 0, 0, S("abcde"), 1, 4, -4);
328    test(S("abcde"), 0, 0, S("abcde"), 1, 5, -4);
329    test(S("abcde"), 0, 0, S("abcde"), 2, 0, 0);
330    test(S("abcde"), 0, 0, S("abcde"), 2, 1, -1);
331    test(S("abcde"), 0, 0, S("abcde"), 2, 2, -2);
332    test(S("abcde"), 0, 0, S("abcde"), 2, 3, -3);
333    test(S("abcde"), 0, 0, S("abcde"), 2, 4, -3);
334    test(S("abcde"), 0, 0, S("abcde"), 4, 0, 0);
335    test(S("abcde"), 0, 0, S("abcde"), 4, 1, -1);
336    test(S("abcde"), 0, 0, S("abcde"), 4, 2, -1);
337    test(S("abcde"), 0, 0, S("abcde"), 5, 0, 0);
338    test(S("abcde"), 0, 0, S("abcde"), 5, 1, 0);
339    test(S("abcde"), 0, 0, S("abcde"), 6, 0, 0);
340    test(S("abcde"), 0, 0, S("abcdefghij"), 0, 0, 0);
341    test(S("abcde"), 0, 0, S("abcdefghij"), 0, 1, -1);
342    test(S("abcde"), 0, 0, S("abcdefghij"), 0, 5, -5);
343    test(S("abcde"), 0, 0, S("abcdefghij"), 0, 9, -9);
344    test(S("abcde"), 0, 0, S("abcdefghij"), 0, 10, -10);
345    test(S("abcde"), 0, 0, S("abcdefghij"), 0, 11, -10);
346    test(S("abcde"), 0, 0, S("abcdefghij"), 1, 0, 0);
347    test(S("abcde"), 0, 0, S("abcdefghij"), 1, 1, -1);
348    test(S("abcde"), 0, 0, S("abcdefghij"), 1, 4, -4);
349    test(S("abcde"), 0, 0, S("abcdefghij"), 1, 8, -8);
350    test(S("abcde"), 0, 0, S("abcdefghij"), 1, 9, -9);
351    test(S("abcde"), 0, 0, S("abcdefghij"), 1, 10, -9);
352    test(S("abcde"), 0, 0, S("abcdefghij"), 5, 0, 0);
353    test(S("abcde"), 0, 0, S("abcdefghij"), 5, 1, -1);
354    test(S("abcde"), 0, 0, S("abcdefghij"), 5, 2, -2);
355    test(S("abcde"), 0, 0, S("abcdefghij"), 5, 4, -4);
356    test(S("abcde"), 0, 0, S("abcdefghij"), 5, 5, -5);
357    test(S("abcde"), 0, 0, S("abcdefghij"), 5, 6, -5);
358    test(S("abcde"), 0, 0, S("abcdefghij"), 9, 0, 0);
359    test(S("abcde"), 0, 0, S("abcdefghij"), 9, 1, -1);
360    test(S("abcde"), 0, 0, S("abcdefghij"), 9, 2, -1);
361    test(S("abcde"), 0, 0, S("abcdefghij"), 10, 0, 0);
362    test(S("abcde"), 0, 0, S("abcdefghij"), 10, 1, 0);
363    test(S("abcde"), 0, 0, S("abcdefghij"), 11, 0, 0);
364    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
365    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
366    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
367    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
368    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
369    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
370    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
371    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
372    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
373    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
374    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
375    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
376    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
377    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
378    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
379    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
380    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
381    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
382    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
383    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
384    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
385    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
386    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
387    test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
388    test(S("abcde"), 0, 1, S(""), 0, 0, 1);
389    test(S("abcde"), 0, 1, S(""), 0, 1, 1);
390    test(S("abcde"), 0, 1, S(""), 1, 0, 0);
391    test(S("abcde"), 0, 1, S("abcde"), 0, 0, 1);
392}
393
394template <class S>
395void test3()
396{
397    test(S("abcde"), 0, 1, S("abcde"), 0, 1, 0);
398    test(S("abcde"), 0, 1, S("abcde"), 0, 2, -1);
399    test(S("abcde"), 0, 1, S("abcde"), 0, 4, -3);
400    test(S("abcde"), 0, 1, S("abcde"), 0, 5, -4);
401    test(S("abcde"), 0, 1, S("abcde"), 0, 6, -4);
402    test(S("abcde"), 0, 1, S("abcde"), 1, 0, 1);
403    test(S("abcde"), 0, 1, S("abcde"), 1, 1, -1);
404    test(S("abcde"), 0, 1, S("abcde"), 1, 2, -1);
405    test(S("abcde"), 0, 1, S("abcde"), 1, 3, -1);
406    test(S("abcde"), 0, 1, S("abcde"), 1, 4, -1);
407    test(S("abcde"), 0, 1, S("abcde"), 1, 5, -1);
408    test(S("abcde"), 0, 1, S("abcde"), 2, 0, 1);
409    test(S("abcde"), 0, 1, S("abcde"), 2, 1, -2);
410    test(S("abcde"), 0, 1, S("abcde"), 2, 2, -2);
411    test(S("abcde"), 0, 1, S("abcde"), 2, 3, -2);
412    test(S("abcde"), 0, 1, S("abcde"), 2, 4, -2);
413    test(S("abcde"), 0, 1, S("abcde"), 4, 0, 1);
414    test(S("abcde"), 0, 1, S("abcde"), 4, 1, -4);
415    test(S("abcde"), 0, 1, S("abcde"), 4, 2, -4);
416    test(S("abcde"), 0, 1, S("abcde"), 5, 0, 1);
417    test(S("abcde"), 0, 1, S("abcde"), 5, 1, 1);
418    test(S("abcde"), 0, 1, S("abcde"), 6, 0, 0);
419    test(S("abcde"), 0, 1, S("abcdefghij"), 0, 0, 1);
420    test(S("abcde"), 0, 1, S("abcdefghij"), 0, 1, 0);
421    test(S("abcde"), 0, 1, S("abcdefghij"), 0, 5, -4);
422    test(S("abcde"), 0, 1, S("abcdefghij"), 0, 9, -8);
423    test(S("abcde"), 0, 1, S("abcdefghij"), 0, 10, -9);
424    test(S("abcde"), 0, 1, S("abcdefghij"), 0, 11, -9);
425    test(S("abcde"), 0, 1, S("abcdefghij"), 1, 0, 1);
426    test(S("abcde"), 0, 1, S("abcdefghij"), 1, 1, -1);
427    test(S("abcde"), 0, 1, S("abcdefghij"), 1, 4, -1);
428    test(S("abcde"), 0, 1, S("abcdefghij"), 1, 8, -1);
429    test(S("abcde"), 0, 1, S("abcdefghij"), 1, 9, -1);
430    test(S("abcde"), 0, 1, S("abcdefghij"), 1, 10, -1);
431    test(S("abcde"), 0, 1, S("abcdefghij"), 5, 0, 1);
432    test(S("abcde"), 0, 1, S("abcdefghij"), 5, 1, -5);
433    test(S("abcde"), 0, 1, S("abcdefghij"), 5, 2, -5);
434    test(S("abcde"), 0, 1, S("abcdefghij"), 5, 4, -5);
435    test(S("abcde"), 0, 1, S("abcdefghij"), 5, 5, -5);
436    test(S("abcde"), 0, 1, S("abcdefghij"), 5, 6, -5);
437    test(S("abcde"), 0, 1, S("abcdefghij"), 9, 0, 1);
438    test(S("abcde"), 0, 1, S("abcdefghij"), 9, 1, -9);
439    test(S("abcde"), 0, 1, S("abcdefghij"), 9, 2, -9);
440    test(S("abcde"), 0, 1, S("abcdefghij"), 10, 0, 1);
441    test(S("abcde"), 0, 1, S("abcdefghij"), 10, 1, 1);
442    test(S("abcde"), 0, 1, S("abcdefghij"), 11, 0, 0);
443    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
444    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, 0);
445    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -9);
446    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -18);
447    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -19);
448    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -19);
449    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
450    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
451    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -1);
452    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -1);
453    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -1);
454    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -1);
455    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
456    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -10);
457    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -10);
458    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -10);
459    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
460    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
461    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
462    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -19);
463    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -19);
464    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
465    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
466    test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
467    test(S("abcde"), 0, 2, S(""), 0, 0, 2);
468    test(S("abcde"), 0, 2, S(""), 0, 1, 2);
469    test(S("abcde"), 0, 2, S(""), 1, 0, 0);
470    test(S("abcde"), 0, 2, S("abcde"), 0, 0, 2);
471    test(S("abcde"), 0, 2, S("abcde"), 0, 1, 1);
472    test(S("abcde"), 0, 2, S("abcde"), 0, 2, 0);
473    test(S("abcde"), 0, 2, S("abcde"), 0, 4, -2);
474    test(S("abcde"), 0, 2, S("abcde"), 0, 5, -3);
475    test(S("abcde"), 0, 2, S("abcde"), 0, 6, -3);
476    test(S("abcde"), 0, 2, S("abcde"), 1, 0, 2);
477    test(S("abcde"), 0, 2, S("abcde"), 1, 1, -1);
478    test(S("abcde"), 0, 2, S("abcde"), 1, 2, -1);
479    test(S("abcde"), 0, 2, S("abcde"), 1, 3, -1);
480    test(S("abcde"), 0, 2, S("abcde"), 1, 4, -1);
481    test(S("abcde"), 0, 2, S("abcde"), 1, 5, -1);
482    test(S("abcde"), 0, 2, S("abcde"), 2, 0, 2);
483    test(S("abcde"), 0, 2, S("abcde"), 2, 1, -2);
484    test(S("abcde"), 0, 2, S("abcde"), 2, 2, -2);
485    test(S("abcde"), 0, 2, S("abcde"), 2, 3, -2);
486    test(S("abcde"), 0, 2, S("abcde"), 2, 4, -2);
487    test(S("abcde"), 0, 2, S("abcde"), 4, 0, 2);
488    test(S("abcde"), 0, 2, S("abcde"), 4, 1, -4);
489    test(S("abcde"), 0, 2, S("abcde"), 4, 2, -4);
490    test(S("abcde"), 0, 2, S("abcde"), 5, 0, 2);
491    test(S("abcde"), 0, 2, S("abcde"), 5, 1, 2);
492    test(S("abcde"), 0, 2, S("abcde"), 6, 0, 0);
493    test(S("abcde"), 0, 2, S("abcdefghij"), 0, 0, 2);
494    test(S("abcde"), 0, 2, S("abcdefghij"), 0, 1, 1);
495    test(S("abcde"), 0, 2, S("abcdefghij"), 0, 5, -3);
496    test(S("abcde"), 0, 2, S("abcdefghij"), 0, 9, -7);
497}
498
499template <class S>
500void test4()
501{
502    test(S("abcde"), 0, 2, S("abcdefghij"), 0, 10, -8);
503    test(S("abcde"), 0, 2, S("abcdefghij"), 0, 11, -8);
504    test(S("abcde"), 0, 2, S("abcdefghij"), 1, 0, 2);
505    test(S("abcde"), 0, 2, S("abcdefghij"), 1, 1, -1);
506    test(S("abcde"), 0, 2, S("abcdefghij"), 1, 4, -1);
507    test(S("abcde"), 0, 2, S("abcdefghij"), 1, 8, -1);
508    test(S("abcde"), 0, 2, S("abcdefghij"), 1, 9, -1);
509    test(S("abcde"), 0, 2, S("abcdefghij"), 1, 10, -1);
510    test(S("abcde"), 0, 2, S("abcdefghij"), 5, 0, 2);
511    test(S("abcde"), 0, 2, S("abcdefghij"), 5, 1, -5);
512    test(S("abcde"), 0, 2, S("abcdefghij"), 5, 2, -5);
513    test(S("abcde"), 0, 2, S("abcdefghij"), 5, 4, -5);
514    test(S("abcde"), 0, 2, S("abcdefghij"), 5, 5, -5);
515    test(S("abcde"), 0, 2, S("abcdefghij"), 5, 6, -5);
516    test(S("abcde"), 0, 2, S("abcdefghij"), 9, 0, 2);
517    test(S("abcde"), 0, 2, S("abcdefghij"), 9, 1, -9);
518    test(S("abcde"), 0, 2, S("abcdefghij"), 9, 2, -9);
519    test(S("abcde"), 0, 2, S("abcdefghij"), 10, 0, 2);
520    test(S("abcde"), 0, 2, S("abcdefghij"), 10, 1, 2);
521    test(S("abcde"), 0, 2, S("abcdefghij"), 11, 0, 0);
522    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 0, 2);
523    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 1, 1);
524    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 10, -8);
525    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 19, -17);
526    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 20, -18);
527    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 21, -18);
528    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 0, 2);
529    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 1, -1);
530    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 9, -1);
531    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 18, -1);
532    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 19, -1);
533    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 20, -1);
534    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 0, 2);
535    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 1, -10);
536    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 5, -10);
537    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 9, -10);
538    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 10, -10);
539    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 11, -10);
540    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 19, 0, 2);
541    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 19, 1, -19);
542    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 19, 2, -19);
543    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 20, 0, 2);
544    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 20, 1, 2);
545    test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
546    test(S("abcde"), 0, 4, S(""), 0, 0, 4);
547    test(S("abcde"), 0, 4, S(""), 0, 1, 4);
548    test(S("abcde"), 0, 4, S(""), 1, 0, 0);
549    test(S("abcde"), 0, 4, S("abcde"), 0, 0, 4);
550    test(S("abcde"), 0, 4, S("abcde"), 0, 1, 3);
551    test(S("abcde"), 0, 4, S("abcde"), 0, 2, 2);
552    test(S("abcde"), 0, 4, S("abcde"), 0, 4, 0);
553    test(S("abcde"), 0, 4, S("abcde"), 0, 5, -1);
554    test(S("abcde"), 0, 4, S("abcde"), 0, 6, -1);
555    test(S("abcde"), 0, 4, S("abcde"), 1, 0, 4);
556    test(S("abcde"), 0, 4, S("abcde"), 1, 1, -1);
557    test(S("abcde"), 0, 4, S("abcde"), 1, 2, -1);
558    test(S("abcde"), 0, 4, S("abcde"), 1, 3, -1);
559    test(S("abcde"), 0, 4, S("abcde"), 1, 4, -1);
560    test(S("abcde"), 0, 4, S("abcde"), 1, 5, -1);
561    test(S("abcde"), 0, 4, S("abcde"), 2, 0, 4);
562    test(S("abcde"), 0, 4, S("abcde"), 2, 1, -2);
563    test(S("abcde"), 0, 4, S("abcde"), 2, 2, -2);
564    test(S("abcde"), 0, 4, S("abcde"), 2, 3, -2);
565    test(S("abcde"), 0, 4, S("abcde"), 2, 4, -2);
566    test(S("abcde"), 0, 4, S("abcde"), 4, 0, 4);
567    test(S("abcde"), 0, 4, S("abcde"), 4, 1, -4);
568    test(S("abcde"), 0, 4, S("abcde"), 4, 2, -4);
569    test(S("abcde"), 0, 4, S("abcde"), 5, 0, 4);
570    test(S("abcde"), 0, 4, S("abcde"), 5, 1, 4);
571    test(S("abcde"), 0, 4, S("abcde"), 6, 0, 0);
572    test(S("abcde"), 0, 4, S("abcdefghij"), 0, 0, 4);
573    test(S("abcde"), 0, 4, S("abcdefghij"), 0, 1, 3);
574    test(S("abcde"), 0, 4, S("abcdefghij"), 0, 5, -1);
575    test(S("abcde"), 0, 4, S("abcdefghij"), 0, 9, -5);
576    test(S("abcde"), 0, 4, S("abcdefghij"), 0, 10, -6);
577    test(S("abcde"), 0, 4, S("abcdefghij"), 0, 11, -6);
578    test(S("abcde"), 0, 4, S("abcdefghij"), 1, 0, 4);
579    test(S("abcde"), 0, 4, S("abcdefghij"), 1, 1, -1);
580    test(S("abcde"), 0, 4, S("abcdefghij"), 1, 4, -1);
581    test(S("abcde"), 0, 4, S("abcdefghij"), 1, 8, -1);
582    test(S("abcde"), 0, 4, S("abcdefghij"), 1, 9, -1);
583    test(S("abcde"), 0, 4, S("abcdefghij"), 1, 10, -1);
584    test(S("abcde"), 0, 4, S("abcdefghij"), 5, 0, 4);
585    test(S("abcde"), 0, 4, S("abcdefghij"), 5, 1, -5);
586    test(S("abcde"), 0, 4, S("abcdefghij"), 5, 2, -5);
587    test(S("abcde"), 0, 4, S("abcdefghij"), 5, 4, -5);
588    test(S("abcde"), 0, 4, S("abcdefghij"), 5, 5, -5);
589    test(S("abcde"), 0, 4, S("abcdefghij"), 5, 6, -5);
590    test(S("abcde"), 0, 4, S("abcdefghij"), 9, 0, 4);
591    test(S("abcde"), 0, 4, S("abcdefghij"), 9, 1, -9);
592    test(S("abcde"), 0, 4, S("abcdefghij"), 9, 2, -9);
593    test(S("abcde"), 0, 4, S("abcdefghij"), 10, 0, 4);
594    test(S("abcde"), 0, 4, S("abcdefghij"), 10, 1, 4);
595    test(S("abcde"), 0, 4, S("abcdefghij"), 11, 0, 0);
596    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 0, 4);
597    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 1, 3);
598    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 10, -6);
599    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 19, -15);
600    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 20, -16);
601    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 21, -16);
602}
603
604template <class S>
605void test5()
606{
607    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 0, 4);
608    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 1, -1);
609    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 9, -1);
610    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 18, -1);
611    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 19, -1);
612    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 20, -1);
613    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 0, 4);
614    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 1, -10);
615    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 5, -10);
616    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 9, -10);
617    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 10, -10);
618    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 11, -10);
619    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 19, 0, 4);
620    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 19, 1, -19);
621    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 19, 2, -19);
622    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 20, 0, 4);
623    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 20, 1, 4);
624    test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
625    test(S("abcde"), 0, 5, S(""), 0, 0, 5);
626    test(S("abcde"), 0, 5, S(""), 0, 1, 5);
627    test(S("abcde"), 0, 5, S(""), 1, 0, 0);
628    test(S("abcde"), 0, 5, S("abcde"), 0, 0, 5);
629    test(S("abcde"), 0, 5, S("abcde"), 0, 1, 4);
630    test(S("abcde"), 0, 5, S("abcde"), 0, 2, 3);
631    test(S("abcde"), 0, 5, S("abcde"), 0, 4, 1);
632    test(S("abcde"), 0, 5, S("abcde"), 0, 5, 0);
633    test(S("abcde"), 0, 5, S("abcde"), 0, 6, 0);
634    test(S("abcde"), 0, 5, S("abcde"), 1, 0, 5);
635    test(S("abcde"), 0, 5, S("abcde"), 1, 1, -1);
636    test(S("abcde"), 0, 5, S("abcde"), 1, 2, -1);
637    test(S("abcde"), 0, 5, S("abcde"), 1, 3, -1);
638    test(S("abcde"), 0, 5, S("abcde"), 1, 4, -1);
639    test(S("abcde"), 0, 5, S("abcde"), 1, 5, -1);
640    test(S("abcde"), 0, 5, S("abcde"), 2, 0, 5);
641    test(S("abcde"), 0, 5, S("abcde"), 2, 1, -2);
642    test(S("abcde"), 0, 5, S("abcde"), 2, 2, -2);
643    test(S("abcde"), 0, 5, S("abcde"), 2, 3, -2);
644    test(S("abcde"), 0, 5, S("abcde"), 2, 4, -2);
645    test(S("abcde"), 0, 5, S("abcde"), 4, 0, 5);
646    test(S("abcde"), 0, 5, S("abcde"), 4, 1, -4);
647    test(S("abcde"), 0, 5, S("abcde"), 4, 2, -4);
648    test(S("abcde"), 0, 5, S("abcde"), 5, 0, 5);
649    test(S("abcde"), 0, 5, S("abcde"), 5, 1, 5);
650    test(S("abcde"), 0, 5, S("abcde"), 6, 0, 0);
651    test(S("abcde"), 0, 5, S("abcdefghij"), 0, 0, 5);
652    test(S("abcde"), 0, 5, S("abcdefghij"), 0, 1, 4);
653    test(S("abcde"), 0, 5, S("abcdefghij"), 0, 5, 0);
654    test(S("abcde"), 0, 5, S("abcdefghij"), 0, 9, -4);
655    test(S("abcde"), 0, 5, S("abcdefghij"), 0, 10, -5);
656    test(S("abcde"), 0, 5, S("abcdefghij"), 0, 11, -5);
657    test(S("abcde"), 0, 5, S("abcdefghij"), 1, 0, 5);
658    test(S("abcde"), 0, 5, S("abcdefghij"), 1, 1, -1);
659    test(S("abcde"), 0, 5, S("abcdefghij"), 1, 4, -1);
660    test(S("abcde"), 0, 5, S("abcdefghij"), 1, 8, -1);
661    test(S("abcde"), 0, 5, S("abcdefghij"), 1, 9, -1);
662    test(S("abcde"), 0, 5, S("abcdefghij"), 1, 10, -1);
663    test(S("abcde"), 0, 5, S("abcdefghij"), 5, 0, 5);
664    test(S("abcde"), 0, 5, S("abcdefghij"), 5, 1, -5);
665    test(S("abcde"), 0, 5, S("abcdefghij"), 5, 2, -5);
666    test(S("abcde"), 0, 5, S("abcdefghij"), 5, 4, -5);
667    test(S("abcde"), 0, 5, S("abcdefghij"), 5, 5, -5);
668    test(S("abcde"), 0, 5, S("abcdefghij"), 5, 6, -5);
669    test(S("abcde"), 0, 5, S("abcdefghij"), 9, 0, 5);
670    test(S("abcde"), 0, 5, S("abcdefghij"), 9, 1, -9);
671    test(S("abcde"), 0, 5, S("abcdefghij"), 9, 2, -9);
672    test(S("abcde"), 0, 5, S("abcdefghij"), 10, 0, 5);
673    test(S("abcde"), 0, 5, S("abcdefghij"), 10, 1, 5);
674    test(S("abcde"), 0, 5, S("abcdefghij"), 11, 0, 0);
675    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 0, 5);
676    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 1, 4);
677    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 10, -5);
678    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 19, -14);
679    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 20, -15);
680    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 21, -15);
681    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 0, 5);
682    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 1, -1);
683    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 9, -1);
684    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 18, -1);
685    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 19, -1);
686    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 20, -1);
687    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 0, 5);
688    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 1, -10);
689    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 5, -10);
690    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 9, -10);
691    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 10, -10);
692    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 11, -10);
693    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 19, 0, 5);
694    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 19, 1, -19);
695    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 19, 2, -19);
696    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 20, 0, 5);
697    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 20, 1, 5);
698    test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
699    test(S("abcde"), 0, 6, S(""), 0, 0, 5);
700    test(S("abcde"), 0, 6, S(""), 0, 1, 5);
701    test(S("abcde"), 0, 6, S(""), 1, 0, 0);
702    test(S("abcde"), 0, 6, S("abcde"), 0, 0, 5);
703    test(S("abcde"), 0, 6, S("abcde"), 0, 1, 4);
704    test(S("abcde"), 0, 6, S("abcde"), 0, 2, 3);
705    test(S("abcde"), 0, 6, S("abcde"), 0, 4, 1);
706    test(S("abcde"), 0, 6, S("abcde"), 0, 5, 0);
707}
708
709template <class S>
710void test6()
711{
712    test(S("abcde"), 0, 6, S("abcde"), 0, 6, 0);
713    test(S("abcde"), 0, 6, S("abcde"), 1, 0, 5);
714    test(S("abcde"), 0, 6, S("abcde"), 1, 1, -1);
715    test(S("abcde"), 0, 6, S("abcde"), 1, 2, -1);
716    test(S("abcde"), 0, 6, S("abcde"), 1, 3, -1);
717    test(S("abcde"), 0, 6, S("abcde"), 1, 4, -1);
718    test(S("abcde"), 0, 6, S("abcde"), 1, 5, -1);
719    test(S("abcde"), 0, 6, S("abcde"), 2, 0, 5);
720    test(S("abcde"), 0, 6, S("abcde"), 2, 1, -2);
721    test(S("abcde"), 0, 6, S("abcde"), 2, 2, -2);
722    test(S("abcde"), 0, 6, S("abcde"), 2, 3, -2);
723    test(S("abcde"), 0, 6, S("abcde"), 2, 4, -2);
724    test(S("abcde"), 0, 6, S("abcde"), 4, 0, 5);
725    test(S("abcde"), 0, 6, S("abcde"), 4, 1, -4);
726    test(S("abcde"), 0, 6, S("abcde"), 4, 2, -4);
727    test(S("abcde"), 0, 6, S("abcde"), 5, 0, 5);
728    test(S("abcde"), 0, 6, S("abcde"), 5, 1, 5);
729    test(S("abcde"), 0, 6, S("abcde"), 6, 0, 0);
730    test(S("abcde"), 0, 6, S("abcdefghij"), 0, 0, 5);
731    test(S("abcde"), 0, 6, S("abcdefghij"), 0, 1, 4);
732    test(S("abcde"), 0, 6, S("abcdefghij"), 0, 5, 0);
733    test(S("abcde"), 0, 6, S("abcdefghij"), 0, 9, -4);
734    test(S("abcde"), 0, 6, S("abcdefghij"), 0, 10, -5);
735    test(S("abcde"), 0, 6, S("abcdefghij"), 0, 11, -5);
736    test(S("abcde"), 0, 6, S("abcdefghij"), 1, 0, 5);
737    test(S("abcde"), 0, 6, S("abcdefghij"), 1, 1, -1);
738    test(S("abcde"), 0, 6, S("abcdefghij"), 1, 4, -1);
739    test(S("abcde"), 0, 6, S("abcdefghij"), 1, 8, -1);
740    test(S("abcde"), 0, 6, S("abcdefghij"), 1, 9, -1);
741    test(S("abcde"), 0, 6, S("abcdefghij"), 1, 10, -1);
742    test(S("abcde"), 0, 6, S("abcdefghij"), 5, 0, 5);
743    test(S("abcde"), 0, 6, S("abcdefghij"), 5, 1, -5);
744    test(S("abcde"), 0, 6, S("abcdefghij"), 5, 2, -5);
745    test(S("abcde"), 0, 6, S("abcdefghij"), 5, 4, -5);
746    test(S("abcde"), 0, 6, S("abcdefghij"), 5, 5, -5);
747    test(S("abcde"), 0, 6, S("abcdefghij"), 5, 6, -5);
748    test(S("abcde"), 0, 6, S("abcdefghij"), 9, 0, 5);
749    test(S("abcde"), 0, 6, S("abcdefghij"), 9, 1, -9);
750    test(S("abcde"), 0, 6, S("abcdefghij"), 9, 2, -9);
751    test(S("abcde"), 0, 6, S("abcdefghij"), 10, 0, 5);
752    test(S("abcde"), 0, 6, S("abcdefghij"), 10, 1, 5);
753    test(S("abcde"), 0, 6, S("abcdefghij"), 11, 0, 0);
754    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 0, 5);
755    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 1, 4);
756    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 10, -5);
757    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 19, -14);
758    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 20, -15);
759    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 21, -15);
760    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 0, 5);
761    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 1, -1);
762    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 9, -1);
763    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 18, -1);
764    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 19, -1);
765    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 20, -1);
766    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 0, 5);
767    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 1, -10);
768    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 5, -10);
769    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 9, -10);
770    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 10, -10);
771    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 11, -10);
772    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 19, 0, 5);
773    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 19, 1, -19);
774    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 19, 2, -19);
775    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 20, 0, 5);
776    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 20, 1, 5);
777    test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 21, 0, 0);
778    test(S("abcde"), 1, 0, S(""), 0, 0, 0);
779    test(S("abcde"), 1, 0, S(""), 0, 1, 0);
780    test(S("abcde"), 1, 0, S(""), 1, 0, 0);
781    test(S("abcde"), 1, 0, S("abcde"), 0, 0, 0);
782    test(S("abcde"), 1, 0, S("abcde"), 0, 1, -1);
783    test(S("abcde"), 1, 0, S("abcde"), 0, 2, -2);
784    test(S("abcde"), 1, 0, S("abcde"), 0, 4, -4);
785    test(S("abcde"), 1, 0, S("abcde"), 0, 5, -5);
786    test(S("abcde"), 1, 0, S("abcde"), 0, 6, -5);
787    test(S("abcde"), 1, 0, S("abcde"), 1, 0, 0);
788    test(S("abcde"), 1, 0, S("abcde"), 1, 1, -1);
789    test(S("abcde"), 1, 0, S("abcde"), 1, 2, -2);
790    test(S("abcde"), 1, 0, S("abcde"), 1, 3, -3);
791    test(S("abcde"), 1, 0, S("abcde"), 1, 4, -4);
792    test(S("abcde"), 1, 0, S("abcde"), 1, 5, -4);
793    test(S("abcde"), 1, 0, S("abcde"), 2, 0, 0);
794    test(S("abcde"), 1, 0, S("abcde"), 2, 1, -1);
795    test(S("abcde"), 1, 0, S("abcde"), 2, 2, -2);
796    test(S("abcde"), 1, 0, S("abcde"), 2, 3, -3);
797    test(S("abcde"), 1, 0, S("abcde"), 2, 4, -3);
798    test(S("abcde"), 1, 0, S("abcde"), 4, 0, 0);
799    test(S("abcde"), 1, 0, S("abcde"), 4, 1, -1);
800    test(S("abcde"), 1, 0, S("abcde"), 4, 2, -1);
801    test(S("abcde"), 1, 0, S("abcde"), 5, 0, 0);
802    test(S("abcde"), 1, 0, S("abcde"), 5, 1, 0);
803    test(S("abcde"), 1, 0, S("abcde"), 6, 0, 0);
804    test(S("abcde"), 1, 0, S("abcdefghij"), 0, 0, 0);
805    test(S("abcde"), 1, 0, S("abcdefghij"), 0, 1, -1);
806    test(S("abcde"), 1, 0, S("abcdefghij"), 0, 5, -5);
807    test(S("abcde"), 1, 0, S("abcdefghij"), 0, 9, -9);
808    test(S("abcde"), 1, 0, S("abcdefghij"), 0, 10, -10);
809    test(S("abcde"), 1, 0, S("abcdefghij"), 0, 11, -10);
810    test(S("abcde"), 1, 0, S("abcdefghij"), 1, 0, 0);
811    test(S("abcde"), 1, 0, S("abcdefghij"), 1, 1, -1);
812}
813
814template <class S>
815void test7()
816{
817    test(S("abcde"), 1, 0, S("abcdefghij"), 1, 4, -4);
818    test(S("abcde"), 1, 0, S("abcdefghij"), 1, 8, -8);
819    test(S("abcde"), 1, 0, S("abcdefghij"), 1, 9, -9);
820    test(S("abcde"), 1, 0, S("abcdefghij"), 1, 10, -9);
821    test(S("abcde"), 1, 0, S("abcdefghij"), 5, 0, 0);
822    test(S("abcde"), 1, 0, S("abcdefghij"), 5, 1, -1);
823    test(S("abcde"), 1, 0, S("abcdefghij"), 5, 2, -2);
824    test(S("abcde"), 1, 0, S("abcdefghij"), 5, 4, -4);
825    test(S("abcde"), 1, 0, S("abcdefghij"), 5, 5, -5);
826    test(S("abcde"), 1, 0, S("abcdefghij"), 5, 6, -5);
827    test(S("abcde"), 1, 0, S("abcdefghij"), 9, 0, 0);
828    test(S("abcde"), 1, 0, S("abcdefghij"), 9, 1, -1);
829    test(S("abcde"), 1, 0, S("abcdefghij"), 9, 2, -1);
830    test(S("abcde"), 1, 0, S("abcdefghij"), 10, 0, 0);
831    test(S("abcde"), 1, 0, S("abcdefghij"), 10, 1, 0);
832    test(S("abcde"), 1, 0, S("abcdefghij"), 11, 0, 0);
833    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
834    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
835    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
836    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
837    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
838    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
839    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
840    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
841    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
842    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
843    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
844    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
845    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
846    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
847    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
848    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
849    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
850    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
851    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
852    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
853    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
854    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
855    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
856    test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
857    test(S("abcde"), 1, 1, S(""), 0, 0, 1);
858    test(S("abcde"), 1, 1, S(""), 0, 1, 1);
859    test(S("abcde"), 1, 1, S(""), 1, 0, 0);
860    test(S("abcde"), 1, 1, S("abcde"), 0, 0, 1);
861    test(S("abcde"), 1, 1, S("abcde"), 0, 1, 1);
862    test(S("abcde"), 1, 1, S("abcde"), 0, 2, 1);
863    test(S("abcde"), 1, 1, S("abcde"), 0, 4, 1);
864    test(S("abcde"), 1, 1, S("abcde"), 0, 5, 1);
865    test(S("abcde"), 1, 1, S("abcde"), 0, 6, 1);
866    test(S("abcde"), 1, 1, S("abcde"), 1, 0, 1);
867    test(S("abcde"), 1, 1, S("abcde"), 1, 1, 0);
868    test(S("abcde"), 1, 1, S("abcde"), 1, 2, -1);
869    test(S("abcde"), 1, 1, S("abcde"), 1, 3, -2);
870    test(S("abcde"), 1, 1, S("abcde"), 1, 4, -3);
871    test(S("abcde"), 1, 1, S("abcde"), 1, 5, -3);
872    test(S("abcde"), 1, 1, S("abcde"), 2, 0, 1);
873    test(S("abcde"), 1, 1, S("abcde"), 2, 1, -1);
874    test(S("abcde"), 1, 1, S("abcde"), 2, 2, -1);
875    test(S("abcde"), 1, 1, S("abcde"), 2, 3, -1);
876    test(S("abcde"), 1, 1, S("abcde"), 2, 4, -1);
877    test(S("abcde"), 1, 1, S("abcde"), 4, 0, 1);
878    test(S("abcde"), 1, 1, S("abcde"), 4, 1, -3);
879    test(S("abcde"), 1, 1, S("abcde"), 4, 2, -3);
880    test(S("abcde"), 1, 1, S("abcde"), 5, 0, 1);
881    test(S("abcde"), 1, 1, S("abcde"), 5, 1, 1);
882    test(S("abcde"), 1, 1, S("abcde"), 6, 0, 0);
883    test(S("abcde"), 1, 1, S("abcdefghij"), 0, 0, 1);
884    test(S("abcde"), 1, 1, S("abcdefghij"), 0, 1, 1);
885    test(S("abcde"), 1, 1, S("abcdefghij"), 0, 5, 1);
886    test(S("abcde"), 1, 1, S("abcdefghij"), 0, 9, 1);
887    test(S("abcde"), 1, 1, S("abcdefghij"), 0, 10, 1);
888    test(S("abcde"), 1, 1, S("abcdefghij"), 0, 11, 1);
889    test(S("abcde"), 1, 1, S("abcdefghij"), 1, 0, 1);
890    test(S("abcde"), 1, 1, S("abcdefghij"), 1, 1, 0);
891    test(S("abcde"), 1, 1, S("abcdefghij"), 1, 4, -3);
892    test(S("abcde"), 1, 1, S("abcdefghij"), 1, 8, -7);
893    test(S("abcde"), 1, 1, S("abcdefghij"), 1, 9, -8);
894    test(S("abcde"), 1, 1, S("abcdefghij"), 1, 10, -8);
895    test(S("abcde"), 1, 1, S("abcdefghij"), 5, 0, 1);
896    test(S("abcde"), 1, 1, S("abcdefghij"), 5, 1, -4);
897    test(S("abcde"), 1, 1, S("abcdefghij"), 5, 2, -4);
898    test(S("abcde"), 1, 1, S("abcdefghij"), 5, 4, -4);
899    test(S("abcde"), 1, 1, S("abcdefghij"), 5, 5, -4);
900    test(S("abcde"), 1, 1, S("abcdefghij"), 5, 6, -4);
901    test(S("abcde"), 1, 1, S("abcdefghij"), 9, 0, 1);
902    test(S("abcde"), 1, 1, S("abcdefghij"), 9, 1, -8);
903    test(S("abcde"), 1, 1, S("abcdefghij"), 9, 2, -8);
904    test(S("abcde"), 1, 1, S("abcdefghij"), 10, 0, 1);
905    test(S("abcde"), 1, 1, S("abcdefghij"), 10, 1, 1);
906    test(S("abcde"), 1, 1, S("abcdefghij"), 11, 0, 0);
907    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
908    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 1, 1);
909    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 10, 1);
910    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 19, 1);
911    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 20, 1);
912    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 21, 1);
913    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
914    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 1, 0);
915    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 9, -8);
916    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 18, -17);
917}
918
919template <class S>
920void test8()
921{
922    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 19, -18);
923    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 20, -18);
924    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
925    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 1, -9);
926    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 5, -9);
927    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
928    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 10, -9);
929    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 11, -9);
930    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
931    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 19, 1, -18);
932    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 19, 2, -18);
933    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
934    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
935    test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
936    test(S("abcde"), 1, 2, S(""), 0, 0, 2);
937    test(S("abcde"), 1, 2, S(""), 0, 1, 2);
938    test(S("abcde"), 1, 2, S(""), 1, 0, 0);
939    test(S("abcde"), 1, 2, S("abcde"), 0, 0, 2);
940    test(S("abcde"), 1, 2, S("abcde"), 0, 1, 1);
941    test(S("abcde"), 1, 2, S("abcde"), 0, 2, 1);
942    test(S("abcde"), 1, 2, S("abcde"), 0, 4, 1);
943    test(S("abcde"), 1, 2, S("abcde"), 0, 5, 1);
944    test(S("abcde"), 1, 2, S("abcde"), 0, 6, 1);
945    test(S("abcde"), 1, 2, S("abcde"), 1, 0, 2);
946    test(S("abcde"), 1, 2, S("abcde"), 1, 1, 1);
947    test(S("abcde"), 1, 2, S("abcde"), 1, 2, 0);
948    test(S("abcde"), 1, 2, S("abcde"), 1, 3, -1);
949    test(S("abcde"), 1, 2, S("abcde"), 1, 4, -2);
950    test(S("abcde"), 1, 2, S("abcde"), 1, 5, -2);
951    test(S("abcde"), 1, 2, S("abcde"), 2, 0, 2);
952    test(S("abcde"), 1, 2, S("abcde"), 2, 1, -1);
953    test(S("abcde"), 1, 2, S("abcde"), 2, 2, -1);
954    test(S("abcde"), 1, 2, S("abcde"), 2, 3, -1);
955    test(S("abcde"), 1, 2, S("abcde"), 2, 4, -1);
956    test(S("abcde"), 1, 2, S("abcde"), 4, 0, 2);
957    test(S("abcde"), 1, 2, S("abcde"), 4, 1, -3);
958    test(S("abcde"), 1, 2, S("abcde"), 4, 2, -3);
959    test(S("abcde"), 1, 2, S("abcde"), 5, 0, 2);
960    test(S("abcde"), 1, 2, S("abcde"), 5, 1, 2);
961    test(S("abcde"), 1, 2, S("abcde"), 6, 0, 0);
962    test(S("abcde"), 1, 2, S("abcdefghij"), 0, 0, 2);
963    test(S("abcde"), 1, 2, S("abcdefghij"), 0, 1, 1);
964    test(S("abcde"), 1, 2, S("abcdefghij"), 0, 5, 1);
965    test(S("abcde"), 1, 2, S("abcdefghij"), 0, 9, 1);
966    test(S("abcde"), 1, 2, S("abcdefghij"), 0, 10, 1);
967    test(S("abcde"), 1, 2, S("abcdefghij"), 0, 11, 1);
968    test(S("abcde"), 1, 2, S("abcdefghij"), 1, 0, 2);
969    test(S("abcde"), 1, 2, S("abcdefghij"), 1, 1, 1);
970    test(S("abcde"), 1, 2, S("abcdefghij"), 1, 4, -2);
971    test(S("abcde"), 1, 2, S("abcdefghij"), 1, 8, -6);
972    test(S("abcde"), 1, 2, S("abcdefghij"), 1, 9, -7);
973    test(S("abcde"), 1, 2, S("abcdefghij"), 1, 10, -7);
974    test(S("abcde"), 1, 2, S("abcdefghij"), 5, 0, 2);
975    test(S("abcde"), 1, 2, S("abcdefghij"), 5, 1, -4);
976    test(S("abcde"), 1, 2, S("abcdefghij"), 5, 2, -4);
977    test(S("abcde"), 1, 2, S("abcdefghij"), 5, 4, -4);
978    test(S("abcde"), 1, 2, S("abcdefghij"), 5, 5, -4);
979    test(S("abcde"), 1, 2, S("abcdefghij"), 5, 6, -4);
980    test(S("abcde"), 1, 2, S("abcdefghij"), 9, 0, 2);
981    test(S("abcde"), 1, 2, S("abcdefghij"), 9, 1, -8);
982    test(S("abcde"), 1, 2, S("abcdefghij"), 9, 2, -8);
983    test(S("abcde"), 1, 2, S("abcdefghij"), 10, 0, 2);
984    test(S("abcde"), 1, 2, S("abcdefghij"), 10, 1, 2);
985    test(S("abcde"), 1, 2, S("abcdefghij"), 11, 0, 0);
986    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 0, 2);
987    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 1, 1);
988    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 10, 1);
989    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 19, 1);
990    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 20, 1);
991    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 21, 1);
992    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 0, 2);
993    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 1, 1);
994    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 9, -7);
995    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 18, -16);
996    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 19, -17);
997    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 20, -17);
998    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 0, 2);
999    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 1, -9);
1000    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 5, -9);
1001    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 9, -9);
1002    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 10, -9);
1003    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 11, -9);
1004    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 19, 0, 2);
1005    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 19, 1, -18);
1006    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 19, 2, -18);
1007    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 20, 0, 2);
1008    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 20, 1, 2);
1009    test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
1010    test(S("abcde"), 1, 3, S(""), 0, 0, 3);
1011    test(S("abcde"), 1, 3, S(""), 0, 1, 3);
1012    test(S("abcde"), 1, 3, S(""), 1, 0, 0);
1013    test(S("abcde"), 1, 3, S("abcde"), 0, 0, 3);
1014    test(S("abcde"), 1, 3, S("abcde"), 0, 1, 1);
1015    test(S("abcde"), 1, 3, S("abcde"), 0, 2, 1);
1016    test(S("abcde"), 1, 3, S("abcde"), 0, 4, 1);
1017    test(S("abcde"), 1, 3, S("abcde"), 0, 5, 1);
1018    test(S("abcde"), 1, 3, S("abcde"), 0, 6, 1);
1019    test(S("abcde"), 1, 3, S("abcde"), 1, 0, 3);
1020    test(S("abcde"), 1, 3, S("abcde"), 1, 1, 2);
1021    test(S("abcde"), 1, 3, S("abcde"), 1, 2, 1);
1022}
1023
1024template <class S>
1025void test9()
1026{
1027    test(S("abcde"), 1, 3, S("abcde"), 1, 3, 0);
1028    test(S("abcde"), 1, 3, S("abcde"), 1, 4, -1);
1029    test(S("abcde"), 1, 3, S("abcde"), 1, 5, -1);
1030    test(S("abcde"), 1, 3, S("abcde"), 2, 0, 3);
1031    test(S("abcde"), 1, 3, S("abcde"), 2, 1, -1);
1032    test(S("abcde"), 1, 3, S("abcde"), 2, 2, -1);
1033    test(S("abcde"), 1, 3, S("abcde"), 2, 3, -1);
1034    test(S("abcde"), 1, 3, S("abcde"), 2, 4, -1);
1035    test(S("abcde"), 1, 3, S("abcde"), 4, 0, 3);
1036    test(S("abcde"), 1, 3, S("abcde"), 4, 1, -3);
1037    test(S("abcde"), 1, 3, S("abcde"), 4, 2, -3);
1038    test(S("abcde"), 1, 3, S("abcde"), 5, 0, 3);
1039    test(S("abcde"), 1, 3, S("abcde"), 5, 1, 3);
1040    test(S("abcde"), 1, 3, S("abcde"), 6, 0, 0);
1041    test(S("abcde"), 1, 3, S("abcdefghij"), 0, 0, 3);
1042    test(S("abcde"), 1, 3, S("abcdefghij"), 0, 1, 1);
1043    test(S("abcde"), 1, 3, S("abcdefghij"), 0, 5, 1);
1044    test(S("abcde"), 1, 3, S("abcdefghij"), 0, 9, 1);
1045    test(S("abcde"), 1, 3, S("abcdefghij"), 0, 10, 1);
1046    test(S("abcde"), 1, 3, S("abcdefghij"), 0, 11, 1);
1047    test(S("abcde"), 1, 3, S("abcdefghij"), 1, 0, 3);
1048    test(S("abcde"), 1, 3, S("abcdefghij"), 1, 1, 2);
1049    test(S("abcde"), 1, 3, S("abcdefghij"), 1, 4, -1);
1050    test(S("abcde"), 1, 3, S("abcdefghij"), 1, 8, -5);
1051    test(S("abcde"), 1, 3, S("abcdefghij"), 1, 9, -6);
1052    test(S("abcde"), 1, 3, S("abcdefghij"), 1, 10, -6);
1053    test(S("abcde"), 1, 3, S("abcdefghij"), 5, 0, 3);
1054    test(S("abcde"), 1, 3, S("abcdefghij"), 5, 1, -4);
1055    test(S("abcde"), 1, 3, S("abcdefghij"), 5, 2, -4);
1056    test(S("abcde"), 1, 3, S("abcdefghij"), 5, 4, -4);
1057    test(S("abcde"), 1, 3, S("abcdefghij"), 5, 5, -4);
1058    test(S("abcde"), 1, 3, S("abcdefghij"), 5, 6, -4);
1059    test(S("abcde"), 1, 3, S("abcdefghij"), 9, 0, 3);
1060    test(S("abcde"), 1, 3, S("abcdefghij"), 9, 1, -8);
1061    test(S("abcde"), 1, 3, S("abcdefghij"), 9, 2, -8);
1062    test(S("abcde"), 1, 3, S("abcdefghij"), 10, 0, 3);
1063    test(S("abcde"), 1, 3, S("abcdefghij"), 10, 1, 3);
1064    test(S("abcde"), 1, 3, S("abcdefghij"), 11, 0, 0);
1065    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 0, 3);
1066    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 1, 1);
1067    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 10, 1);
1068    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 19, 1);
1069    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 20, 1);
1070    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 21, 1);
1071    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 0, 3);
1072    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 1, 2);
1073    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 9, -6);
1074    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 18, -15);
1075    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 19, -16);
1076    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 20, -16);
1077    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 0, 3);
1078    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 1, -9);
1079    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 5, -9);
1080    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 9, -9);
1081    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 10, -9);
1082    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 11, -9);
1083    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 19, 0, 3);
1084    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 19, 1, -18);
1085    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 19, 2, -18);
1086    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 20, 0, 3);
1087    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 20, 1, 3);
1088    test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 21, 0, 0);
1089    test(S("abcde"), 1, 4, S(""), 0, 0, 4);
1090    test(S("abcde"), 1, 4, S(""), 0, 1, 4);
1091    test(S("abcde"), 1, 4, S(""), 1, 0, 0);
1092    test(S("abcde"), 1, 4, S("abcde"), 0, 0, 4);
1093    test(S("abcde"), 1, 4, S("abcde"), 0, 1, 1);
1094    test(S("abcde"), 1, 4, S("abcde"), 0, 2, 1);
1095    test(S("abcde"), 1, 4, S("abcde"), 0, 4, 1);
1096    test(S("abcde"), 1, 4, S("abcde"), 0, 5, 1);
1097    test(S("abcde"), 1, 4, S("abcde"), 0, 6, 1);
1098    test(S("abcde"), 1, 4, S("abcde"), 1, 0, 4);
1099    test(S("abcde"), 1, 4, S("abcde"), 1, 1, 3);
1100    test(S("abcde"), 1, 4, S("abcde"), 1, 2, 2);
1101    test(S("abcde"), 1, 4, S("abcde"), 1, 3, 1);
1102    test(S("abcde"), 1, 4, S("abcde"), 1, 4, 0);
1103    test(S("abcde"), 1, 4, S("abcde"), 1, 5, 0);
1104    test(S("abcde"), 1, 4, S("abcde"), 2, 0, 4);
1105    test(S("abcde"), 1, 4, S("abcde"), 2, 1, -1);
1106    test(S("abcde"), 1, 4, S("abcde"), 2, 2, -1);
1107    test(S("abcde"), 1, 4, S("abcde"), 2, 3, -1);
1108    test(S("abcde"), 1, 4, S("abcde"), 2, 4, -1);
1109    test(S("abcde"), 1, 4, S("abcde"), 4, 0, 4);
1110    test(S("abcde"), 1, 4, S("abcde"), 4, 1, -3);
1111    test(S("abcde"), 1, 4, S("abcde"), 4, 2, -3);
1112    test(S("abcde"), 1, 4, S("abcde"), 5, 0, 4);
1113    test(S("abcde"), 1, 4, S("abcde"), 5, 1, 4);
1114    test(S("abcde"), 1, 4, S("abcde"), 6, 0, 0);
1115    test(S("abcde"), 1, 4, S("abcdefghij"), 0, 0, 4);
1116    test(S("abcde"), 1, 4, S("abcdefghij"), 0, 1, 1);
1117    test(S("abcde"), 1, 4, S("abcdefghij"), 0, 5, 1);
1118    test(S("abcde"), 1, 4, S("abcdefghij"), 0, 9, 1);
1119    test(S("abcde"), 1, 4, S("abcdefghij"), 0, 10, 1);
1120    test(S("abcde"), 1, 4, S("abcdefghij"), 0, 11, 1);
1121    test(S("abcde"), 1, 4, S("abcdefghij"), 1, 0, 4);
1122    test(S("abcde"), 1, 4, S("abcdefghij"), 1, 1, 3);
1123    test(S("abcde"), 1, 4, S("abcdefghij"), 1, 4, 0);
1124    test(S("abcde"), 1, 4, S("abcdefghij"), 1, 8, -4);
1125    test(S("abcde"), 1, 4, S("abcdefghij"), 1, 9, -5);
1126    test(S("abcde"), 1, 4, S("abcdefghij"), 1, 10, -5);
1127}
1128
1129template <class S>
1130void test10()
1131{
1132    test(S("abcde"), 1, 4, S("abcdefghij"), 5, 0, 4);
1133    test(S("abcde"), 1, 4, S("abcdefghij"), 5, 1, -4);
1134    test(S("abcde"), 1, 4, S("abcdefghij"), 5, 2, -4);
1135    test(S("abcde"), 1, 4, S("abcdefghij"), 5, 4, -4);
1136    test(S("abcde"), 1, 4, S("abcdefghij"), 5, 5, -4);
1137    test(S("abcde"), 1, 4, S("abcdefghij"), 5, 6, -4);
1138    test(S("abcde"), 1, 4, S("abcdefghij"), 9, 0, 4);
1139    test(S("abcde"), 1, 4, S("abcdefghij"), 9, 1, -8);
1140    test(S("abcde"), 1, 4, S("abcdefghij"), 9, 2, -8);
1141    test(S("abcde"), 1, 4, S("abcdefghij"), 10, 0, 4);
1142    test(S("abcde"), 1, 4, S("abcdefghij"), 10, 1, 4);
1143    test(S("abcde"), 1, 4, S("abcdefghij"), 11, 0, 0);
1144    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 0, 4);
1145    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 1, 1);
1146    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 10, 1);
1147    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 19, 1);
1148    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 20, 1);
1149    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 21, 1);
1150    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 0, 4);
1151    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 1, 3);
1152    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 9, -5);
1153    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 18, -14);
1154    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 19, -15);
1155    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 20, -15);
1156    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 0, 4);
1157    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 1, -9);
1158    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 5, -9);
1159    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 9, -9);
1160    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 10, -9);
1161    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 11, -9);
1162    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 19, 0, 4);
1163    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 19, 1, -18);
1164    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 19, 2, -18);
1165    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 20, 0, 4);
1166    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 20, 1, 4);
1167    test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
1168    test(S("abcde"), 1, 5, S(""), 0, 0, 4);
1169    test(S("abcde"), 1, 5, S(""), 0, 1, 4);
1170    test(S("abcde"), 1, 5, S(""), 1, 0, 0);
1171    test(S("abcde"), 1, 5, S("abcde"), 0, 0, 4);
1172    test(S("abcde"), 1, 5, S("abcde"), 0, 1, 1);
1173    test(S("abcde"), 1, 5, S("abcde"), 0, 2, 1);
1174    test(S("abcde"), 1, 5, S("abcde"), 0, 4, 1);
1175    test(S("abcde"), 1, 5, S("abcde"), 0, 5, 1);
1176    test(S("abcde"), 1, 5, S("abcde"), 0, 6, 1);
1177    test(S("abcde"), 1, 5, S("abcde"), 1, 0, 4);
1178    test(S("abcde"), 1, 5, S("abcde"), 1, 1, 3);
1179    test(S("abcde"), 1, 5, S("abcde"), 1, 2, 2);
1180    test(S("abcde"), 1, 5, S("abcde"), 1, 3, 1);
1181    test(S("abcde"), 1, 5, S("abcde"), 1, 4, 0);
1182    test(S("abcde"), 1, 5, S("abcde"), 1, 5, 0);
1183    test(S("abcde"), 1, 5, S("abcde"), 2, 0, 4);
1184    test(S("abcde"), 1, 5, S("abcde"), 2, 1, -1);
1185    test(S("abcde"), 1, 5, S("abcde"), 2, 2, -1);
1186    test(S("abcde"), 1, 5, S("abcde"), 2, 3, -1);
1187    test(S("abcde"), 1, 5, S("abcde"), 2, 4, -1);
1188    test(S("abcde"), 1, 5, S("abcde"), 4, 0, 4);
1189    test(S("abcde"), 1, 5, S("abcde"), 4, 1, -3);
1190    test(S("abcde"), 1, 5, S("abcde"), 4, 2, -3);
1191    test(S("abcde"), 1, 5, S("abcde"), 5, 0, 4);
1192    test(S("abcde"), 1, 5, S("abcde"), 5, 1, 4);
1193    test(S("abcde"), 1, 5, S("abcde"), 6, 0, 0);
1194    test(S("abcde"), 1, 5, S("abcdefghij"), 0, 0, 4);
1195    test(S("abcde"), 1, 5, S("abcdefghij"), 0, 1, 1);
1196    test(S("abcde"), 1, 5, S("abcdefghij"), 0, 5, 1);
1197    test(S("abcde"), 1, 5, S("abcdefghij"), 0, 9, 1);
1198    test(S("abcde"), 1, 5, S("abcdefghij"), 0, 10, 1);
1199    test(S("abcde"), 1, 5, S("abcdefghij"), 0, 11, 1);
1200    test(S("abcde"), 1, 5, S("abcdefghij"), 1, 0, 4);
1201    test(S("abcde"), 1, 5, S("abcdefghij"), 1, 1, 3);
1202    test(S("abcde"), 1, 5, S("abcdefghij"), 1, 4, 0);
1203    test(S("abcde"), 1, 5, S("abcdefghij"), 1, 8, -4);
1204    test(S("abcde"), 1, 5, S("abcdefghij"), 1, 9, -5);
1205    test(S("abcde"), 1, 5, S("abcdefghij"), 1, 10, -5);
1206    test(S("abcde"), 1, 5, S("abcdefghij"), 5, 0, 4);
1207    test(S("abcde"), 1, 5, S("abcdefghij"), 5, 1, -4);
1208    test(S("abcde"), 1, 5, S("abcdefghij"), 5, 2, -4);
1209    test(S("abcde"), 1, 5, S("abcdefghij"), 5, 4, -4);
1210    test(S("abcde"), 1, 5, S("abcdefghij"), 5, 5, -4);
1211    test(S("abcde"), 1, 5, S("abcdefghij"), 5, 6, -4);
1212    test(S("abcde"), 1, 5, S("abcdefghij"), 9, 0, 4);
1213    test(S("abcde"), 1, 5, S("abcdefghij"), 9, 1, -8);
1214    test(S("abcde"), 1, 5, S("abcdefghij"), 9, 2, -8);
1215    test(S("abcde"), 1, 5, S("abcdefghij"), 10, 0, 4);
1216    test(S("abcde"), 1, 5, S("abcdefghij"), 10, 1, 4);
1217    test(S("abcde"), 1, 5, S("abcdefghij"), 11, 0, 0);
1218    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 0, 4);
1219    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 1, 1);
1220    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 10, 1);
1221    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 19, 1);
1222    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 20, 1);
1223    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 21, 1);
1224    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 0, 4);
1225    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 1, 3);
1226    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 9, -5);
1227    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 18, -14);
1228    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 19, -15);
1229    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 20, -15);
1230    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 0, 4);
1231    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 1, -9);
1232}
1233
1234template <class S>
1235void test11()
1236{
1237    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 5, -9);
1238    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 9, -9);
1239    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 10, -9);
1240    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 11, -9);
1241    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 19, 0, 4);
1242    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 19, 1, -18);
1243    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 19, 2, -18);
1244    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 20, 0, 4);
1245    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 20, 1, 4);
1246    test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
1247    test(S("abcde"), 2, 0, S(""), 0, 0, 0);
1248    test(S("abcde"), 2, 0, S(""), 0, 1, 0);
1249    test(S("abcde"), 2, 0, S(""), 1, 0, 0);
1250    test(S("abcde"), 2, 0, S("abcde"), 0, 0, 0);
1251    test(S("abcde"), 2, 0, S("abcde"), 0, 1, -1);
1252    test(S("abcde"), 2, 0, S("abcde"), 0, 2, -2);
1253    test(S("abcde"), 2, 0, S("abcde"), 0, 4, -4);
1254    test(S("abcde"), 2, 0, S("abcde"), 0, 5, -5);
1255    test(S("abcde"), 2, 0, S("abcde"), 0, 6, -5);
1256    test(S("abcde"), 2, 0, S("abcde"), 1, 0, 0);
1257    test(S("abcde"), 2, 0, S("abcde"), 1, 1, -1);
1258    test(S("abcde"), 2, 0, S("abcde"), 1, 2, -2);
1259    test(S("abcde"), 2, 0, S("abcde"), 1, 3, -3);
1260    test(S("abcde"), 2, 0, S("abcde"), 1, 4, -4);
1261    test(S("abcde"), 2, 0, S("abcde"), 1, 5, -4);
1262    test(S("abcde"), 2, 0, S("abcde"), 2, 0, 0);
1263    test(S("abcde"), 2, 0, S("abcde"), 2, 1, -1);
1264    test(S("abcde"), 2, 0, S("abcde"), 2, 2, -2);
1265    test(S("abcde"), 2, 0, S("abcde"), 2, 3, -3);
1266    test(S("abcde"), 2, 0, S("abcde"), 2, 4, -3);
1267    test(S("abcde"), 2, 0, S("abcde"), 4, 0, 0);
1268    test(S("abcde"), 2, 0, S("abcde"), 4, 1, -1);
1269    test(S("abcde"), 2, 0, S("abcde"), 4, 2, -1);
1270    test(S("abcde"), 2, 0, S("abcde"), 5, 0, 0);
1271    test(S("abcde"), 2, 0, S("abcde"), 5, 1, 0);
1272    test(S("abcde"), 2, 0, S("abcde"), 6, 0, 0);
1273    test(S("abcde"), 2, 0, S("abcdefghij"), 0, 0, 0);
1274    test(S("abcde"), 2, 0, S("abcdefghij"), 0, 1, -1);
1275    test(S("abcde"), 2, 0, S("abcdefghij"), 0, 5, -5);
1276    test(S("abcde"), 2, 0, S("abcdefghij"), 0, 9, -9);
1277    test(S("abcde"), 2, 0, S("abcdefghij"), 0, 10, -10);
1278    test(S("abcde"), 2, 0, S("abcdefghij"), 0, 11, -10);
1279    test(S("abcde"), 2, 0, S("abcdefghij"), 1, 0, 0);
1280    test(S("abcde"), 2, 0, S("abcdefghij"), 1, 1, -1);
1281    test(S("abcde"), 2, 0, S("abcdefghij"), 1, 4, -4);
1282    test(S("abcde"), 2, 0, S("abcdefghij"), 1, 8, -8);
1283    test(S("abcde"), 2, 0, S("abcdefghij"), 1, 9, -9);
1284    test(S("abcde"), 2, 0, S("abcdefghij"), 1, 10, -9);
1285    test(S("abcde"), 2, 0, S("abcdefghij"), 5, 0, 0);
1286    test(S("abcde"), 2, 0, S("abcdefghij"), 5, 1, -1);
1287    test(S("abcde"), 2, 0, S("abcdefghij"), 5, 2, -2);
1288    test(S("abcde"), 2, 0, S("abcdefghij"), 5, 4, -4);
1289    test(S("abcde"), 2, 0, S("abcdefghij"), 5, 5, -5);
1290    test(S("abcde"), 2, 0, S("abcdefghij"), 5, 6, -5);
1291    test(S("abcde"), 2, 0, S("abcdefghij"), 9, 0, 0);
1292    test(S("abcde"), 2, 0, S("abcdefghij"), 9, 1, -1);
1293    test(S("abcde"), 2, 0, S("abcdefghij"), 9, 2, -1);
1294    test(S("abcde"), 2, 0, S("abcdefghij"), 10, 0, 0);
1295    test(S("abcde"), 2, 0, S("abcdefghij"), 10, 1, 0);
1296    test(S("abcde"), 2, 0, S("abcdefghij"), 11, 0, 0);
1297    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
1298    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
1299    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
1300    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
1301    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
1302    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
1303    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
1304    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
1305    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
1306    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
1307    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
1308    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
1309    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
1310    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
1311    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
1312    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
1313    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
1314    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
1315    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
1316    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
1317    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
1318    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
1319    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
1320    test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
1321    test(S("abcde"), 2, 1, S(""), 0, 0, 1);
1322    test(S("abcde"), 2, 1, S(""), 0, 1, 1);
1323    test(S("abcde"), 2, 1, S(""), 1, 0, 0);
1324    test(S("abcde"), 2, 1, S("abcde"), 0, 0, 1);
1325    test(S("abcde"), 2, 1, S("abcde"), 0, 1, 2);
1326    test(S("abcde"), 2, 1, S("abcde"), 0, 2, 2);
1327    test(S("abcde"), 2, 1, S("abcde"), 0, 4, 2);
1328    test(S("abcde"), 2, 1, S("abcde"), 0, 5, 2);
1329    test(S("abcde"), 2, 1, S("abcde"), 0, 6, 2);
1330    test(S("abcde"), 2, 1, S("abcde"), 1, 0, 1);
1331    test(S("abcde"), 2, 1, S("abcde"), 1, 1, 1);
1332    test(S("abcde"), 2, 1, S("abcde"), 1, 2, 1);
1333    test(S("abcde"), 2, 1, S("abcde"), 1, 3, 1);
1334    test(S("abcde"), 2, 1, S("abcde"), 1, 4, 1);
1335    test(S("abcde"), 2, 1, S("abcde"), 1, 5, 1);
1336    test(S("abcde"), 2, 1, S("abcde"), 2, 0, 1);
1337}
1338
1339template <class S>
1340void test12()
1341{
1342    test(S("abcde"), 2, 1, S("abcde"), 2, 1, 0);
1343    test(S("abcde"), 2, 1, S("abcde"), 2, 2, -1);
1344    test(S("abcde"), 2, 1, S("abcde"), 2, 3, -2);
1345    test(S("abcde"), 2, 1, S("abcde"), 2, 4, -2);
1346    test(S("abcde"), 2, 1, S("abcde"), 4, 0, 1);
1347    test(S("abcde"), 2, 1, S("abcde"), 4, 1, -2);
1348    test(S("abcde"), 2, 1, S("abcde"), 4, 2, -2);
1349    test(S("abcde"), 2, 1, S("abcde"), 5, 0, 1);
1350    test(S("abcde"), 2, 1, S("abcde"), 5, 1, 1);
1351    test(S("abcde"), 2, 1, S("abcde"), 6, 0, 0);
1352    test(S("abcde"), 2, 1, S("abcdefghij"), 0, 0, 1);
1353    test(S("abcde"), 2, 1, S("abcdefghij"), 0, 1, 2);
1354    test(S("abcde"), 2, 1, S("abcdefghij"), 0, 5, 2);
1355    test(S("abcde"), 2, 1, S("abcdefghij"), 0, 9, 2);
1356    test(S("abcde"), 2, 1, S("abcdefghij"), 0, 10, 2);
1357    test(S("abcde"), 2, 1, S("abcdefghij"), 0, 11, 2);
1358    test(S("abcde"), 2, 1, S("abcdefghij"), 1, 0, 1);
1359    test(S("abcde"), 2, 1, S("abcdefghij"), 1, 1, 1);
1360    test(S("abcde"), 2, 1, S("abcdefghij"), 1, 4, 1);
1361    test(S("abcde"), 2, 1, S("abcdefghij"), 1, 8, 1);
1362    test(S("abcde"), 2, 1, S("abcdefghij"), 1, 9, 1);
1363    test(S("abcde"), 2, 1, S("abcdefghij"), 1, 10, 1);
1364    test(S("abcde"), 2, 1, S("abcdefghij"), 5, 0, 1);
1365    test(S("abcde"), 2, 1, S("abcdefghij"), 5, 1, -3);
1366    test(S("abcde"), 2, 1, S("abcdefghij"), 5, 2, -3);
1367    test(S("abcde"), 2, 1, S("abcdefghij"), 5, 4, -3);
1368    test(S("abcde"), 2, 1, S("abcdefghij"), 5, 5, -3);
1369    test(S("abcde"), 2, 1, S("abcdefghij"), 5, 6, -3);
1370    test(S("abcde"), 2, 1, S("abcdefghij"), 9, 0, 1);
1371    test(S("abcde"), 2, 1, S("abcdefghij"), 9, 1, -7);
1372    test(S("abcde"), 2, 1, S("abcdefghij"), 9, 2, -7);
1373    test(S("abcde"), 2, 1, S("abcdefghij"), 10, 0, 1);
1374    test(S("abcde"), 2, 1, S("abcdefghij"), 10, 1, 1);
1375    test(S("abcde"), 2, 1, S("abcdefghij"), 11, 0, 0);
1376    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
1377    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 1, 2);
1378    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 10, 2);
1379    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 19, 2);
1380    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 20, 2);
1381    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 21, 2);
1382    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
1383    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 1, 1);
1384    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 9, 1);
1385    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 18, 1);
1386    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 19, 1);
1387    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 20, 1);
1388    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
1389    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 1, -8);
1390    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 5, -8);
1391    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 9, -8);
1392    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 10, -8);
1393    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 11, -8);
1394    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
1395    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 19, 1, -17);
1396    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 19, 2, -17);
1397    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
1398    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
1399    test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
1400    test(S("abcde"), 2, 2, S(""), 0, 0, 2);
1401    test(S("abcde"), 2, 2, S(""), 0, 1, 2);
1402    test(S("abcde"), 2, 2, S(""), 1, 0, 0);
1403    test(S("abcde"), 2, 2, S("abcde"), 0, 0, 2);
1404    test(S("abcde"), 2, 2, S("abcde"), 0, 1, 2);
1405    test(S("abcde"), 2, 2, S("abcde"), 0, 2, 2);
1406    test(S("abcde"), 2, 2, S("abcde"), 0, 4, 2);
1407    test(S("abcde"), 2, 2, S("abcde"), 0, 5, 2);
1408    test(S("abcde"), 2, 2, S("abcde"), 0, 6, 2);
1409    test(S("abcde"), 2, 2, S("abcde"), 1, 0, 2);
1410    test(S("abcde"), 2, 2, S("abcde"), 1, 1, 1);
1411    test(S("abcde"), 2, 2, S("abcde"), 1, 2, 1);
1412    test(S("abcde"), 2, 2, S("abcde"), 1, 3, 1);
1413    test(S("abcde"), 2, 2, S("abcde"), 1, 4, 1);
1414    test(S("abcde"), 2, 2, S("abcde"), 1, 5, 1);
1415    test(S("abcde"), 2, 2, S("abcde"), 2, 0, 2);
1416    test(S("abcde"), 2, 2, S("abcde"), 2, 1, 1);
1417    test(S("abcde"), 2, 2, S("abcde"), 2, 2, 0);
1418    test(S("abcde"), 2, 2, S("abcde"), 2, 3, -1);
1419    test(S("abcde"), 2, 2, S("abcde"), 2, 4, -1);
1420    test(S("abcde"), 2, 2, S("abcde"), 4, 0, 2);
1421    test(S("abcde"), 2, 2, S("abcde"), 4, 1, -2);
1422    test(S("abcde"), 2, 2, S("abcde"), 4, 2, -2);
1423    test(S("abcde"), 2, 2, S("abcde"), 5, 0, 2);
1424    test(S("abcde"), 2, 2, S("abcde"), 5, 1, 2);
1425    test(S("abcde"), 2, 2, S("abcde"), 6, 0, 0);
1426    test(S("abcde"), 2, 2, S("abcdefghij"), 0, 0, 2);
1427    test(S("abcde"), 2, 2, S("abcdefghij"), 0, 1, 2);
1428    test(S("abcde"), 2, 2, S("abcdefghij"), 0, 5, 2);
1429    test(S("abcde"), 2, 2, S("abcdefghij"), 0, 9, 2);
1430    test(S("abcde"), 2, 2, S("abcdefghij"), 0, 10, 2);
1431    test(S("abcde"), 2, 2, S("abcdefghij"), 0, 11, 2);
1432    test(S("abcde"), 2, 2, S("abcdefghij"), 1, 0, 2);
1433    test(S("abcde"), 2, 2, S("abcdefghij"), 1, 1, 1);
1434    test(S("abcde"), 2, 2, S("abcdefghij"), 1, 4, 1);
1435    test(S("abcde"), 2, 2, S("abcdefghij"), 1, 8, 1);
1436    test(S("abcde"), 2, 2, S("abcdefghij"), 1, 9, 1);
1437    test(S("abcde"), 2, 2, S("abcdefghij"), 1, 10, 1);
1438    test(S("abcde"), 2, 2, S("abcdefghij"), 5, 0, 2);
1439    test(S("abcde"), 2, 2, S("abcdefghij"), 5, 1, -3);
1440    test(S("abcde"), 2, 2, S("abcdefghij"), 5, 2, -3);
1441    test(S("abcde"), 2, 2, S("abcdefghij"), 5, 4, -3);
1442}
1443
1444template <class S>
1445void test13()
1446{
1447    test(S("abcde"), 2, 2, S("abcdefghij"), 5, 5, -3);
1448    test(S("abcde"), 2, 2, S("abcdefghij"), 5, 6, -3);
1449    test(S("abcde"), 2, 2, S("abcdefghij"), 9, 0, 2);
1450    test(S("abcde"), 2, 2, S("abcdefghij"), 9, 1, -7);
1451    test(S("abcde"), 2, 2, S("abcdefghij"), 9, 2, -7);
1452    test(S("abcde"), 2, 2, S("abcdefghij"), 10, 0, 2);
1453    test(S("abcde"), 2, 2, S("abcdefghij"), 10, 1, 2);
1454    test(S("abcde"), 2, 2, S("abcdefghij"), 11, 0, 0);
1455    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 0, 2);
1456    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 1, 2);
1457    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 10, 2);
1458    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 19, 2);
1459    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 20, 2);
1460    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 21, 2);
1461    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 0, 2);
1462    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 1, 1);
1463    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 9, 1);
1464    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 18, 1);
1465    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 19, 1);
1466    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 20, 1);
1467    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 0, 2);
1468    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 1, -8);
1469    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 5, -8);
1470    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 9, -8);
1471    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 10, -8);
1472    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 11, -8);
1473    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 19, 0, 2);
1474    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 19, 1, -17);
1475    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 19, 2, -17);
1476    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 20, 0, 2);
1477    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 20, 1, 2);
1478    test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
1479    test(S("abcde"), 2, 3, S(""), 0, 0, 3);
1480    test(S("abcde"), 2, 3, S(""), 0, 1, 3);
1481    test(S("abcde"), 2, 3, S(""), 1, 0, 0);
1482    test(S("abcde"), 2, 3, S("abcde"), 0, 0, 3);
1483    test(S("abcde"), 2, 3, S("abcde"), 0, 1, 2);
1484    test(S("abcde"), 2, 3, S("abcde"), 0, 2, 2);
1485    test(S("abcde"), 2, 3, S("abcde"), 0, 4, 2);
1486    test(S("abcde"), 2, 3, S("abcde"), 0, 5, 2);
1487    test(S("abcde"), 2, 3, S("abcde"), 0, 6, 2);
1488    test(S("abcde"), 2, 3, S("abcde"), 1, 0, 3);
1489    test(S("abcde"), 2, 3, S("abcde"), 1, 1, 1);
1490    test(S("abcde"), 2, 3, S("abcde"), 1, 2, 1);
1491    test(S("abcde"), 2, 3, S("abcde"), 1, 3, 1);
1492    test(S("abcde"), 2, 3, S("abcde"), 1, 4, 1);
1493    test(S("abcde"), 2, 3, S("abcde"), 1, 5, 1);
1494    test(S("abcde"), 2, 3, S("abcde"), 2, 0, 3);
1495    test(S("abcde"), 2, 3, S("abcde"), 2, 1, 2);
1496    test(S("abcde"), 2, 3, S("abcde"), 2, 2, 1);
1497    test(S("abcde"), 2, 3, S("abcde"), 2, 3, 0);
1498    test(S("abcde"), 2, 3, S("abcde"), 2, 4, 0);
1499    test(S("abcde"), 2, 3, S("abcde"), 4, 0, 3);
1500    test(S("abcde"), 2, 3, S("abcde"), 4, 1, -2);
1501    test(S("abcde"), 2, 3, S("abcde"), 4, 2, -2);
1502    test(S("abcde"), 2, 3, S("abcde"), 5, 0, 3);
1503    test(S("abcde"), 2, 3, S("abcde"), 5, 1, 3);
1504    test(S("abcde"), 2, 3, S("abcde"), 6, 0, 0);
1505    test(S("abcde"), 2, 3, S("abcdefghij"), 0, 0, 3);
1506    test(S("abcde"), 2, 3, S("abcdefghij"), 0, 1, 2);
1507    test(S("abcde"), 2, 3, S("abcdefghij"), 0, 5, 2);
1508    test(S("abcde"), 2, 3, S("abcdefghij"), 0, 9, 2);
1509    test(S("abcde"), 2, 3, S("abcdefghij"), 0, 10, 2);
1510    test(S("abcde"), 2, 3, S("abcdefghij"), 0, 11, 2);
1511    test(S("abcde"), 2, 3, S("abcdefghij"), 1, 0, 3);
1512    test(S("abcde"), 2, 3, S("abcdefghij"), 1, 1, 1);
1513    test(S("abcde"), 2, 3, S("abcdefghij"), 1, 4, 1);
1514    test(S("abcde"), 2, 3, S("abcdefghij"), 1, 8, 1);
1515    test(S("abcde"), 2, 3, S("abcdefghij"), 1, 9, 1);
1516    test(S("abcde"), 2, 3, S("abcdefghij"), 1, 10, 1);
1517    test(S("abcde"), 2, 3, S("abcdefghij"), 5, 0, 3);
1518    test(S("abcde"), 2, 3, S("abcdefghij"), 5, 1, -3);
1519    test(S("abcde"), 2, 3, S("abcdefghij"), 5, 2, -3);
1520    test(S("abcde"), 2, 3, S("abcdefghij"), 5, 4, -3);
1521    test(S("abcde"), 2, 3, S("abcdefghij"), 5, 5, -3);
1522    test(S("abcde"), 2, 3, S("abcdefghij"), 5, 6, -3);
1523    test(S("abcde"), 2, 3, S("abcdefghij"), 9, 0, 3);
1524    test(S("abcde"), 2, 3, S("abcdefghij"), 9, 1, -7);
1525    test(S("abcde"), 2, 3, S("abcdefghij"), 9, 2, -7);
1526    test(S("abcde"), 2, 3, S("abcdefghij"), 10, 0, 3);
1527    test(S("abcde"), 2, 3, S("abcdefghij"), 10, 1, 3);
1528    test(S("abcde"), 2, 3, S("abcdefghij"), 11, 0, 0);
1529    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 0, 3);
1530    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 1, 2);
1531    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 10, 2);
1532    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 19, 2);
1533    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 20, 2);
1534    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 21, 2);
1535    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 0, 3);
1536    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 1, 1);
1537    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 9, 1);
1538    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 18, 1);
1539    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 19, 1);
1540    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 20, 1);
1541    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 0, 3);
1542    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 1, -8);
1543    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 5, -8);
1544    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 9, -8);
1545    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 10, -8);
1546    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 11, -8);
1547}
1548
1549template <class S>
1550void test14()
1551{
1552    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 19, 0, 3);
1553    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 19, 1, -17);
1554    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 19, 2, -17);
1555    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 20, 0, 3);
1556    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 20, 1, 3);
1557    test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 21, 0, 0);
1558    test(S("abcde"), 2, 4, S(""), 0, 0, 3);
1559    test(S("abcde"), 2, 4, S(""), 0, 1, 3);
1560    test(S("abcde"), 2, 4, S(""), 1, 0, 0);
1561    test(S("abcde"), 2, 4, S("abcde"), 0, 0, 3);
1562    test(S("abcde"), 2, 4, S("abcde"), 0, 1, 2);
1563    test(S("abcde"), 2, 4, S("abcde"), 0, 2, 2);
1564    test(S("abcde"), 2, 4, S("abcde"), 0, 4, 2);
1565    test(S("abcde"), 2, 4, S("abcde"), 0, 5, 2);
1566    test(S("abcde"), 2, 4, S("abcde"), 0, 6, 2);
1567    test(S("abcde"), 2, 4, S("abcde"), 1, 0, 3);
1568    test(S("abcde"), 2, 4, S("abcde"), 1, 1, 1);
1569    test(S("abcde"), 2, 4, S("abcde"), 1, 2, 1);
1570    test(S("abcde"), 2, 4, S("abcde"), 1, 3, 1);
1571    test(S("abcde"), 2, 4, S("abcde"), 1, 4, 1);
1572    test(S("abcde"), 2, 4, S("abcde"), 1, 5, 1);
1573    test(S("abcde"), 2, 4, S("abcde"), 2, 0, 3);
1574    test(S("abcde"), 2, 4, S("abcde"), 2, 1, 2);
1575    test(S("abcde"), 2, 4, S("abcde"), 2, 2, 1);
1576    test(S("abcde"), 2, 4, S("abcde"), 2, 3, 0);
1577    test(S("abcde"), 2, 4, S("abcde"), 2, 4, 0);
1578    test(S("abcde"), 2, 4, S("abcde"), 4, 0, 3);
1579    test(S("abcde"), 2, 4, S("abcde"), 4, 1, -2);
1580    test(S("abcde"), 2, 4, S("abcde"), 4, 2, -2);
1581    test(S("abcde"), 2, 4, S("abcde"), 5, 0, 3);
1582    test(S("abcde"), 2, 4, S("abcde"), 5, 1, 3);
1583    test(S("abcde"), 2, 4, S("abcde"), 6, 0, 0);
1584    test(S("abcde"), 2, 4, S("abcdefghij"), 0, 0, 3);
1585    test(S("abcde"), 2, 4, S("abcdefghij"), 0, 1, 2);
1586    test(S("abcde"), 2, 4, S("abcdefghij"), 0, 5, 2);
1587    test(S("abcde"), 2, 4, S("abcdefghij"), 0, 9, 2);
1588    test(S("abcde"), 2, 4, S("abcdefghij"), 0, 10, 2);
1589    test(S("abcde"), 2, 4, S("abcdefghij"), 0, 11, 2);
1590    test(S("abcde"), 2, 4, S("abcdefghij"), 1, 0, 3);
1591    test(S("abcde"), 2, 4, S("abcdefghij"), 1, 1, 1);
1592    test(S("abcde"), 2, 4, S("abcdefghij"), 1, 4, 1);
1593    test(S("abcde"), 2, 4, S("abcdefghij"), 1, 8, 1);
1594    test(S("abcde"), 2, 4, S("abcdefghij"), 1, 9, 1);
1595    test(S("abcde"), 2, 4, S("abcdefghij"), 1, 10, 1);
1596    test(S("abcde"), 2, 4, S("abcdefghij"), 5, 0, 3);
1597    test(S("abcde"), 2, 4, S("abcdefghij"), 5, 1, -3);
1598    test(S("abcde"), 2, 4, S("abcdefghij"), 5, 2, -3);
1599    test(S("abcde"), 2, 4, S("abcdefghij"), 5, 4, -3);
1600    test(S("abcde"), 2, 4, S("abcdefghij"), 5, 5, -3);
1601    test(S("abcde"), 2, 4, S("abcdefghij"), 5, 6, -3);
1602    test(S("abcde"), 2, 4, S("abcdefghij"), 9, 0, 3);
1603    test(S("abcde"), 2, 4, S("abcdefghij"), 9, 1, -7);
1604    test(S("abcde"), 2, 4, S("abcdefghij"), 9, 2, -7);
1605    test(S("abcde"), 2, 4, S("abcdefghij"), 10, 0, 3);
1606    test(S("abcde"), 2, 4, S("abcdefghij"), 10, 1, 3);
1607    test(S("abcde"), 2, 4, S("abcdefghij"), 11, 0, 0);
1608    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 0, 3);
1609    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 1, 2);
1610    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 10, 2);
1611    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 19, 2);
1612    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 20, 2);
1613    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 21, 2);
1614    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 0, 3);
1615    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 1, 1);
1616    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 9, 1);
1617    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 18, 1);
1618    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 19, 1);
1619    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 20, 1);
1620    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 0, 3);
1621    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 1, -8);
1622    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 5, -8);
1623    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 9, -8);
1624    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 10, -8);
1625    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 11, -8);
1626    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 19, 0, 3);
1627    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 19, 1, -17);
1628    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 19, 2, -17);
1629    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 20, 0, 3);
1630    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 20, 1, 3);
1631    test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
1632    test(S("abcde"), 4, 0, S(""), 0, 0, 0);
1633    test(S("abcde"), 4, 0, S(""), 0, 1, 0);
1634    test(S("abcde"), 4, 0, S(""), 1, 0, 0);
1635    test(S("abcde"), 4, 0, S("abcde"), 0, 0, 0);
1636    test(S("abcde"), 4, 0, S("abcde"), 0, 1, -1);
1637    test(S("abcde"), 4, 0, S("abcde"), 0, 2, -2);
1638    test(S("abcde"), 4, 0, S("abcde"), 0, 4, -4);
1639    test(S("abcde"), 4, 0, S("abcde"), 0, 5, -5);
1640    test(S("abcde"), 4, 0, S("abcde"), 0, 6, -5);
1641    test(S("abcde"), 4, 0, S("abcde"), 1, 0, 0);
1642    test(S("abcde"), 4, 0, S("abcde"), 1, 1, -1);
1643    test(S("abcde"), 4, 0, S("abcde"), 1, 2, -2);
1644    test(S("abcde"), 4, 0, S("abcde"), 1, 3, -3);
1645    test(S("abcde"), 4, 0, S("abcde"), 1, 4, -4);
1646    test(S("abcde"), 4, 0, S("abcde"), 1, 5, -4);
1647    test(S("abcde"), 4, 0, S("abcde"), 2, 0, 0);
1648    test(S("abcde"), 4, 0, S("abcde"), 2, 1, -1);
1649    test(S("abcde"), 4, 0, S("abcde"), 2, 2, -2);
1650    test(S("abcde"), 4, 0, S("abcde"), 2, 3, -3);
1651    test(S("abcde"), 4, 0, S("abcde"), 2, 4, -3);
1652}
1653
1654template <class S>
1655void test15()
1656{
1657    test(S("abcde"), 4, 0, S("abcde"), 4, 0, 0);
1658    test(S("abcde"), 4, 0, S("abcde"), 4, 1, -1);
1659    test(S("abcde"), 4, 0, S("abcde"), 4, 2, -1);
1660    test(S("abcde"), 4, 0, S("abcde"), 5, 0, 0);
1661    test(S("abcde"), 4, 0, S("abcde"), 5, 1, 0);
1662    test(S("abcde"), 4, 0, S("abcde"), 6, 0, 0);
1663    test(S("abcde"), 4, 0, S("abcdefghij"), 0, 0, 0);
1664    test(S("abcde"), 4, 0, S("abcdefghij"), 0, 1, -1);
1665    test(S("abcde"), 4, 0, S("abcdefghij"), 0, 5, -5);
1666    test(S("abcde"), 4, 0, S("abcdefghij"), 0, 9, -9);
1667    test(S("abcde"), 4, 0, S("abcdefghij"), 0, 10, -10);
1668    test(S("abcde"), 4, 0, S("abcdefghij"), 0, 11, -10);
1669    test(S("abcde"), 4, 0, S("abcdefghij"), 1, 0, 0);
1670    test(S("abcde"), 4, 0, S("abcdefghij"), 1, 1, -1);
1671    test(S("abcde"), 4, 0, S("abcdefghij"), 1, 4, -4);
1672    test(S("abcde"), 4, 0, S("abcdefghij"), 1, 8, -8);
1673    test(S("abcde"), 4, 0, S("abcdefghij"), 1, 9, -9);
1674    test(S("abcde"), 4, 0, S("abcdefghij"), 1, 10, -9);
1675    test(S("abcde"), 4, 0, S("abcdefghij"), 5, 0, 0);
1676    test(S("abcde"), 4, 0, S("abcdefghij"), 5, 1, -1);
1677    test(S("abcde"), 4, 0, S("abcdefghij"), 5, 2, -2);
1678    test(S("abcde"), 4, 0, S("abcdefghij"), 5, 4, -4);
1679    test(S("abcde"), 4, 0, S("abcdefghij"), 5, 5, -5);
1680    test(S("abcde"), 4, 0, S("abcdefghij"), 5, 6, -5);
1681    test(S("abcde"), 4, 0, S("abcdefghij"), 9, 0, 0);
1682    test(S("abcde"), 4, 0, S("abcdefghij"), 9, 1, -1);
1683    test(S("abcde"), 4, 0, S("abcdefghij"), 9, 2, -1);
1684    test(S("abcde"), 4, 0, S("abcdefghij"), 10, 0, 0);
1685    test(S("abcde"), 4, 0, S("abcdefghij"), 10, 1, 0);
1686    test(S("abcde"), 4, 0, S("abcdefghij"), 11, 0, 0);
1687    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
1688    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
1689    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
1690    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
1691    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
1692    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
1693    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
1694    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
1695    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
1696    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
1697    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
1698    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
1699    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
1700    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
1701    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
1702    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
1703    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
1704    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
1705    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
1706    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
1707    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
1708    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
1709    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
1710    test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
1711    test(S("abcde"), 4, 1, S(""), 0, 0, 1);
1712    test(S("abcde"), 4, 1, S(""), 0, 1, 1);
1713    test(S("abcde"), 4, 1, S(""), 1, 0, 0);
1714    test(S("abcde"), 4, 1, S("abcde"), 0, 0, 1);
1715    test(S("abcde"), 4, 1, S("abcde"), 0, 1, 4);
1716    test(S("abcde"), 4, 1, S("abcde"), 0, 2, 4);
1717    test(S("abcde"), 4, 1, S("abcde"), 0, 4, 4);
1718    test(S("abcde"), 4, 1, S("abcde"), 0, 5, 4);
1719    test(S("abcde"), 4, 1, S("abcde"), 0, 6, 4);
1720    test(S("abcde"), 4, 1, S("abcde"), 1, 0, 1);
1721    test(S("abcde"), 4, 1, S("abcde"), 1, 1, 3);
1722    test(S("abcde"), 4, 1, S("abcde"), 1, 2, 3);
1723    test(S("abcde"), 4, 1, S("abcde"), 1, 3, 3);
1724    test(S("abcde"), 4, 1, S("abcde"), 1, 4, 3);
1725    test(S("abcde"), 4, 1, S("abcde"), 1, 5, 3);
1726    test(S("abcde"), 4, 1, S("abcde"), 2, 0, 1);
1727    test(S("abcde"), 4, 1, S("abcde"), 2, 1, 2);
1728    test(S("abcde"), 4, 1, S("abcde"), 2, 2, 2);
1729    test(S("abcde"), 4, 1, S("abcde"), 2, 3, 2);
1730    test(S("abcde"), 4, 1, S("abcde"), 2, 4, 2);
1731    test(S("abcde"), 4, 1, S("abcde"), 4, 0, 1);
1732    test(S("abcde"), 4, 1, S("abcde"), 4, 1, 0);
1733    test(S("abcde"), 4, 1, S("abcde"), 4, 2, 0);
1734    test(S("abcde"), 4, 1, S("abcde"), 5, 0, 1);
1735    test(S("abcde"), 4, 1, S("abcde"), 5, 1, 1);
1736    test(S("abcde"), 4, 1, S("abcde"), 6, 0, 0);
1737    test(S("abcde"), 4, 1, S("abcdefghij"), 0, 0, 1);
1738    test(S("abcde"), 4, 1, S("abcdefghij"), 0, 1, 4);
1739    test(S("abcde"), 4, 1, S("abcdefghij"), 0, 5, 4);
1740    test(S("abcde"), 4, 1, S("abcdefghij"), 0, 9, 4);
1741    test(S("abcde"), 4, 1, S("abcdefghij"), 0, 10, 4);
1742    test(S("abcde"), 4, 1, S("abcdefghij"), 0, 11, 4);
1743    test(S("abcde"), 4, 1, S("abcdefghij"), 1, 0, 1);
1744    test(S("abcde"), 4, 1, S("abcdefghij"), 1, 1, 3);
1745    test(S("abcde"), 4, 1, S("abcdefghij"), 1, 4, 3);
1746    test(S("abcde"), 4, 1, S("abcdefghij"), 1, 8, 3);
1747    test(S("abcde"), 4, 1, S("abcdefghij"), 1, 9, 3);
1748    test(S("abcde"), 4, 1, S("abcdefghij"), 1, 10, 3);
1749    test(S("abcde"), 4, 1, S("abcdefghij"), 5, 0, 1);
1750    test(S("abcde"), 4, 1, S("abcdefghij"), 5, 1, -1);
1751    test(S("abcde"), 4, 1, S("abcdefghij"), 5, 2, -1);
1752    test(S("abcde"), 4, 1, S("abcdefghij"), 5, 4, -1);
1753    test(S("abcde"), 4, 1, S("abcdefghij"), 5, 5, -1);
1754    test(S("abcde"), 4, 1, S("abcdefghij"), 5, 6, -1);
1755    test(S("abcde"), 4, 1, S("abcdefghij"), 9, 0, 1);
1756    test(S("abcde"), 4, 1, S("abcdefghij"), 9, 1, -5);
1757}
1758
1759template <class S>
1760void test16()
1761{
1762    test(S("abcde"), 4, 1, S("abcdefghij"), 9, 2, -5);
1763    test(S("abcde"), 4, 1, S("abcdefghij"), 10, 0, 1);
1764    test(S("abcde"), 4, 1, S("abcdefghij"), 10, 1, 1);
1765    test(S("abcde"), 4, 1, S("abcdefghij"), 11, 0, 0);
1766    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
1767    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 1, 4);
1768    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 10, 4);
1769    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 19, 4);
1770    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 20, 4);
1771    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 21, 4);
1772    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
1773    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 1, 3);
1774    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 9, 3);
1775    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 18, 3);
1776    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 19, 3);
1777    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 20, 3);
1778    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
1779    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 1, -6);
1780    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 5, -6);
1781    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 9, -6);
1782    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 10, -6);
1783    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 11, -6);
1784    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
1785    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 19, 1, -15);
1786    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 19, 2, -15);
1787    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
1788    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
1789    test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
1790    test(S("abcde"), 4, 2, S(""), 0, 0, 1);
1791    test(S("abcde"), 4, 2, S(""), 0, 1, 1);
1792    test(S("abcde"), 4, 2, S(""), 1, 0, 0);
1793    test(S("abcde"), 4, 2, S("abcde"), 0, 0, 1);
1794    test(S("abcde"), 4, 2, S("abcde"), 0, 1, 4);
1795    test(S("abcde"), 4, 2, S("abcde"), 0, 2, 4);
1796    test(S("abcde"), 4, 2, S("abcde"), 0, 4, 4);
1797    test(S("abcde"), 4, 2, S("abcde"), 0, 5, 4);
1798    test(S("abcde"), 4, 2, S("abcde"), 0, 6, 4);
1799    test(S("abcde"), 4, 2, S("abcde"), 1, 0, 1);
1800    test(S("abcde"), 4, 2, S("abcde"), 1, 1, 3);
1801    test(S("abcde"), 4, 2, S("abcde"), 1, 2, 3);
1802    test(S("abcde"), 4, 2, S("abcde"), 1, 3, 3);
1803    test(S("abcde"), 4, 2, S("abcde"), 1, 4, 3);
1804    test(S("abcde"), 4, 2, S("abcde"), 1, 5, 3);
1805    test(S("abcde"), 4, 2, S("abcde"), 2, 0, 1);
1806    test(S("abcde"), 4, 2, S("abcde"), 2, 1, 2);
1807    test(S("abcde"), 4, 2, S("abcde"), 2, 2, 2);
1808    test(S("abcde"), 4, 2, S("abcde"), 2, 3, 2);
1809    test(S("abcde"), 4, 2, S("abcde"), 2, 4, 2);
1810    test(S("abcde"), 4, 2, S("abcde"), 4, 0, 1);
1811    test(S("abcde"), 4, 2, S("abcde"), 4, 1, 0);
1812    test(S("abcde"), 4, 2, S("abcde"), 4, 2, 0);
1813    test(S("abcde"), 4, 2, S("abcde"), 5, 0, 1);
1814    test(S("abcde"), 4, 2, S("abcde"), 5, 1, 1);
1815    test(S("abcde"), 4, 2, S("abcde"), 6, 0, 0);
1816    test(S("abcde"), 4, 2, S("abcdefghij"), 0, 0, 1);
1817    test(S("abcde"), 4, 2, S("abcdefghij"), 0, 1, 4);
1818    test(S("abcde"), 4, 2, S("abcdefghij"), 0, 5, 4);
1819    test(S("abcde"), 4, 2, S("abcdefghij"), 0, 9, 4);
1820    test(S("abcde"), 4, 2, S("abcdefghij"), 0, 10, 4);
1821    test(S("abcde"), 4, 2, S("abcdefghij"), 0, 11, 4);
1822    test(S("abcde"), 4, 2, S("abcdefghij"), 1, 0, 1);
1823    test(S("abcde"), 4, 2, S("abcdefghij"), 1, 1, 3);
1824    test(S("abcde"), 4, 2, S("abcdefghij"), 1, 4, 3);
1825    test(S("abcde"), 4, 2, S("abcdefghij"), 1, 8, 3);
1826    test(S("abcde"), 4, 2, S("abcdefghij"), 1, 9, 3);
1827    test(S("abcde"), 4, 2, S("abcdefghij"), 1, 10, 3);
1828    test(S("abcde"), 4, 2, S("abcdefghij"), 5, 0, 1);
1829    test(S("abcde"), 4, 2, S("abcdefghij"), 5, 1, -1);
1830    test(S("abcde"), 4, 2, S("abcdefghij"), 5, 2, -1);
1831    test(S("abcde"), 4, 2, S("abcdefghij"), 5, 4, -1);
1832    test(S("abcde"), 4, 2, S("abcdefghij"), 5, 5, -1);
1833    test(S("abcde"), 4, 2, S("abcdefghij"), 5, 6, -1);
1834    test(S("abcde"), 4, 2, S("abcdefghij"), 9, 0, 1);
1835    test(S("abcde"), 4, 2, S("abcdefghij"), 9, 1, -5);
1836    test(S("abcde"), 4, 2, S("abcdefghij"), 9, 2, -5);
1837    test(S("abcde"), 4, 2, S("abcdefghij"), 10, 0, 1);
1838    test(S("abcde"), 4, 2, S("abcdefghij"), 10, 1, 1);
1839    test(S("abcde"), 4, 2, S("abcdefghij"), 11, 0, 0);
1840    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 0, 1);
1841    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 1, 4);
1842    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 10, 4);
1843    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 19, 4);
1844    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 20, 4);
1845    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 21, 4);
1846    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 0, 1);
1847    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 1, 3);
1848    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 9, 3);
1849    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 18, 3);
1850    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 19, 3);
1851    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 20, 3);
1852    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 0, 1);
1853    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 1, -6);
1854    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 5, -6);
1855    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 9, -6);
1856    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 10, -6);
1857    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 11, -6);
1858    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 19, 0, 1);
1859    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 19, 1, -15);
1860    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 19, 2, -15);
1861    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 20, 0, 1);
1862}
1863
1864template <class S>
1865void test17()
1866{
1867    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 20, 1, 1);
1868    test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
1869    test(S("abcde"), 5, 0, S(""), 0, 0, 0);
1870    test(S("abcde"), 5, 0, S(""), 0, 1, 0);
1871    test(S("abcde"), 5, 0, S(""), 1, 0, 0);
1872    test(S("abcde"), 5, 0, S("abcde"), 0, 0, 0);
1873    test(S("abcde"), 5, 0, S("abcde"), 0, 1, -1);
1874    test(S("abcde"), 5, 0, S("abcde"), 0, 2, -2);
1875    test(S("abcde"), 5, 0, S("abcde"), 0, 4, -4);
1876    test(S("abcde"), 5, 0, S("abcde"), 0, 5, -5);
1877    test(S("abcde"), 5, 0, S("abcde"), 0, 6, -5);
1878    test(S("abcde"), 5, 0, S("abcde"), 1, 0, 0);
1879    test(S("abcde"), 5, 0, S("abcde"), 1, 1, -1);
1880    test(S("abcde"), 5, 0, S("abcde"), 1, 2, -2);
1881    test(S("abcde"), 5, 0, S("abcde"), 1, 3, -3);
1882    test(S("abcde"), 5, 0, S("abcde"), 1, 4, -4);
1883    test(S("abcde"), 5, 0, S("abcde"), 1, 5, -4);
1884    test(S("abcde"), 5, 0, S("abcde"), 2, 0, 0);
1885    test(S("abcde"), 5, 0, S("abcde"), 2, 1, -1);
1886    test(S("abcde"), 5, 0, S("abcde"), 2, 2, -2);
1887    test(S("abcde"), 5, 0, S("abcde"), 2, 3, -3);
1888    test(S("abcde"), 5, 0, S("abcde"), 2, 4, -3);
1889    test(S("abcde"), 5, 0, S("abcde"), 4, 0, 0);
1890    test(S("abcde"), 5, 0, S("abcde"), 4, 1, -1);
1891    test(S("abcde"), 5, 0, S("abcde"), 4, 2, -1);
1892    test(S("abcde"), 5, 0, S("abcde"), 5, 0, 0);
1893    test(S("abcde"), 5, 0, S("abcde"), 5, 1, 0);
1894    test(S("abcde"), 5, 0, S("abcde"), 6, 0, 0);
1895    test(S("abcde"), 5, 0, S("abcdefghij"), 0, 0, 0);
1896    test(S("abcde"), 5, 0, S("abcdefghij"), 0, 1, -1);
1897    test(S("abcde"), 5, 0, S("abcdefghij"), 0, 5, -5);
1898    test(S("abcde"), 5, 0, S("abcdefghij"), 0, 9, -9);
1899    test(S("abcde"), 5, 0, S("abcdefghij"), 0, 10, -10);
1900    test(S("abcde"), 5, 0, S("abcdefghij"), 0, 11, -10);
1901    test(S("abcde"), 5, 0, S("abcdefghij"), 1, 0, 0);
1902    test(S("abcde"), 5, 0, S("abcdefghij"), 1, 1, -1);
1903    test(S("abcde"), 5, 0, S("abcdefghij"), 1, 4, -4);
1904    test(S("abcde"), 5, 0, S("abcdefghij"), 1, 8, -8);
1905    test(S("abcde"), 5, 0, S("abcdefghij"), 1, 9, -9);
1906    test(S("abcde"), 5, 0, S("abcdefghij"), 1, 10, -9);
1907    test(S("abcde"), 5, 0, S("abcdefghij"), 5, 0, 0);
1908    test(S("abcde"), 5, 0, S("abcdefghij"), 5, 1, -1);
1909    test(S("abcde"), 5, 0, S("abcdefghij"), 5, 2, -2);
1910    test(S("abcde"), 5, 0, S("abcdefghij"), 5, 4, -4);
1911    test(S("abcde"), 5, 0, S("abcdefghij"), 5, 5, -5);
1912    test(S("abcde"), 5, 0, S("abcdefghij"), 5, 6, -5);
1913    test(S("abcde"), 5, 0, S("abcdefghij"), 9, 0, 0);
1914    test(S("abcde"), 5, 0, S("abcdefghij"), 9, 1, -1);
1915    test(S("abcde"), 5, 0, S("abcdefghij"), 9, 2, -1);
1916    test(S("abcde"), 5, 0, S("abcdefghij"), 10, 0, 0);
1917    test(S("abcde"), 5, 0, S("abcdefghij"), 10, 1, 0);
1918    test(S("abcde"), 5, 0, S("abcdefghij"), 11, 0, 0);
1919    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
1920    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
1921    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
1922    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
1923    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
1924    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
1925    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
1926    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
1927    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
1928    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
1929    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
1930    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
1931    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
1932    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
1933    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
1934    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
1935    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
1936    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
1937    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
1938    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
1939    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
1940    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
1941    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
1942    test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
1943    test(S("abcde"), 5, 1, S(""), 0, 0, 0);
1944    test(S("abcde"), 5, 1, S(""), 0, 1, 0);
1945    test(S("abcde"), 5, 1, S(""), 1, 0, 0);
1946    test(S("abcde"), 5, 1, S("abcde"), 0, 0, 0);
1947    test(S("abcde"), 5, 1, S("abcde"), 0, 1, -1);
1948    test(S("abcde"), 5, 1, S("abcde"), 0, 2, -2);
1949    test(S("abcde"), 5, 1, S("abcde"), 0, 4, -4);
1950    test(S("abcde"), 5, 1, S("abcde"), 0, 5, -5);
1951    test(S("abcde"), 5, 1, S("abcde"), 0, 6, -5);
1952    test(S("abcde"), 5, 1, S("abcde"), 1, 0, 0);
1953    test(S("abcde"), 5, 1, S("abcde"), 1, 1, -1);
1954    test(S("abcde"), 5, 1, S("abcde"), 1, 2, -2);
1955    test(S("abcde"), 5, 1, S("abcde"), 1, 3, -3);
1956    test(S("abcde"), 5, 1, S("abcde"), 1, 4, -4);
1957    test(S("abcde"), 5, 1, S("abcde"), 1, 5, -4);
1958    test(S("abcde"), 5, 1, S("abcde"), 2, 0, 0);
1959    test(S("abcde"), 5, 1, S("abcde"), 2, 1, -1);
1960    test(S("abcde"), 5, 1, S("abcde"), 2, 2, -2);
1961    test(S("abcde"), 5, 1, S("abcde"), 2, 3, -3);
1962    test(S("abcde"), 5, 1, S("abcde"), 2, 4, -3);
1963    test(S("abcde"), 5, 1, S("abcde"), 4, 0, 0);
1964    test(S("abcde"), 5, 1, S("abcde"), 4, 1, -1);
1965    test(S("abcde"), 5, 1, S("abcde"), 4, 2, -1);
1966    test(S("abcde"), 5, 1, S("abcde"), 5, 0, 0);
1967}
1968
1969template <class S>
1970void test18()
1971{
1972    test(S("abcde"), 5, 1, S("abcde"), 5, 1, 0);
1973    test(S("abcde"), 5, 1, S("abcde"), 6, 0, 0);
1974    test(S("abcde"), 5, 1, S("abcdefghij"), 0, 0, 0);
1975    test(S("abcde"), 5, 1, S("abcdefghij"), 0, 1, -1);
1976    test(S("abcde"), 5, 1, S("abcdefghij"), 0, 5, -5);
1977    test(S("abcde"), 5, 1, S("abcdefghij"), 0, 9, -9);
1978    test(S("abcde"), 5, 1, S("abcdefghij"), 0, 10, -10);
1979    test(S("abcde"), 5, 1, S("abcdefghij"), 0, 11, -10);
1980    test(S("abcde"), 5, 1, S("abcdefghij"), 1, 0, 0);
1981    test(S("abcde"), 5, 1, S("abcdefghij"), 1, 1, -1);
1982    test(S("abcde"), 5, 1, S("abcdefghij"), 1, 4, -4);
1983    test(S("abcde"), 5, 1, S("abcdefghij"), 1, 8, -8);
1984    test(S("abcde"), 5, 1, S("abcdefghij"), 1, 9, -9);
1985    test(S("abcde"), 5, 1, S("abcdefghij"), 1, 10, -9);
1986    test(S("abcde"), 5, 1, S("abcdefghij"), 5, 0, 0);
1987    test(S("abcde"), 5, 1, S("abcdefghij"), 5, 1, -1);
1988    test(S("abcde"), 5, 1, S("abcdefghij"), 5, 2, -2);
1989    test(S("abcde"), 5, 1, S("abcdefghij"), 5, 4, -4);
1990    test(S("abcde"), 5, 1, S("abcdefghij"), 5, 5, -5);
1991    test(S("abcde"), 5, 1, S("abcdefghij"), 5, 6, -5);
1992    test(S("abcde"), 5, 1, S("abcdefghij"), 9, 0, 0);
1993    test(S("abcde"), 5, 1, S("abcdefghij"), 9, 1, -1);
1994    test(S("abcde"), 5, 1, S("abcdefghij"), 9, 2, -1);
1995    test(S("abcde"), 5, 1, S("abcdefghij"), 10, 0, 0);
1996    test(S("abcde"), 5, 1, S("abcdefghij"), 10, 1, 0);
1997    test(S("abcde"), 5, 1, S("abcdefghij"), 11, 0, 0);
1998    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 0, 0);
1999    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 1, -1);
2000    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 10, -10);
2001    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 19, -19);
2002    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 20, -20);
2003    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 21, -20);
2004    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 0, 0);
2005    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
2006    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 9, -9);
2007    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 18, -18);
2008    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 19, -19);
2009    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 20, -19);
2010    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 0, 0);
2011    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
2012    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
2013    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
2014    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
2015    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
2016    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 19, 0, 0);
2017    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 19, 1, -1);
2018    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 19, 2, -1);
2019    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 20, 0, 0);
2020    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 20, 1, 0);
2021    test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
2022    test(S("abcde"), 6, 0, S(""), 0, 0, 0);
2023    test(S("abcde"), 6, 0, S(""), 0, 1, 0);
2024    test(S("abcde"), 6, 0, S(""), 1, 0, 0);
2025    test(S("abcde"), 6, 0, S("abcde"), 0, 0, 0);
2026    test(S("abcde"), 6, 0, S("abcde"), 0, 1, 0);
2027    test(S("abcde"), 6, 0, S("abcde"), 0, 2, 0);
2028    test(S("abcde"), 6, 0, S("abcde"), 0, 4, 0);
2029    test(S("abcde"), 6, 0, S("abcde"), 0, 5, 0);
2030    test(S("abcde"), 6, 0, S("abcde"), 0, 6, 0);
2031    test(S("abcde"), 6, 0, S("abcde"), 1, 0, 0);
2032    test(S("abcde"), 6, 0, S("abcde"), 1, 1, 0);
2033    test(S("abcde"), 6, 0, S("abcde"), 1, 2, 0);
2034    test(S("abcde"), 6, 0, S("abcde"), 1, 3, 0);
2035    test(S("abcde"), 6, 0, S("abcde"), 1, 4, 0);
2036    test(S("abcde"), 6, 0, S("abcde"), 1, 5, 0);
2037    test(S("abcde"), 6, 0, S("abcde"), 2, 0, 0);
2038    test(S("abcde"), 6, 0, S("abcde"), 2, 1, 0);
2039    test(S("abcde"), 6, 0, S("abcde"), 2, 2, 0);
2040    test(S("abcde"), 6, 0, S("abcde"), 2, 3, 0);
2041    test(S("abcde"), 6, 0, S("abcde"), 2, 4, 0);
2042    test(S("abcde"), 6, 0, S("abcde"), 4, 0, 0);
2043    test(S("abcde"), 6, 0, S("abcde"), 4, 1, 0);
2044    test(S("abcde"), 6, 0, S("abcde"), 4, 2, 0);
2045    test(S("abcde"), 6, 0, S("abcde"), 5, 0, 0);
2046    test(S("abcde"), 6, 0, S("abcde"), 5, 1, 0);
2047    test(S("abcde"), 6, 0, S("abcde"), 6, 0, 0);
2048    test(S("abcde"), 6, 0, S("abcdefghij"), 0, 0, 0);
2049    test(S("abcde"), 6, 0, S("abcdefghij"), 0, 1, 0);
2050    test(S("abcde"), 6, 0, S("abcdefghij"), 0, 5, 0);
2051    test(S("abcde"), 6, 0, S("abcdefghij"), 0, 9, 0);
2052    test(S("abcde"), 6, 0, S("abcdefghij"), 0, 10, 0);
2053    test(S("abcde"), 6, 0, S("abcdefghij"), 0, 11, 0);
2054    test(S("abcde"), 6, 0, S("abcdefghij"), 1, 0, 0);
2055    test(S("abcde"), 6, 0, S("abcdefghij"), 1, 1, 0);
2056    test(S("abcde"), 6, 0, S("abcdefghij"), 1, 4, 0);
2057    test(S("abcde"), 6, 0, S("abcdefghij"), 1, 8, 0);
2058    test(S("abcde"), 6, 0, S("abcdefghij"), 1, 9, 0);
2059    test(S("abcde"), 6, 0, S("abcdefghij"), 1, 10, 0);
2060    test(S("abcde"), 6, 0, S("abcdefghij"), 5, 0, 0);
2061    test(S("abcde"), 6, 0, S("abcdefghij"), 5, 1, 0);
2062    test(S("abcde"), 6, 0, S("abcdefghij"), 5, 2, 0);
2063    test(S("abcde"), 6, 0, S("abcdefghij"), 5, 4, 0);
2064    test(S("abcde"), 6, 0, S("abcdefghij"), 5, 5, 0);
2065    test(S("abcde"), 6, 0, S("abcdefghij"), 5, 6, 0);
2066    test(S("abcde"), 6, 0, S("abcdefghij"), 9, 0, 0);
2067    test(S("abcde"), 6, 0, S("abcdefghij"), 9, 1, 0);
2068    test(S("abcde"), 6, 0, S("abcdefghij"), 9, 2, 0);
2069    test(S("abcde"), 6, 0, S("abcdefghij"), 10, 0, 0);
2070    test(S("abcde"), 6, 0, S("abcdefghij"), 10, 1, 0);
2071    test(S("abcde"), 6, 0, S("abcdefghij"), 11, 0, 0);
2072}
2073
2074template <class S>
2075void test19()
2076{
2077    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
2078    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 1, 0);
2079    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 10, 0);
2080    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 19, 0);
2081    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 20, 0);
2082    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 21, 0);
2083    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
2084    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 1, 0);
2085    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 9, 0);
2086    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 18, 0);
2087    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 19, 0);
2088    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 20, 0);
2089    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
2090    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 1, 0);
2091    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 5, 0);
2092    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 9, 0);
2093    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 10, 0);
2094    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 11, 0);
2095    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
2096    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 19, 1, 0);
2097    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 19, 2, 0);
2098    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
2099    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
2100    test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
2101    test(S("abcdefghij"), 0, 0, S(""), 0, 0, 0);
2102    test(S("abcdefghij"), 0, 0, S(""), 0, 1, 0);
2103    test(S("abcdefghij"), 0, 0, S(""), 1, 0, 0);
2104    test(S("abcdefghij"), 0, 0, S("abcde"), 0, 0, 0);
2105    test(S("abcdefghij"), 0, 0, S("abcde"), 0, 1, -1);
2106    test(S("abcdefghij"), 0, 0, S("abcde"), 0, 2, -2);
2107    test(S("abcdefghij"), 0, 0, S("abcde"), 0, 4, -4);
2108    test(S("abcdefghij"), 0, 0, S("abcde"), 0, 5, -5);
2109    test(S("abcdefghij"), 0, 0, S("abcde"), 0, 6, -5);
2110    test(S("abcdefghij"), 0, 0, S("abcde"), 1, 0, 0);
2111    test(S("abcdefghij"), 0, 0, S("abcde"), 1, 1, -1);
2112    test(S("abcdefghij"), 0, 0, S("abcde"), 1, 2, -2);
2113    test(S("abcdefghij"), 0, 0, S("abcde"), 1, 3, -3);
2114    test(S("abcdefghij"), 0, 0, S("abcde"), 1, 4, -4);
2115    test(S("abcdefghij"), 0, 0, S("abcde"), 1, 5, -4);
2116    test(S("abcdefghij"), 0, 0, S("abcde"), 2, 0, 0);
2117    test(S("abcdefghij"), 0, 0, S("abcde"), 2, 1, -1);
2118    test(S("abcdefghij"), 0, 0, S("abcde"), 2, 2, -2);
2119    test(S("abcdefghij"), 0, 0, S("abcde"), 2, 3, -3);
2120    test(S("abcdefghij"), 0, 0, S("abcde"), 2, 4, -3);
2121    test(S("abcdefghij"), 0, 0, S("abcde"), 4, 0, 0);
2122    test(S("abcdefghij"), 0, 0, S("abcde"), 4, 1, -1);
2123    test(S("abcdefghij"), 0, 0, S("abcde"), 4, 2, -1);
2124    test(S("abcdefghij"), 0, 0, S("abcde"), 5, 0, 0);
2125    test(S("abcdefghij"), 0, 0, S("abcde"), 5, 1, 0);
2126    test(S("abcdefghij"), 0, 0, S("abcde"), 6, 0, 0);
2127    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 0, 0);
2128    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 1, -1);
2129    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 5, -5);
2130    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 9, -9);
2131    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 10, -10);
2132    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 11, -10);
2133    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 0, 0);
2134    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 1, -1);
2135    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 4, -4);
2136    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 8, -8);
2137    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 9, -9);
2138    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 10, -9);
2139    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 0, 0);
2140    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 1, -1);
2141    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 2, -2);
2142    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 4, -4);
2143    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 5, -5);
2144    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 6, -5);
2145    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 9, 0, 0);
2146    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 9, 1, -1);
2147    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 9, 2, -1);
2148    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 10, 0, 0);
2149    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 10, 1, 0);
2150    test(S("abcdefghij"), 0, 0, S("abcdefghij"), 11, 0, 0);
2151    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
2152    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
2153    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
2154    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
2155    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
2156    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
2157    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
2158    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
2159    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
2160    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
2161    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
2162    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
2163    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
2164    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
2165    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
2166    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
2167    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
2168    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
2169    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
2170    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
2171    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
2172    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
2173    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
2174    test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
2175    test(S("abcdefghij"), 0, 1, S(""), 0, 0, 1);
2176    test(S("abcdefghij"), 0, 1, S(""), 0, 1, 1);
2177}
2178
2179template <class S>
2180void test20()
2181{
2182    test(S("abcdefghij"), 0, 1, S(""), 1, 0, 0);
2183    test(S("abcdefghij"), 0, 1, S("abcde"), 0, 0, 1);
2184    test(S("abcdefghij"), 0, 1, S("abcde"), 0, 1, 0);
2185    test(S("abcdefghij"), 0, 1, S("abcde"), 0, 2, -1);
2186    test(S("abcdefghij"), 0, 1, S("abcde"), 0, 4, -3);
2187    test(S("abcdefghij"), 0, 1, S("abcde"), 0, 5, -4);
2188    test(S("abcdefghij"), 0, 1, S("abcde"), 0, 6, -4);
2189    test(S("abcdefghij"), 0, 1, S("abcde"), 1, 0, 1);
2190    test(S("abcdefghij"), 0, 1, S("abcde"), 1, 1, -1);
2191    test(S("abcdefghij"), 0, 1, S("abcde"), 1, 2, -1);
2192    test(S("abcdefghij"), 0, 1, S("abcde"), 1, 3, -1);
2193    test(S("abcdefghij"), 0, 1, S("abcde"), 1, 4, -1);
2194    test(S("abcdefghij"), 0, 1, S("abcde"), 1, 5, -1);
2195    test(S("abcdefghij"), 0, 1, S("abcde"), 2, 0, 1);
2196    test(S("abcdefghij"), 0, 1, S("abcde"), 2, 1, -2);
2197    test(S("abcdefghij"), 0, 1, S("abcde"), 2, 2, -2);
2198    test(S("abcdefghij"), 0, 1, S("abcde"), 2, 3, -2);
2199    test(S("abcdefghij"), 0, 1, S("abcde"), 2, 4, -2);
2200    test(S("abcdefghij"), 0, 1, S("abcde"), 4, 0, 1);
2201    test(S("abcdefghij"), 0, 1, S("abcde"), 4, 1, -4);
2202    test(S("abcdefghij"), 0, 1, S("abcde"), 4, 2, -4);
2203    test(S("abcdefghij"), 0, 1, S("abcde"), 5, 0, 1);
2204    test(S("abcdefghij"), 0, 1, S("abcde"), 5, 1, 1);
2205    test(S("abcdefghij"), 0, 1, S("abcde"), 6, 0, 0);
2206    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 0, 1);
2207    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 1, 0);
2208    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 5, -4);
2209    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 9, -8);
2210    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 10, -9);
2211    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 11, -9);
2212    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 0, 1);
2213    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 1, -1);
2214    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 4, -1);
2215    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 8, -1);
2216    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 9, -1);
2217    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 10, -1);
2218    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 0, 1);
2219    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 1, -5);
2220    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 2, -5);
2221    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 4, -5);
2222    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 5, -5);
2223    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 6, -5);
2224    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 9, 0, 1);
2225    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 9, 1, -9);
2226    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 9, 2, -9);
2227    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 10, 0, 1);
2228    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 10, 1, 1);
2229    test(S("abcdefghij"), 0, 1, S("abcdefghij"), 11, 0, 0);
2230    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
2231    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, 0);
2232    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -9);
2233    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -18);
2234    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -19);
2235    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -19);
2236    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
2237    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
2238    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -1);
2239    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -1);
2240    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -1);
2241    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -1);
2242    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
2243    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -10);
2244    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -10);
2245    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -10);
2246    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
2247    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
2248    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
2249    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -19);
2250    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -19);
2251    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
2252    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
2253    test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
2254    test(S("abcdefghij"), 0, 5, S(""), 0, 0, 5);
2255    test(S("abcdefghij"), 0, 5, S(""), 0, 1, 5);
2256    test(S("abcdefghij"), 0, 5, S(""), 1, 0, 0);
2257    test(S("abcdefghij"), 0, 5, S("abcde"), 0, 0, 5);
2258    test(S("abcdefghij"), 0, 5, S("abcde"), 0, 1, 4);
2259    test(S("abcdefghij"), 0, 5, S("abcde"), 0, 2, 3);
2260    test(S("abcdefghij"), 0, 5, S("abcde"), 0, 4, 1);
2261    test(S("abcdefghij"), 0, 5, S("abcde"), 0, 5, 0);
2262    test(S("abcdefghij"), 0, 5, S("abcde"), 0, 6, 0);
2263    test(S("abcdefghij"), 0, 5, S("abcde"), 1, 0, 5);
2264    test(S("abcdefghij"), 0, 5, S("abcde"), 1, 1, -1);
2265    test(S("abcdefghij"), 0, 5, S("abcde"), 1, 2, -1);
2266    test(S("abcdefghij"), 0, 5, S("abcde"), 1, 3, -1);
2267    test(S("abcdefghij"), 0, 5, S("abcde"), 1, 4, -1);
2268    test(S("abcdefghij"), 0, 5, S("abcde"), 1, 5, -1);
2269    test(S("abcdefghij"), 0, 5, S("abcde"), 2, 0, 5);
2270    test(S("abcdefghij"), 0, 5, S("abcde"), 2, 1, -2);
2271    test(S("abcdefghij"), 0, 5, S("abcde"), 2, 2, -2);
2272    test(S("abcdefghij"), 0, 5, S("abcde"), 2, 3, -2);
2273    test(S("abcdefghij"), 0, 5, S("abcde"), 2, 4, -2);
2274    test(S("abcdefghij"), 0, 5, S("abcde"), 4, 0, 5);
2275    test(S("abcdefghij"), 0, 5, S("abcde"), 4, 1, -4);
2276    test(S("abcdefghij"), 0, 5, S("abcde"), 4, 2, -4);
2277    test(S("abcdefghij"), 0, 5, S("abcde"), 5, 0, 5);
2278    test(S("abcdefghij"), 0, 5, S("abcde"), 5, 1, 5);
2279    test(S("abcdefghij"), 0, 5, S("abcde"), 6, 0, 0);
2280    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 0, 5);
2281    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 1, 4);
2282}
2283
2284template <class S>
2285void test21()
2286{
2287    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 5, 0);
2288    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 9, -4);
2289    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 10, -5);
2290    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 11, -5);
2291    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 0, 5);
2292    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 1, -1);
2293    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 4, -1);
2294    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 8, -1);
2295    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 9, -1);
2296    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 10, -1);
2297    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 0, 5);
2298    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 1, -5);
2299    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 2, -5);
2300    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 4, -5);
2301    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 5, -5);
2302    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 6, -5);
2303    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 9, 0, 5);
2304    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 9, 1, -9);
2305    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 9, 2, -9);
2306    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 10, 0, 5);
2307    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 10, 1, 5);
2308    test(S("abcdefghij"), 0, 5, S("abcdefghij"), 11, 0, 0);
2309    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 0, 5);
2310    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 1, 4);
2311    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 10, -5);
2312    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 19, -14);
2313    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 20, -15);
2314    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 21, -15);
2315    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 0, 5);
2316    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 1, -1);
2317    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 9, -1);
2318    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 18, -1);
2319    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 19, -1);
2320    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 20, -1);
2321    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 0, 5);
2322    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 1, -10);
2323    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 5, -10);
2324    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 9, -10);
2325    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 10, -10);
2326    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 11, -10);
2327    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 19, 0, 5);
2328    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 19, 1, -19);
2329    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 19, 2, -19);
2330    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 20, 0, 5);
2331    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 20, 1, 5);
2332    test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
2333    test(S("abcdefghij"), 0, 9, S(""), 0, 0, 9);
2334    test(S("abcdefghij"), 0, 9, S(""), 0, 1, 9);
2335    test(S("abcdefghij"), 0, 9, S(""), 1, 0, 0);
2336    test(S("abcdefghij"), 0, 9, S("abcde"), 0, 0, 9);
2337    test(S("abcdefghij"), 0, 9, S("abcde"), 0, 1, 8);
2338    test(S("abcdefghij"), 0, 9, S("abcde"), 0, 2, 7);
2339    test(S("abcdefghij"), 0, 9, S("abcde"), 0, 4, 5);
2340    test(S("abcdefghij"), 0, 9, S("abcde"), 0, 5, 4);
2341    test(S("abcdefghij"), 0, 9, S("abcde"), 0, 6, 4);
2342    test(S("abcdefghij"), 0, 9, S("abcde"), 1, 0, 9);
2343    test(S("abcdefghij"), 0, 9, S("abcde"), 1, 1, -1);
2344    test(S("abcdefghij"), 0, 9, S("abcde"), 1, 2, -1);
2345    test(S("abcdefghij"), 0, 9, S("abcde"), 1, 3, -1);
2346    test(S("abcdefghij"), 0, 9, S("abcde"), 1, 4, -1);
2347    test(S("abcdefghij"), 0, 9, S("abcde"), 1, 5, -1);
2348    test(S("abcdefghij"), 0, 9, S("abcde"), 2, 0, 9);
2349    test(S("abcdefghij"), 0, 9, S("abcde"), 2, 1, -2);
2350    test(S("abcdefghij"), 0, 9, S("abcde"), 2, 2, -2);
2351    test(S("abcdefghij"), 0, 9, S("abcde"), 2, 3, -2);
2352    test(S("abcdefghij"), 0, 9, S("abcde"), 2, 4, -2);
2353    test(S("abcdefghij"), 0, 9, S("abcde"), 4, 0, 9);
2354    test(S("abcdefghij"), 0, 9, S("abcde"), 4, 1, -4);
2355    test(S("abcdefghij"), 0, 9, S("abcde"), 4, 2, -4);
2356    test(S("abcdefghij"), 0, 9, S("abcde"), 5, 0, 9);
2357    test(S("abcdefghij"), 0, 9, S("abcde"), 5, 1, 9);
2358    test(S("abcdefghij"), 0, 9, S("abcde"), 6, 0, 0);
2359    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 0, 9);
2360    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 1, 8);
2361    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 5, 4);
2362    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 9, 0);
2363    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 10, -1);
2364    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 11, -1);
2365    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 0, 9);
2366    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 1, -1);
2367    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 4, -1);
2368    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 8, -1);
2369    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 9, -1);
2370    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 10, -1);
2371    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 0, 9);
2372    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 1, -5);
2373    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 2, -5);
2374    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 4, -5);
2375    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 5, -5);
2376    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 6, -5);
2377    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 9, 0, 9);
2378    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 9, 1, -9);
2379    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 9, 2, -9);
2380    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 10, 0, 9);
2381    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 10, 1, 9);
2382    test(S("abcdefghij"), 0, 9, S("abcdefghij"), 11, 0, 0);
2383    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 0, 9);
2384    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 1, 8);
2385    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 10, -1);
2386    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 19, -10);
2387}
2388
2389template <class S>
2390void test22()
2391{
2392    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 20, -11);
2393    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 21, -11);
2394    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 0, 9);
2395    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 1, -1);
2396    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 9, -1);
2397    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 18, -1);
2398    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 19, -1);
2399    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 20, -1);
2400    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 0, 9);
2401    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 1, -10);
2402    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 5, -10);
2403    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 9, -10);
2404    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 10, -10);
2405    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 11, -10);
2406    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 19, 0, 9);
2407    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 19, 1, -19);
2408    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 19, 2, -19);
2409    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 20, 0, 9);
2410    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 20, 1, 9);
2411    test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 21, 0, 0);
2412    test(S("abcdefghij"), 0, 10, S(""), 0, 0, 10);
2413    test(S("abcdefghij"), 0, 10, S(""), 0, 1, 10);
2414    test(S("abcdefghij"), 0, 10, S(""), 1, 0, 0);
2415    test(S("abcdefghij"), 0, 10, S("abcde"), 0, 0, 10);
2416    test(S("abcdefghij"), 0, 10, S("abcde"), 0, 1, 9);
2417    test(S("abcdefghij"), 0, 10, S("abcde"), 0, 2, 8);
2418    test(S("abcdefghij"), 0, 10, S("abcde"), 0, 4, 6);
2419    test(S("abcdefghij"), 0, 10, S("abcde"), 0, 5, 5);
2420    test(S("abcdefghij"), 0, 10, S("abcde"), 0, 6, 5);
2421    test(S("abcdefghij"), 0, 10, S("abcde"), 1, 0, 10);
2422    test(S("abcdefghij"), 0, 10, S("abcde"), 1, 1, -1);
2423    test(S("abcdefghij"), 0, 10, S("abcde"), 1, 2, -1);
2424    test(S("abcdefghij"), 0, 10, S("abcde"), 1, 3, -1);
2425    test(S("abcdefghij"), 0, 10, S("abcde"), 1, 4, -1);
2426    test(S("abcdefghij"), 0, 10, S("abcde"), 1, 5, -1);
2427    test(S("abcdefghij"), 0, 10, S("abcde"), 2, 0, 10);
2428    test(S("abcdefghij"), 0, 10, S("abcde"), 2, 1, -2);
2429    test(S("abcdefghij"), 0, 10, S("abcde"), 2, 2, -2);
2430    test(S("abcdefghij"), 0, 10, S("abcde"), 2, 3, -2);
2431    test(S("abcdefghij"), 0, 10, S("abcde"), 2, 4, -2);
2432    test(S("abcdefghij"), 0, 10, S("abcde"), 4, 0, 10);
2433    test(S("abcdefghij"), 0, 10, S("abcde"), 4, 1, -4);
2434    test(S("abcdefghij"), 0, 10, S("abcde"), 4, 2, -4);
2435    test(S("abcdefghij"), 0, 10, S("abcde"), 5, 0, 10);
2436    test(S("abcdefghij"), 0, 10, S("abcde"), 5, 1, 10);
2437    test(S("abcdefghij"), 0, 10, S("abcde"), 6, 0, 0);
2438    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 0, 10);
2439    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 1, 9);
2440    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 5, 5);
2441    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 9, 1);
2442    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 10, 0);
2443    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 11, 0);
2444    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 0, 10);
2445    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 1, -1);
2446    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 4, -1);
2447    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 8, -1);
2448    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 9, -1);
2449    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 10, -1);
2450    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 0, 10);
2451    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 1, -5);
2452    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 2, -5);
2453    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 4, -5);
2454    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 5, -5);
2455    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 6, -5);
2456    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 9, 0, 10);
2457    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 9, 1, -9);
2458    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 9, 2, -9);
2459    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 10, 0, 10);
2460    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 10, 1, 10);
2461    test(S("abcdefghij"), 0, 10, S("abcdefghij"), 11, 0, 0);
2462    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 0, 10);
2463    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 1, 9);
2464    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 10, 0);
2465    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 19, -9);
2466    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 20, -10);
2467    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 21, -10);
2468    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 0, 10);
2469    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 1, -1);
2470    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 9, -1);
2471    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 18, -1);
2472    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 19, -1);
2473    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 20, -1);
2474    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 0, 10);
2475    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 1, -10);
2476    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 5, -10);
2477    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 9, -10);
2478    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 10, -10);
2479    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 11, -10);
2480    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 19, 0, 10);
2481    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 19, 1, -19);
2482    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 19, 2, -19);
2483    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 20, 0, 10);
2484    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 20, 1, 10);
2485    test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 21, 0, 0);
2486    test(S("abcdefghij"), 0, 11, S(""), 0, 0, 10);
2487    test(S("abcdefghij"), 0, 11, S(""), 0, 1, 10);
2488    test(S("abcdefghij"), 0, 11, S(""), 1, 0, 0);
2489    test(S("abcdefghij"), 0, 11, S("abcde"), 0, 0, 10);
2490    test(S("abcdefghij"), 0, 11, S("abcde"), 0, 1, 9);
2491    test(S("abcdefghij"), 0, 11, S("abcde"), 0, 2, 8);
2492}
2493
2494template <class S>
2495void test23()
2496{
2497    test(S("abcdefghij"), 0, 11, S("abcde"), 0, 4, 6);
2498    test(S("abcdefghij"), 0, 11, S("abcde"), 0, 5, 5);
2499    test(S("abcdefghij"), 0, 11, S("abcde"), 0, 6, 5);
2500    test(S("abcdefghij"), 0, 11, S("abcde"), 1, 0, 10);
2501    test(S("abcdefghij"), 0, 11, S("abcde"), 1, 1, -1);
2502    test(S("abcdefghij"), 0, 11, S("abcde"), 1, 2, -1);
2503    test(S("abcdefghij"), 0, 11, S("abcde"), 1, 3, -1);
2504    test(S("abcdefghij"), 0, 11, S("abcde"), 1, 4, -1);
2505    test(S("abcdefghij"), 0, 11, S("abcde"), 1, 5, -1);
2506    test(S("abcdefghij"), 0, 11, S("abcde"), 2, 0, 10);
2507    test(S("abcdefghij"), 0, 11, S("abcde"), 2, 1, -2);
2508    test(S("abcdefghij"), 0, 11, S("abcde"), 2, 2, -2);
2509    test(S("abcdefghij"), 0, 11, S("abcde"), 2, 3, -2);
2510    test(S("abcdefghij"), 0, 11, S("abcde"), 2, 4, -2);
2511    test(S("abcdefghij"), 0, 11, S("abcde"), 4, 0, 10);
2512    test(S("abcdefghij"), 0, 11, S("abcde"), 4, 1, -4);
2513    test(S("abcdefghij"), 0, 11, S("abcde"), 4, 2, -4);
2514    test(S("abcdefghij"), 0, 11, S("abcde"), 5, 0, 10);
2515    test(S("abcdefghij"), 0, 11, S("abcde"), 5, 1, 10);
2516    test(S("abcdefghij"), 0, 11, S("abcde"), 6, 0, 0);
2517    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 0, 10);
2518    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 1, 9);
2519    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 5, 5);
2520    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 9, 1);
2521    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 10, 0);
2522    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 11, 0);
2523    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 0, 10);
2524    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 1, -1);
2525    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 4, -1);
2526    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 8, -1);
2527    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 9, -1);
2528    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 10, -1);
2529    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 0, 10);
2530    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 1, -5);
2531    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 2, -5);
2532    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 4, -5);
2533    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 5, -5);
2534    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 6, -5);
2535    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 9, 0, 10);
2536    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 9, 1, -9);
2537    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 9, 2, -9);
2538    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 10, 0, 10);
2539    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 10, 1, 10);
2540    test(S("abcdefghij"), 0, 11, S("abcdefghij"), 11, 0, 0);
2541    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 0, 10);
2542    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 1, 9);
2543    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 10, 0);
2544    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 19, -9);
2545    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 20, -10);
2546    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 21, -10);
2547    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 0, 10);
2548    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 1, -1);
2549    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 9, -1);
2550    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 18, -1);
2551    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 19, -1);
2552    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 20, -1);
2553    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 0, 10);
2554    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 1, -10);
2555    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 5, -10);
2556    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 9, -10);
2557    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 10, -10);
2558    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 11, -10);
2559    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 19, 0, 10);
2560    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 19, 1, -19);
2561    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 19, 2, -19);
2562    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 20, 0, 10);
2563    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 20, 1, 10);
2564    test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 21, 0, 0);
2565    test(S("abcdefghij"), 1, 0, S(""), 0, 0, 0);
2566    test(S("abcdefghij"), 1, 0, S(""), 0, 1, 0);
2567    test(S("abcdefghij"), 1, 0, S(""), 1, 0, 0);
2568    test(S("abcdefghij"), 1, 0, S("abcde"), 0, 0, 0);
2569    test(S("abcdefghij"), 1, 0, S("abcde"), 0, 1, -1);
2570    test(S("abcdefghij"), 1, 0, S("abcde"), 0, 2, -2);
2571    test(S("abcdefghij"), 1, 0, S("abcde"), 0, 4, -4);
2572    test(S("abcdefghij"), 1, 0, S("abcde"), 0, 5, -5);
2573    test(S("abcdefghij"), 1, 0, S("abcde"), 0, 6, -5);
2574    test(S("abcdefghij"), 1, 0, S("abcde"), 1, 0, 0);
2575    test(S("abcdefghij"), 1, 0, S("abcde"), 1, 1, -1);
2576    test(S("abcdefghij"), 1, 0, S("abcde"), 1, 2, -2);
2577    test(S("abcdefghij"), 1, 0, S("abcde"), 1, 3, -3);
2578    test(S("abcdefghij"), 1, 0, S("abcde"), 1, 4, -4);
2579    test(S("abcdefghij"), 1, 0, S("abcde"), 1, 5, -4);
2580    test(S("abcdefghij"), 1, 0, S("abcde"), 2, 0, 0);
2581    test(S("abcdefghij"), 1, 0, S("abcde"), 2, 1, -1);
2582    test(S("abcdefghij"), 1, 0, S("abcde"), 2, 2, -2);
2583    test(S("abcdefghij"), 1, 0, S("abcde"), 2, 3, -3);
2584    test(S("abcdefghij"), 1, 0, S("abcde"), 2, 4, -3);
2585    test(S("abcdefghij"), 1, 0, S("abcde"), 4, 0, 0);
2586    test(S("abcdefghij"), 1, 0, S("abcde"), 4, 1, -1);
2587    test(S("abcdefghij"), 1, 0, S("abcde"), 4, 2, -1);
2588    test(S("abcdefghij"), 1, 0, S("abcde"), 5, 0, 0);
2589    test(S("abcdefghij"), 1, 0, S("abcde"), 5, 1, 0);
2590    test(S("abcdefghij"), 1, 0, S("abcde"), 6, 0, 0);
2591    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 0, 0);
2592    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 1, -1);
2593    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 5, -5);
2594    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 9, -9);
2595    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 10, -10);
2596    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 11, -10);
2597}
2598
2599template <class S>
2600void test24()
2601{
2602    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 0, 0);
2603    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 1, -1);
2604    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 4, -4);
2605    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 8, -8);
2606    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 9, -9);
2607    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 10, -9);
2608    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 0, 0);
2609    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 1, -1);
2610    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 2, -2);
2611    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 4, -4);
2612    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 5, -5);
2613    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 6, -5);
2614    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 9, 0, 0);
2615    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 9, 1, -1);
2616    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 9, 2, -1);
2617    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 10, 0, 0);
2618    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 10, 1, 0);
2619    test(S("abcdefghij"), 1, 0, S("abcdefghij"), 11, 0, 0);
2620    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
2621    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
2622    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
2623    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
2624    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
2625    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
2626    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
2627    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
2628    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
2629    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
2630    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
2631    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
2632    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
2633    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
2634    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
2635    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
2636    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
2637    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
2638    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
2639    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
2640    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
2641    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
2642    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
2643    test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
2644    test(S("abcdefghij"), 1, 1, S(""), 0, 0, 1);
2645    test(S("abcdefghij"), 1, 1, S(""), 0, 1, 1);
2646    test(S("abcdefghij"), 1, 1, S(""), 1, 0, 0);
2647    test(S("abcdefghij"), 1, 1, S("abcde"), 0, 0, 1);
2648    test(S("abcdefghij"), 1, 1, S("abcde"), 0, 1, 1);
2649    test(S("abcdefghij"), 1, 1, S("abcde"), 0, 2, 1);
2650    test(S("abcdefghij"), 1, 1, S("abcde"), 0, 4, 1);
2651    test(S("abcdefghij"), 1, 1, S("abcde"), 0, 5, 1);
2652    test(S("abcdefghij"), 1, 1, S("abcde"), 0, 6, 1);
2653    test(S("abcdefghij"), 1, 1, S("abcde"), 1, 0, 1);
2654    test(S("abcdefghij"), 1, 1, S("abcde"), 1, 1, 0);
2655    test(S("abcdefghij"), 1, 1, S("abcde"), 1, 2, -1);
2656    test(S("abcdefghij"), 1, 1, S("abcde"), 1, 3, -2);
2657    test(S("abcdefghij"), 1, 1, S("abcde"), 1, 4, -3);
2658    test(S("abcdefghij"), 1, 1, S("abcde"), 1, 5, -3);
2659    test(S("abcdefghij"), 1, 1, S("abcde"), 2, 0, 1);
2660    test(S("abcdefghij"), 1, 1, S("abcde"), 2, 1, -1);
2661    test(S("abcdefghij"), 1, 1, S("abcde"), 2, 2, -1);
2662    test(S("abcdefghij"), 1, 1, S("abcde"), 2, 3, -1);
2663    test(S("abcdefghij"), 1, 1, S("abcde"), 2, 4, -1);
2664    test(S("abcdefghij"), 1, 1, S("abcde"), 4, 0, 1);
2665    test(S("abcdefghij"), 1, 1, S("abcde"), 4, 1, -3);
2666    test(S("abcdefghij"), 1, 1, S("abcde"), 4, 2, -3);
2667    test(S("abcdefghij"), 1, 1, S("abcde"), 5, 0, 1);
2668    test(S("abcdefghij"), 1, 1, S("abcde"), 5, 1, 1);
2669    test(S("abcdefghij"), 1, 1, S("abcde"), 6, 0, 0);
2670    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 0, 1);
2671    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 1, 1);
2672    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 5, 1);
2673    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 9, 1);
2674    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 10, 1);
2675    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 11, 1);
2676    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 0, 1);
2677    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 1, 0);
2678    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 4, -3);
2679    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 8, -7);
2680    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 9, -8);
2681    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 10, -8);
2682    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 0, 1);
2683    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 1, -4);
2684    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 2, -4);
2685    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 4, -4);
2686    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 5, -4);
2687    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 6, -4);
2688    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 9, 0, 1);
2689    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 9, 1, -8);
2690    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 9, 2, -8);
2691    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 10, 0, 1);
2692    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 10, 1, 1);
2693    test(S("abcdefghij"), 1, 1, S("abcdefghij"), 11, 0, 0);
2694    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
2695    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 1, 1);
2696    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 10, 1);
2697    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 19, 1);
2698    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 20, 1);
2699    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 21, 1);
2700    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
2701    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 1, 0);
2702}
2703
2704template <class S>
2705void test25()
2706{
2707    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 9, -8);
2708    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 18, -17);
2709    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 19, -18);
2710    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 20, -18);
2711    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
2712    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 1, -9);
2713    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 5, -9);
2714    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
2715    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 10, -9);
2716    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 11, -9);
2717    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
2718    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 19, 1, -18);
2719    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 19, 2, -18);
2720    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
2721    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
2722    test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
2723    test(S("abcdefghij"), 1, 4, S(""), 0, 0, 4);
2724    test(S("abcdefghij"), 1, 4, S(""), 0, 1, 4);
2725    test(S("abcdefghij"), 1, 4, S(""), 1, 0, 0);
2726    test(S("abcdefghij"), 1, 4, S("abcde"), 0, 0, 4);
2727    test(S("abcdefghij"), 1, 4, S("abcde"), 0, 1, 1);
2728    test(S("abcdefghij"), 1, 4, S("abcde"), 0, 2, 1);
2729    test(S("abcdefghij"), 1, 4, S("abcde"), 0, 4, 1);
2730    test(S("abcdefghij"), 1, 4, S("abcde"), 0, 5, 1);
2731    test(S("abcdefghij"), 1, 4, S("abcde"), 0, 6, 1);
2732    test(S("abcdefghij"), 1, 4, S("abcde"), 1, 0, 4);
2733    test(S("abcdefghij"), 1, 4, S("abcde"), 1, 1, 3);
2734    test(S("abcdefghij"), 1, 4, S("abcde"), 1, 2, 2);
2735    test(S("abcdefghij"), 1, 4, S("abcde"), 1, 3, 1);
2736    test(S("abcdefghij"), 1, 4, S("abcde"), 1, 4, 0);
2737    test(S("abcdefghij"), 1, 4, S("abcde"), 1, 5, 0);
2738    test(S("abcdefghij"), 1, 4, S("abcde"), 2, 0, 4);
2739    test(S("abcdefghij"), 1, 4, S("abcde"), 2, 1, -1);
2740    test(S("abcdefghij"), 1, 4, S("abcde"), 2, 2, -1);
2741    test(S("abcdefghij"), 1, 4, S("abcde"), 2, 3, -1);
2742    test(S("abcdefghij"), 1, 4, S("abcde"), 2, 4, -1);
2743    test(S("abcdefghij"), 1, 4, S("abcde"), 4, 0, 4);
2744    test(S("abcdefghij"), 1, 4, S("abcde"), 4, 1, -3);
2745    test(S("abcdefghij"), 1, 4, S("abcde"), 4, 2, -3);
2746    test(S("abcdefghij"), 1, 4, S("abcde"), 5, 0, 4);
2747    test(S("abcdefghij"), 1, 4, S("abcde"), 5, 1, 4);
2748    test(S("abcdefghij"), 1, 4, S("abcde"), 6, 0, 0);
2749    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 0, 4);
2750    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 1, 1);
2751    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 5, 1);
2752    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 9, 1);
2753    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 10, 1);
2754    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 11, 1);
2755    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 0, 4);
2756    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 1, 3);
2757    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 4, 0);
2758    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 8, -4);
2759    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 9, -5);
2760    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 10, -5);
2761    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 0, 4);
2762    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 1, -4);
2763    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 2, -4);
2764    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 4, -4);
2765    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 5, -4);
2766    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 6, -4);
2767    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 9, 0, 4);
2768    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 9, 1, -8);
2769    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 9, 2, -8);
2770    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 10, 0, 4);
2771    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 10, 1, 4);
2772    test(S("abcdefghij"), 1, 4, S("abcdefghij"), 11, 0, 0);
2773    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 0, 4);
2774    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 1, 1);
2775    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 10, 1);
2776    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 19, 1);
2777    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 20, 1);
2778    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 21, 1);
2779    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 0, 4);
2780    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 1, 3);
2781    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 9, -5);
2782    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 18, -14);
2783    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 19, -15);
2784    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 20, -15);
2785    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 0, 4);
2786    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 1, -9);
2787    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 5, -9);
2788    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 9, -9);
2789    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 10, -9);
2790    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 11, -9);
2791    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 19, 0, 4);
2792    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 19, 1, -18);
2793    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 19, 2, -18);
2794    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 20, 0, 4);
2795    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 20, 1, 4);
2796    test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
2797    test(S("abcdefghij"), 1, 8, S(""), 0, 0, 8);
2798    test(S("abcdefghij"), 1, 8, S(""), 0, 1, 8);
2799    test(S("abcdefghij"), 1, 8, S(""), 1, 0, 0);
2800    test(S("abcdefghij"), 1, 8, S("abcde"), 0, 0, 8);
2801    test(S("abcdefghij"), 1, 8, S("abcde"), 0, 1, 1);
2802    test(S("abcdefghij"), 1, 8, S("abcde"), 0, 2, 1);
2803    test(S("abcdefghij"), 1, 8, S("abcde"), 0, 4, 1);
2804    test(S("abcdefghij"), 1, 8, S("abcde"), 0, 5, 1);
2805    test(S("abcdefghij"), 1, 8, S("abcde"), 0, 6, 1);
2806    test(S("abcdefghij"), 1, 8, S("abcde"), 1, 0, 8);
2807}
2808
2809template <class S>
2810void test26()
2811{
2812    test(S("abcdefghij"), 1, 8, S("abcde"), 1, 1, 7);
2813    test(S("abcdefghij"), 1, 8, S("abcde"), 1, 2, 6);
2814    test(S("abcdefghij"), 1, 8, S("abcde"), 1, 3, 5);
2815    test(S("abcdefghij"), 1, 8, S("abcde"), 1, 4, 4);
2816    test(S("abcdefghij"), 1, 8, S("abcde"), 1, 5, 4);
2817    test(S("abcdefghij"), 1, 8, S("abcde"), 2, 0, 8);
2818    test(S("abcdefghij"), 1, 8, S("abcde"), 2, 1, -1);
2819    test(S("abcdefghij"), 1, 8, S("abcde"), 2, 2, -1);
2820    test(S("abcdefghij"), 1, 8, S("abcde"), 2, 3, -1);
2821    test(S("abcdefghij"), 1, 8, S("abcde"), 2, 4, -1);
2822    test(S("abcdefghij"), 1, 8, S("abcde"), 4, 0, 8);
2823    test(S("abcdefghij"), 1, 8, S("abcde"), 4, 1, -3);
2824    test(S("abcdefghij"), 1, 8, S("abcde"), 4, 2, -3);
2825    test(S("abcdefghij"), 1, 8, S("abcde"), 5, 0, 8);
2826    test(S("abcdefghij"), 1, 8, S("abcde"), 5, 1, 8);
2827    test(S("abcdefghij"), 1, 8, S("abcde"), 6, 0, 0);
2828    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 0, 8);
2829    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 1, 1);
2830    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 5, 1);
2831    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 9, 1);
2832    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 10, 1);
2833    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 11, 1);
2834    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 0, 8);
2835    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 1, 7);
2836    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 4, 4);
2837    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 8, 0);
2838    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 9, -1);
2839    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 10, -1);
2840    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 0, 8);
2841    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 1, -4);
2842    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 2, -4);
2843    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 4, -4);
2844    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 5, -4);
2845    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 6, -4);
2846    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 9, 0, 8);
2847    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 9, 1, -8);
2848    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 9, 2, -8);
2849    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 10, 0, 8);
2850    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 10, 1, 8);
2851    test(S("abcdefghij"), 1, 8, S("abcdefghij"), 11, 0, 0);
2852    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 0, 8);
2853    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 1, 1);
2854    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 10, 1);
2855    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 19, 1);
2856    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 20, 1);
2857    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 21, 1);
2858    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 0, 8);
2859    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 1, 7);
2860    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 9, -1);
2861    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 18, -10);
2862    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 19, -11);
2863    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 20, -11);
2864    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 0, 8);
2865    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 1, -9);
2866    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 5, -9);
2867    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 9, -9);
2868    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 10, -9);
2869    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 11, -9);
2870    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 19, 0, 8);
2871    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 19, 1, -18);
2872    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 19, 2, -18);
2873    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 20, 0, 8);
2874    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 20, 1, 8);
2875    test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 21, 0, 0);
2876    test(S("abcdefghij"), 1, 9, S(""), 0, 0, 9);
2877    test(S("abcdefghij"), 1, 9, S(""), 0, 1, 9);
2878    test(S("abcdefghij"), 1, 9, S(""), 1, 0, 0);
2879    test(S("abcdefghij"), 1, 9, S("abcde"), 0, 0, 9);
2880    test(S("abcdefghij"), 1, 9, S("abcde"), 0, 1, 1);
2881    test(S("abcdefghij"), 1, 9, S("abcde"), 0, 2, 1);
2882    test(S("abcdefghij"), 1, 9, S("abcde"), 0, 4, 1);
2883    test(S("abcdefghij"), 1, 9, S("abcde"), 0, 5, 1);
2884    test(S("abcdefghij"), 1, 9, S("abcde"), 0, 6, 1);
2885    test(S("abcdefghij"), 1, 9, S("abcde"), 1, 0, 9);
2886    test(S("abcdefghij"), 1, 9, S("abcde"), 1, 1, 8);
2887    test(S("abcdefghij"), 1, 9, S("abcde"), 1, 2, 7);
2888    test(S("abcdefghij"), 1, 9, S("abcde"), 1, 3, 6);
2889    test(S("abcdefghij"), 1, 9, S("abcde"), 1, 4, 5);
2890    test(S("abcdefghij"), 1, 9, S("abcde"), 1, 5, 5);
2891    test(S("abcdefghij"), 1, 9, S("abcde"), 2, 0, 9);
2892    test(S("abcdefghij"), 1, 9, S("abcde"), 2, 1, -1);
2893    test(S("abcdefghij"), 1, 9, S("abcde"), 2, 2, -1);
2894    test(S("abcdefghij"), 1, 9, S("abcde"), 2, 3, -1);
2895    test(S("abcdefghij"), 1, 9, S("abcde"), 2, 4, -1);
2896    test(S("abcdefghij"), 1, 9, S("abcde"), 4, 0, 9);
2897    test(S("abcdefghij"), 1, 9, S("abcde"), 4, 1, -3);
2898    test(S("abcdefghij"), 1, 9, S("abcde"), 4, 2, -3);
2899    test(S("abcdefghij"), 1, 9, S("abcde"), 5, 0, 9);
2900    test(S("abcdefghij"), 1, 9, S("abcde"), 5, 1, 9);
2901    test(S("abcdefghij"), 1, 9, S("abcde"), 6, 0, 0);
2902    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 0, 9);
2903    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 1, 1);
2904    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 5, 1);
2905    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 9, 1);
2906    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 10, 1);
2907    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 11, 1);
2908    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 0, 9);
2909    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 1, 8);
2910    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 4, 5);
2911    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 8, 1);
2912}
2913
2914template <class S>
2915void test27()
2916{
2917    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 9, 0);
2918    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 10, 0);
2919    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 0, 9);
2920    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 1, -4);
2921    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 2, -4);
2922    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 4, -4);
2923    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 5, -4);
2924    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 6, -4);
2925    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 9, 0, 9);
2926    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 9, 1, -8);
2927    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 9, 2, -8);
2928    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 10, 0, 9);
2929    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 10, 1, 9);
2930    test(S("abcdefghij"), 1, 9, S("abcdefghij"), 11, 0, 0);
2931    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 0, 9);
2932    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 1, 1);
2933    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 10, 1);
2934    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 19, 1);
2935    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 20, 1);
2936    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 21, 1);
2937    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 0, 9);
2938    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 1, 8);
2939    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 9, 0);
2940    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 18, -9);
2941    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 19, -10);
2942    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 20, -10);
2943    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 0, 9);
2944    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 1, -9);
2945    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 5, -9);
2946    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 9, -9);
2947    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 10, -9);
2948    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 11, -9);
2949    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 19, 0, 9);
2950    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 19, 1, -18);
2951    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 19, 2, -18);
2952    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 20, 0, 9);
2953    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 20, 1, 9);
2954    test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 21, 0, 0);
2955    test(S("abcdefghij"), 1, 10, S(""), 0, 0, 9);
2956    test(S("abcdefghij"), 1, 10, S(""), 0, 1, 9);
2957    test(S("abcdefghij"), 1, 10, S(""), 1, 0, 0);
2958    test(S("abcdefghij"), 1, 10, S("abcde"), 0, 0, 9);
2959    test(S("abcdefghij"), 1, 10, S("abcde"), 0, 1, 1);
2960    test(S("abcdefghij"), 1, 10, S("abcde"), 0, 2, 1);
2961    test(S("abcdefghij"), 1, 10, S("abcde"), 0, 4, 1);
2962    test(S("abcdefghij"), 1, 10, S("abcde"), 0, 5, 1);
2963    test(S("abcdefghij"), 1, 10, S("abcde"), 0, 6, 1);
2964    test(S("abcdefghij"), 1, 10, S("abcde"), 1, 0, 9);
2965    test(S("abcdefghij"), 1, 10, S("abcde"), 1, 1, 8);
2966    test(S("abcdefghij"), 1, 10, S("abcde"), 1, 2, 7);
2967    test(S("abcdefghij"), 1, 10, S("abcde"), 1, 3, 6);
2968    test(S("abcdefghij"), 1, 10, S("abcde"), 1, 4, 5);
2969    test(S("abcdefghij"), 1, 10, S("abcde"), 1, 5, 5);
2970    test(S("abcdefghij"), 1, 10, S("abcde"), 2, 0, 9);
2971    test(S("abcdefghij"), 1, 10, S("abcde"), 2, 1, -1);
2972    test(S("abcdefghij"), 1, 10, S("abcde"), 2, 2, -1);
2973    test(S("abcdefghij"), 1, 10, S("abcde"), 2, 3, -1);
2974    test(S("abcdefghij"), 1, 10, S("abcde"), 2, 4, -1);
2975    test(S("abcdefghij"), 1, 10, S("abcde"), 4, 0, 9);
2976    test(S("abcdefghij"), 1, 10, S("abcde"), 4, 1, -3);
2977    test(S("abcdefghij"), 1, 10, S("abcde"), 4, 2, -3);
2978    test(S("abcdefghij"), 1, 10, S("abcde"), 5, 0, 9);
2979    test(S("abcdefghij"), 1, 10, S("abcde"), 5, 1, 9);
2980    test(S("abcdefghij"), 1, 10, S("abcde"), 6, 0, 0);
2981    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 0, 9);
2982    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 1, 1);
2983    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 5, 1);
2984    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 9, 1);
2985    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 10, 1);
2986    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 11, 1);
2987    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 0, 9);
2988    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 1, 8);
2989    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 4, 5);
2990    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 8, 1);
2991    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 9, 0);
2992    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 10, 0);
2993    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 0, 9);
2994    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 1, -4);
2995    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 2, -4);
2996    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 4, -4);
2997    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 5, -4);
2998    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 6, -4);
2999    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 9, 0, 9);
3000    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 9, 1, -8);
3001    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 9, 2, -8);
3002    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 10, 0, 9);
3003    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 10, 1, 9);
3004    test(S("abcdefghij"), 1, 10, S("abcdefghij"), 11, 0, 0);
3005    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 0, 9);
3006    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 1, 1);
3007    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 10, 1);
3008    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 19, 1);
3009    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 20, 1);
3010    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 21, 1);
3011    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 0, 9);
3012    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 1, 8);
3013    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 9, 0);
3014    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 18, -9);
3015    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 19, -10);
3016    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 20, -10);
3017}
3018
3019template <class S>
3020void test28()
3021{
3022    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 0, 9);
3023    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 1, -9);
3024    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 5, -9);
3025    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 9, -9);
3026    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 10, -9);
3027    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 11, -9);
3028    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 19, 0, 9);
3029    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 19, 1, -18);
3030    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 19, 2, -18);
3031    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 20, 0, 9);
3032    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 20, 1, 9);
3033    test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 21, 0, 0);
3034    test(S("abcdefghij"), 5, 0, S(""), 0, 0, 0);
3035    test(S("abcdefghij"), 5, 0, S(""), 0, 1, 0);
3036    test(S("abcdefghij"), 5, 0, S(""), 1, 0, 0);
3037    test(S("abcdefghij"), 5, 0, S("abcde"), 0, 0, 0);
3038    test(S("abcdefghij"), 5, 0, S("abcde"), 0, 1, -1);
3039    test(S("abcdefghij"), 5, 0, S("abcde"), 0, 2, -2);
3040    test(S("abcdefghij"), 5, 0, S("abcde"), 0, 4, -4);
3041    test(S("abcdefghij"), 5, 0, S("abcde"), 0, 5, -5);
3042    test(S("abcdefghij"), 5, 0, S("abcde"), 0, 6, -5);
3043    test(S("abcdefghij"), 5, 0, S("abcde"), 1, 0, 0);
3044    test(S("abcdefghij"), 5, 0, S("abcde"), 1, 1, -1);
3045    test(S("abcdefghij"), 5, 0, S("abcde"), 1, 2, -2);
3046    test(S("abcdefghij"), 5, 0, S("abcde"), 1, 3, -3);
3047    test(S("abcdefghij"), 5, 0, S("abcde"), 1, 4, -4);
3048    test(S("abcdefghij"), 5, 0, S("abcde"), 1, 5, -4);
3049    test(S("abcdefghij"), 5, 0, S("abcde"), 2, 0, 0);
3050    test(S("abcdefghij"), 5, 0, S("abcde"), 2, 1, -1);
3051    test(S("abcdefghij"), 5, 0, S("abcde"), 2, 2, -2);
3052    test(S("abcdefghij"), 5, 0, S("abcde"), 2, 3, -3);
3053    test(S("abcdefghij"), 5, 0, S("abcde"), 2, 4, -3);
3054    test(S("abcdefghij"), 5, 0, S("abcde"), 4, 0, 0);
3055    test(S("abcdefghij"), 5, 0, S("abcde"), 4, 1, -1);
3056    test(S("abcdefghij"), 5, 0, S("abcde"), 4, 2, -1);
3057    test(S("abcdefghij"), 5, 0, S("abcde"), 5, 0, 0);
3058    test(S("abcdefghij"), 5, 0, S("abcde"), 5, 1, 0);
3059    test(S("abcdefghij"), 5, 0, S("abcde"), 6, 0, 0);
3060    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 0, 0);
3061    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 1, -1);
3062    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 5, -5);
3063    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 9, -9);
3064    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 10, -10);
3065    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 11, -10);
3066    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 0, 0);
3067    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 1, -1);
3068    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 4, -4);
3069    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 8, -8);
3070    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 9, -9);
3071    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 10, -9);
3072    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 0, 0);
3073    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 1, -1);
3074    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 2, -2);
3075    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 4, -4);
3076    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 5, -5);
3077    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 6, -5);
3078    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 9, 0, 0);
3079    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 9, 1, -1);
3080    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 9, 2, -1);
3081    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 10, 0, 0);
3082    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 10, 1, 0);
3083    test(S("abcdefghij"), 5, 0, S("abcdefghij"), 11, 0, 0);
3084    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3085    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
3086    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
3087    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
3088    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
3089    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
3090    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3091    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
3092    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
3093    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
3094    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
3095    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
3096    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3097    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
3098    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
3099    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
3100    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
3101    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
3102    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
3103    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
3104    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
3105    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
3106    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
3107    test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
3108    test(S("abcdefghij"), 5, 1, S(""), 0, 0, 1);
3109    test(S("abcdefghij"), 5, 1, S(""), 0, 1, 1);
3110    test(S("abcdefghij"), 5, 1, S(""), 1, 0, 0);
3111    test(S("abcdefghij"), 5, 1, S("abcde"), 0, 0, 1);
3112    test(S("abcdefghij"), 5, 1, S("abcde"), 0, 1, 5);
3113    test(S("abcdefghij"), 5, 1, S("abcde"), 0, 2, 5);
3114    test(S("abcdefghij"), 5, 1, S("abcde"), 0, 4, 5);
3115    test(S("abcdefghij"), 5, 1, S("abcde"), 0, 5, 5);
3116    test(S("abcdefghij"), 5, 1, S("abcde"), 0, 6, 5);
3117    test(S("abcdefghij"), 5, 1, S("abcde"), 1, 0, 1);
3118    test(S("abcdefghij"), 5, 1, S("abcde"), 1, 1, 4);
3119    test(S("abcdefghij"), 5, 1, S("abcde"), 1, 2, 4);
3120    test(S("abcdefghij"), 5, 1, S("abcde"), 1, 3, 4);
3121    test(S("abcdefghij"), 5, 1, S("abcde"), 1, 4, 4);
3122}
3123
3124template <class S>
3125void test29()
3126{
3127    test(S("abcdefghij"), 5, 1, S("abcde"), 1, 5, 4);
3128    test(S("abcdefghij"), 5, 1, S("abcde"), 2, 0, 1);
3129    test(S("abcdefghij"), 5, 1, S("abcde"), 2, 1, 3);
3130    test(S("abcdefghij"), 5, 1, S("abcde"), 2, 2, 3);
3131    test(S("abcdefghij"), 5, 1, S("abcde"), 2, 3, 3);
3132    test(S("abcdefghij"), 5, 1, S("abcde"), 2, 4, 3);
3133    test(S("abcdefghij"), 5, 1, S("abcde"), 4, 0, 1);
3134    test(S("abcdefghij"), 5, 1, S("abcde"), 4, 1, 1);
3135    test(S("abcdefghij"), 5, 1, S("abcde"), 4, 2, 1);
3136    test(S("abcdefghij"), 5, 1, S("abcde"), 5, 0, 1);
3137    test(S("abcdefghij"), 5, 1, S("abcde"), 5, 1, 1);
3138    test(S("abcdefghij"), 5, 1, S("abcde"), 6, 0, 0);
3139    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 0, 1);
3140    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 1, 5);
3141    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 5, 5);
3142    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 9, 5);
3143    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 10, 5);
3144    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 11, 5);
3145    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 0, 1);
3146    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 1, 4);
3147    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 4, 4);
3148    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 8, 4);
3149    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 9, 4);
3150    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 10, 4);
3151    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 0, 1);
3152    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 1, 0);
3153    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 2, -1);
3154    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 4, -3);
3155    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 5, -4);
3156    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 6, -4);
3157    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 9, 0, 1);
3158    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 9, 1, -4);
3159    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 9, 2, -4);
3160    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 10, 0, 1);
3161    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 10, 1, 1);
3162    test(S("abcdefghij"), 5, 1, S("abcdefghij"), 11, 0, 0);
3163    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
3164    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 1, 5);
3165    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 10, 5);
3166    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 19, 5);
3167    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 20, 5);
3168    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 21, 5);
3169    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
3170    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 1, 4);
3171    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 9, 4);
3172    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 18, 4);
3173    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 19, 4);
3174    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 20, 4);
3175    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
3176    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 1, -5);
3177    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
3178    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 9, -5);
3179    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 10, -5);
3180    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 11, -5);
3181    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
3182    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 19, 1, -14);
3183    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 19, 2, -14);
3184    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
3185    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
3186    test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
3187    test(S("abcdefghij"), 5, 2, S(""), 0, 0, 2);
3188    test(S("abcdefghij"), 5, 2, S(""), 0, 1, 2);
3189    test(S("abcdefghij"), 5, 2, S(""), 1, 0, 0);
3190    test(S("abcdefghij"), 5, 2, S("abcde"), 0, 0, 2);
3191    test(S("abcdefghij"), 5, 2, S("abcde"), 0, 1, 5);
3192    test(S("abcdefghij"), 5, 2, S("abcde"), 0, 2, 5);
3193    test(S("abcdefghij"), 5, 2, S("abcde"), 0, 4, 5);
3194    test(S("abcdefghij"), 5, 2, S("abcde"), 0, 5, 5);
3195    test(S("abcdefghij"), 5, 2, S("abcde"), 0, 6, 5);
3196    test(S("abcdefghij"), 5, 2, S("abcde"), 1, 0, 2);
3197    test(S("abcdefghij"), 5, 2, S("abcde"), 1, 1, 4);
3198    test(S("abcdefghij"), 5, 2, S("abcde"), 1, 2, 4);
3199    test(S("abcdefghij"), 5, 2, S("abcde"), 1, 3, 4);
3200    test(S("abcdefghij"), 5, 2, S("abcde"), 1, 4, 4);
3201    test(S("abcdefghij"), 5, 2, S("abcde"), 1, 5, 4);
3202    test(S("abcdefghij"), 5, 2, S("abcde"), 2, 0, 2);
3203    test(S("abcdefghij"), 5, 2, S("abcde"), 2, 1, 3);
3204    test(S("abcdefghij"), 5, 2, S("abcde"), 2, 2, 3);
3205    test(S("abcdefghij"), 5, 2, S("abcde"), 2, 3, 3);
3206    test(S("abcdefghij"), 5, 2, S("abcde"), 2, 4, 3);
3207    test(S("abcdefghij"), 5, 2, S("abcde"), 4, 0, 2);
3208    test(S("abcdefghij"), 5, 2, S("abcde"), 4, 1, 1);
3209    test(S("abcdefghij"), 5, 2, S("abcde"), 4, 2, 1);
3210    test(S("abcdefghij"), 5, 2, S("abcde"), 5, 0, 2);
3211    test(S("abcdefghij"), 5, 2, S("abcde"), 5, 1, 2);
3212    test(S("abcdefghij"), 5, 2, S("abcde"), 6, 0, 0);
3213    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 0, 2);
3214    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 1, 5);
3215    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 5, 5);
3216    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 9, 5);
3217    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 10, 5);
3218    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 11, 5);
3219    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 0, 2);
3220    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 1, 4);
3221    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 4, 4);
3222    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 8, 4);
3223    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 9, 4);
3224    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 10, 4);
3225    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 0, 2);
3226    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 1, 1);
3227}
3228
3229template <class S>
3230void test30()
3231{
3232    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 2, 0);
3233    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 4, -2);
3234    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 5, -3);
3235    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 6, -3);
3236    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 9, 0, 2);
3237    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 9, 1, -4);
3238    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 9, 2, -4);
3239    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 10, 0, 2);
3240    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 10, 1, 2);
3241    test(S("abcdefghij"), 5, 2, S("abcdefghij"), 11, 0, 0);
3242    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 0, 2);
3243    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 1, 5);
3244    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 10, 5);
3245    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 19, 5);
3246    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 20, 5);
3247    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 21, 5);
3248    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 0, 2);
3249    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 1, 4);
3250    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 9, 4);
3251    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 18, 4);
3252    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 19, 4);
3253    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 20, 4);
3254    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 0, 2);
3255    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 1, -5);
3256    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 5, -5);
3257    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 9, -5);
3258    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 10, -5);
3259    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 11, -5);
3260    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 19, 0, 2);
3261    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 19, 1, -14);
3262    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 19, 2, -14);
3263    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 20, 0, 2);
3264    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 20, 1, 2);
3265    test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
3266    test(S("abcdefghij"), 5, 4, S(""), 0, 0, 4);
3267    test(S("abcdefghij"), 5, 4, S(""), 0, 1, 4);
3268    test(S("abcdefghij"), 5, 4, S(""), 1, 0, 0);
3269    test(S("abcdefghij"), 5, 4, S("abcde"), 0, 0, 4);
3270    test(S("abcdefghij"), 5, 4, S("abcde"), 0, 1, 5);
3271    test(S("abcdefghij"), 5, 4, S("abcde"), 0, 2, 5);
3272    test(S("abcdefghij"), 5, 4, S("abcde"), 0, 4, 5);
3273    test(S("abcdefghij"), 5, 4, S("abcde"), 0, 5, 5);
3274    test(S("abcdefghij"), 5, 4, S("abcde"), 0, 6, 5);
3275    test(S("abcdefghij"), 5, 4, S("abcde"), 1, 0, 4);
3276    test(S("abcdefghij"), 5, 4, S("abcde"), 1, 1, 4);
3277    test(S("abcdefghij"), 5, 4, S("abcde"), 1, 2, 4);
3278    test(S("abcdefghij"), 5, 4, S("abcde"), 1, 3, 4);
3279    test(S("abcdefghij"), 5, 4, S("abcde"), 1, 4, 4);
3280    test(S("abcdefghij"), 5, 4, S("abcde"), 1, 5, 4);
3281    test(S("abcdefghij"), 5, 4, S("abcde"), 2, 0, 4);
3282    test(S("abcdefghij"), 5, 4, S("abcde"), 2, 1, 3);
3283    test(S("abcdefghij"), 5, 4, S("abcde"), 2, 2, 3);
3284    test(S("abcdefghij"), 5, 4, S("abcde"), 2, 3, 3);
3285    test(S("abcdefghij"), 5, 4, S("abcde"), 2, 4, 3);
3286    test(S("abcdefghij"), 5, 4, S("abcde"), 4, 0, 4);
3287    test(S("abcdefghij"), 5, 4, S("abcde"), 4, 1, 1);
3288    test(S("abcdefghij"), 5, 4, S("abcde"), 4, 2, 1);
3289    test(S("abcdefghij"), 5, 4, S("abcde"), 5, 0, 4);
3290    test(S("abcdefghij"), 5, 4, S("abcde"), 5, 1, 4);
3291    test(S("abcdefghij"), 5, 4, S("abcde"), 6, 0, 0);
3292    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 0, 4);
3293    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 1, 5);
3294    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 5, 5);
3295    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 9, 5);
3296    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 10, 5);
3297    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 11, 5);
3298    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 0, 4);
3299    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 1, 4);
3300    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 4, 4);
3301    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 8, 4);
3302    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 9, 4);
3303    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 10, 4);
3304    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 0, 4);
3305    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 1, 3);
3306    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 2, 2);
3307    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 4, 0);
3308    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 5, -1);
3309    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 6, -1);
3310    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 9, 0, 4);
3311    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 9, 1, -4);
3312    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 9, 2, -4);
3313    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 10, 0, 4);
3314    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 10, 1, 4);
3315    test(S("abcdefghij"), 5, 4, S("abcdefghij"), 11, 0, 0);
3316    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 0, 4);
3317    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 1, 5);
3318    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 10, 5);
3319    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 19, 5);
3320    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 20, 5);
3321    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 21, 5);
3322    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 0, 4);
3323    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 1, 4);
3324    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 9, 4);
3325    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 18, 4);
3326    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 19, 4);
3327    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 20, 4);
3328    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 0, 4);
3329    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 1, -5);
3330    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 5, -5);
3331    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 9, -5);
3332}
3333
3334template <class S>
3335void test31()
3336{
3337    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 10, -5);
3338    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 11, -5);
3339    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 19, 0, 4);
3340    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 19, 1, -14);
3341    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 19, 2, -14);
3342    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 20, 0, 4);
3343    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 20, 1, 4);
3344    test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
3345    test(S("abcdefghij"), 5, 5, S(""), 0, 0, 5);
3346    test(S("abcdefghij"), 5, 5, S(""), 0, 1, 5);
3347    test(S("abcdefghij"), 5, 5, S(""), 1, 0, 0);
3348    test(S("abcdefghij"), 5, 5, S("abcde"), 0, 0, 5);
3349    test(S("abcdefghij"), 5, 5, S("abcde"), 0, 1, 5);
3350    test(S("abcdefghij"), 5, 5, S("abcde"), 0, 2, 5);
3351    test(S("abcdefghij"), 5, 5, S("abcde"), 0, 4, 5);
3352    test(S("abcdefghij"), 5, 5, S("abcde"), 0, 5, 5);
3353    test(S("abcdefghij"), 5, 5, S("abcde"), 0, 6, 5);
3354    test(S("abcdefghij"), 5, 5, S("abcde"), 1, 0, 5);
3355    test(S("abcdefghij"), 5, 5, S("abcde"), 1, 1, 4);
3356    test(S("abcdefghij"), 5, 5, S("abcde"), 1, 2, 4);
3357    test(S("abcdefghij"), 5, 5, S("abcde"), 1, 3, 4);
3358    test(S("abcdefghij"), 5, 5, S("abcde"), 1, 4, 4);
3359    test(S("abcdefghij"), 5, 5, S("abcde"), 1, 5, 4);
3360    test(S("abcdefghij"), 5, 5, S("abcde"), 2, 0, 5);
3361    test(S("abcdefghij"), 5, 5, S("abcde"), 2, 1, 3);
3362    test(S("abcdefghij"), 5, 5, S("abcde"), 2, 2, 3);
3363    test(S("abcdefghij"), 5, 5, S("abcde"), 2, 3, 3);
3364    test(S("abcdefghij"), 5, 5, S("abcde"), 2, 4, 3);
3365    test(S("abcdefghij"), 5, 5, S("abcde"), 4, 0, 5);
3366    test(S("abcdefghij"), 5, 5, S("abcde"), 4, 1, 1);
3367    test(S("abcdefghij"), 5, 5, S("abcde"), 4, 2, 1);
3368    test(S("abcdefghij"), 5, 5, S("abcde"), 5, 0, 5);
3369    test(S("abcdefghij"), 5, 5, S("abcde"), 5, 1, 5);
3370    test(S("abcdefghij"), 5, 5, S("abcde"), 6, 0, 0);
3371    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 0, 5);
3372    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 1, 5);
3373    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 5, 5);
3374    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 9, 5);
3375    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 10, 5);
3376    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 11, 5);
3377    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 0, 5);
3378    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 1, 4);
3379    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 4, 4);
3380    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 8, 4);
3381    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 9, 4);
3382    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 10, 4);
3383    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 0, 5);
3384    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 1, 4);
3385    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 2, 3);
3386    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 4, 1);
3387    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 5, 0);
3388    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 6, 0);
3389    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 9, 0, 5);
3390    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 9, 1, -4);
3391    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 9, 2, -4);
3392    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 10, 0, 5);
3393    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 10, 1, 5);
3394    test(S("abcdefghij"), 5, 5, S("abcdefghij"), 11, 0, 0);
3395    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 0, 5);
3396    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 1, 5);
3397    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 10, 5);
3398    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 19, 5);
3399    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 20, 5);
3400    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 21, 5);
3401    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 0, 5);
3402    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 1, 4);
3403    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 9, 4);
3404    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 18, 4);
3405    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 19, 4);
3406    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 20, 4);
3407    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 0, 5);
3408    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 1, -5);
3409    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 5, -5);
3410    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 9, -5);
3411    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 10, -5);
3412    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 11, -5);
3413    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 19, 0, 5);
3414    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 19, 1, -14);
3415    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 19, 2, -14);
3416    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 20, 0, 5);
3417    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 20, 1, 5);
3418    test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
3419    test(S("abcdefghij"), 5, 6, S(""), 0, 0, 5);
3420    test(S("abcdefghij"), 5, 6, S(""), 0, 1, 5);
3421    test(S("abcdefghij"), 5, 6, S(""), 1, 0, 0);
3422    test(S("abcdefghij"), 5, 6, S("abcde"), 0, 0, 5);
3423    test(S("abcdefghij"), 5, 6, S("abcde"), 0, 1, 5);
3424    test(S("abcdefghij"), 5, 6, S("abcde"), 0, 2, 5);
3425    test(S("abcdefghij"), 5, 6, S("abcde"), 0, 4, 5);
3426    test(S("abcdefghij"), 5, 6, S("abcde"), 0, 5, 5);
3427    test(S("abcdefghij"), 5, 6, S("abcde"), 0, 6, 5);
3428    test(S("abcdefghij"), 5, 6, S("abcde"), 1, 0, 5);
3429    test(S("abcdefghij"), 5, 6, S("abcde"), 1, 1, 4);
3430    test(S("abcdefghij"), 5, 6, S("abcde"), 1, 2, 4);
3431    test(S("abcdefghij"), 5, 6, S("abcde"), 1, 3, 4);
3432    test(S("abcdefghij"), 5, 6, S("abcde"), 1, 4, 4);
3433    test(S("abcdefghij"), 5, 6, S("abcde"), 1, 5, 4);
3434    test(S("abcdefghij"), 5, 6, S("abcde"), 2, 0, 5);
3435    test(S("abcdefghij"), 5, 6, S("abcde"), 2, 1, 3);
3436    test(S("abcdefghij"), 5, 6, S("abcde"), 2, 2, 3);
3437}
3438
3439template <class S>
3440void test32()
3441{
3442    test(S("abcdefghij"), 5, 6, S("abcde"), 2, 3, 3);
3443    test(S("abcdefghij"), 5, 6, S("abcde"), 2, 4, 3);
3444    test(S("abcdefghij"), 5, 6, S("abcde"), 4, 0, 5);
3445    test(S("abcdefghij"), 5, 6, S("abcde"), 4, 1, 1);
3446    test(S("abcdefghij"), 5, 6, S("abcde"), 4, 2, 1);
3447    test(S("abcdefghij"), 5, 6, S("abcde"), 5, 0, 5);
3448    test(S("abcdefghij"), 5, 6, S("abcde"), 5, 1, 5);
3449    test(S("abcdefghij"), 5, 6, S("abcde"), 6, 0, 0);
3450    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 0, 5);
3451    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 1, 5);
3452    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 5, 5);
3453    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 9, 5);
3454    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 10, 5);
3455    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 11, 5);
3456    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 0, 5);
3457    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 1, 4);
3458    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 4, 4);
3459    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 8, 4);
3460    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 9, 4);
3461    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 10, 4);
3462    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 0, 5);
3463    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 1, 4);
3464    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 2, 3);
3465    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 4, 1);
3466    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 5, 0);
3467    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 6, 0);
3468    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 9, 0, 5);
3469    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 9, 1, -4);
3470    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 9, 2, -4);
3471    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 10, 0, 5);
3472    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 10, 1, 5);
3473    test(S("abcdefghij"), 5, 6, S("abcdefghij"), 11, 0, 0);
3474    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 0, 5);
3475    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 1, 5);
3476    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 10, 5);
3477    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 19, 5);
3478    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 20, 5);
3479    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 21, 5);
3480    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 0, 5);
3481    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 1, 4);
3482    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 9, 4);
3483    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 18, 4);
3484    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 19, 4);
3485    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 20, 4);
3486    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 0, 5);
3487    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 1, -5);
3488    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 5, -5);
3489    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 9, -5);
3490    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 10, -5);
3491    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 11, -5);
3492    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 19, 0, 5);
3493    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 19, 1, -14);
3494    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 19, 2, -14);
3495    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 20, 0, 5);
3496    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 20, 1, 5);
3497    test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 21, 0, 0);
3498    test(S("abcdefghij"), 9, 0, S(""), 0, 0, 0);
3499    test(S("abcdefghij"), 9, 0, S(""), 0, 1, 0);
3500    test(S("abcdefghij"), 9, 0, S(""), 1, 0, 0);
3501    test(S("abcdefghij"), 9, 0, S("abcde"), 0, 0, 0);
3502    test(S("abcdefghij"), 9, 0, S("abcde"), 0, 1, -1);
3503    test(S("abcdefghij"), 9, 0, S("abcde"), 0, 2, -2);
3504    test(S("abcdefghij"), 9, 0, S("abcde"), 0, 4, -4);
3505    test(S("abcdefghij"), 9, 0, S("abcde"), 0, 5, -5);
3506    test(S("abcdefghij"), 9, 0, S("abcde"), 0, 6, -5);
3507    test(S("abcdefghij"), 9, 0, S("abcde"), 1, 0, 0);
3508    test(S("abcdefghij"), 9, 0, S("abcde"), 1, 1, -1);
3509    test(S("abcdefghij"), 9, 0, S("abcde"), 1, 2, -2);
3510    test(S("abcdefghij"), 9, 0, S("abcde"), 1, 3, -3);
3511    test(S("abcdefghij"), 9, 0, S("abcde"), 1, 4, -4);
3512    test(S("abcdefghij"), 9, 0, S("abcde"), 1, 5, -4);
3513    test(S("abcdefghij"), 9, 0, S("abcde"), 2, 0, 0);
3514    test(S("abcdefghij"), 9, 0, S("abcde"), 2, 1, -1);
3515    test(S("abcdefghij"), 9, 0, S("abcde"), 2, 2, -2);
3516    test(S("abcdefghij"), 9, 0, S("abcde"), 2, 3, -3);
3517    test(S("abcdefghij"), 9, 0, S("abcde"), 2, 4, -3);
3518    test(S("abcdefghij"), 9, 0, S("abcde"), 4, 0, 0);
3519    test(S("abcdefghij"), 9, 0, S("abcde"), 4, 1, -1);
3520    test(S("abcdefghij"), 9, 0, S("abcde"), 4, 2, -1);
3521    test(S("abcdefghij"), 9, 0, S("abcde"), 5, 0, 0);
3522    test(S("abcdefghij"), 9, 0, S("abcde"), 5, 1, 0);
3523    test(S("abcdefghij"), 9, 0, S("abcde"), 6, 0, 0);
3524    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 0, 0);
3525    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 1, -1);
3526    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 5, -5);
3527    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 9, -9);
3528    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 10, -10);
3529    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 11, -10);
3530    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 0, 0);
3531    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 1, -1);
3532    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 4, -4);
3533    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 8, -8);
3534    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 9, -9);
3535    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 10, -9);
3536    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 0, 0);
3537    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 1, -1);
3538    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 2, -2);
3539    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 4, -4);
3540    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 5, -5);
3541    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 6, -5);
3542}
3543
3544template <class S>
3545void test33()
3546{
3547    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 9, 0, 0);
3548    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 9, 1, -1);
3549    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 9, 2, -1);
3550    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 10, 0, 0);
3551    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 10, 1, 0);
3552    test(S("abcdefghij"), 9, 0, S("abcdefghij"), 11, 0, 0);
3553    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3554    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
3555    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
3556    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
3557    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
3558    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
3559    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3560    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
3561    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
3562    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
3563    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
3564    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
3565    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3566    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
3567    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
3568    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
3569    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
3570    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
3571    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
3572    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
3573    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
3574    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
3575    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
3576    test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
3577    test(S("abcdefghij"), 9, 1, S(""), 0, 0, 1);
3578    test(S("abcdefghij"), 9, 1, S(""), 0, 1, 1);
3579    test(S("abcdefghij"), 9, 1, S(""), 1, 0, 0);
3580    test(S("abcdefghij"), 9, 1, S("abcde"), 0, 0, 1);
3581    test(S("abcdefghij"), 9, 1, S("abcde"), 0, 1, 9);
3582    test(S("abcdefghij"), 9, 1, S("abcde"), 0, 2, 9);
3583    test(S("abcdefghij"), 9, 1, S("abcde"), 0, 4, 9);
3584    test(S("abcdefghij"), 9, 1, S("abcde"), 0, 5, 9);
3585    test(S("abcdefghij"), 9, 1, S("abcde"), 0, 6, 9);
3586    test(S("abcdefghij"), 9, 1, S("abcde"), 1, 0, 1);
3587    test(S("abcdefghij"), 9, 1, S("abcde"), 1, 1, 8);
3588    test(S("abcdefghij"), 9, 1, S("abcde"), 1, 2, 8);
3589    test(S("abcdefghij"), 9, 1, S("abcde"), 1, 3, 8);
3590    test(S("abcdefghij"), 9, 1, S("abcde"), 1, 4, 8);
3591    test(S("abcdefghij"), 9, 1, S("abcde"), 1, 5, 8);
3592    test(S("abcdefghij"), 9, 1, S("abcde"), 2, 0, 1);
3593    test(S("abcdefghij"), 9, 1, S("abcde"), 2, 1, 7);
3594    test(S("abcdefghij"), 9, 1, S("abcde"), 2, 2, 7);
3595    test(S("abcdefghij"), 9, 1, S("abcde"), 2, 3, 7);
3596    test(S("abcdefghij"), 9, 1, S("abcde"), 2, 4, 7);
3597    test(S("abcdefghij"), 9, 1, S("abcde"), 4, 0, 1);
3598    test(S("abcdefghij"), 9, 1, S("abcde"), 4, 1, 5);
3599    test(S("abcdefghij"), 9, 1, S("abcde"), 4, 2, 5);
3600    test(S("abcdefghij"), 9, 1, S("abcde"), 5, 0, 1);
3601    test(S("abcdefghij"), 9, 1, S("abcde"), 5, 1, 1);
3602    test(S("abcdefghij"), 9, 1, S("abcde"), 6, 0, 0);
3603    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 0, 1);
3604    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 1, 9);
3605    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 5, 9);
3606    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 9, 9);
3607    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 10, 9);
3608    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 11, 9);
3609    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 0, 1);
3610    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 1, 8);
3611    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 4, 8);
3612    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 8, 8);
3613    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 9, 8);
3614    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 10, 8);
3615    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 0, 1);
3616    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 1, 4);
3617    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 2, 4);
3618    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 4, 4);
3619    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 5, 4);
3620    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 6, 4);
3621    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9, 0, 1);
3622    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9, 1, 0);
3623    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9, 2, 0);
3624    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 10, 0, 1);
3625    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 10, 1, 1);
3626    test(S("abcdefghij"), 9, 1, S("abcdefghij"), 11, 0, 0);
3627    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
3628    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 1, 9);
3629    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 10, 9);
3630    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 19, 9);
3631    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 20, 9);
3632    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 21, 9);
3633    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
3634    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 1, 8);
3635    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 9, 8);
3636    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 18, 8);
3637    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 19, 8);
3638    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 20, 8);
3639    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
3640    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
3641    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 5, -1);
3642    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 9, -1);
3643    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 10, -1);
3644    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 11, -1);
3645    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
3646    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 19, 1, -10);
3647}
3648
3649template <class S>
3650void test34()
3651{
3652    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 19, 2, -10);
3653    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
3654    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
3655    test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
3656    test(S("abcdefghij"), 9, 2, S(""), 0, 0, 1);
3657    test(S("abcdefghij"), 9, 2, S(""), 0, 1, 1);
3658    test(S("abcdefghij"), 9, 2, S(""), 1, 0, 0);
3659    test(S("abcdefghij"), 9, 2, S("abcde"), 0, 0, 1);
3660    test(S("abcdefghij"), 9, 2, S("abcde"), 0, 1, 9);
3661    test(S("abcdefghij"), 9, 2, S("abcde"), 0, 2, 9);
3662    test(S("abcdefghij"), 9, 2, S("abcde"), 0, 4, 9);
3663    test(S("abcdefghij"), 9, 2, S("abcde"), 0, 5, 9);
3664    test(S("abcdefghij"), 9, 2, S("abcde"), 0, 6, 9);
3665    test(S("abcdefghij"), 9, 2, S("abcde"), 1, 0, 1);
3666    test(S("abcdefghij"), 9, 2, S("abcde"), 1, 1, 8);
3667    test(S("abcdefghij"), 9, 2, S("abcde"), 1, 2, 8);
3668    test(S("abcdefghij"), 9, 2, S("abcde"), 1, 3, 8);
3669    test(S("abcdefghij"), 9, 2, S("abcde"), 1, 4, 8);
3670    test(S("abcdefghij"), 9, 2, S("abcde"), 1, 5, 8);
3671    test(S("abcdefghij"), 9, 2, S("abcde"), 2, 0, 1);
3672    test(S("abcdefghij"), 9, 2, S("abcde"), 2, 1, 7);
3673    test(S("abcdefghij"), 9, 2, S("abcde"), 2, 2, 7);
3674    test(S("abcdefghij"), 9, 2, S("abcde"), 2, 3, 7);
3675    test(S("abcdefghij"), 9, 2, S("abcde"), 2, 4, 7);
3676    test(S("abcdefghij"), 9, 2, S("abcde"), 4, 0, 1);
3677    test(S("abcdefghij"), 9, 2, S("abcde"), 4, 1, 5);
3678    test(S("abcdefghij"), 9, 2, S("abcde"), 4, 2, 5);
3679    test(S("abcdefghij"), 9, 2, S("abcde"), 5, 0, 1);
3680    test(S("abcdefghij"), 9, 2, S("abcde"), 5, 1, 1);
3681    test(S("abcdefghij"), 9, 2, S("abcde"), 6, 0, 0);
3682    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 0, 1);
3683    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 1, 9);
3684    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 5, 9);
3685    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 9, 9);
3686    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 10, 9);
3687    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 11, 9);
3688    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 0, 1);
3689    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 1, 8);
3690    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 4, 8);
3691    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 8, 8);
3692    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 9, 8);
3693    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 10, 8);
3694    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 0, 1);
3695    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 1, 4);
3696    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 2, 4);
3697    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 4, 4);
3698    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 5, 4);
3699    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 6, 4);
3700    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9, 0, 1);
3701    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9, 1, 0);
3702    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9, 2, 0);
3703    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 10, 0, 1);
3704    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 10, 1, 1);
3705    test(S("abcdefghij"), 9, 2, S("abcdefghij"), 11, 0, 0);
3706    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 0, 1);
3707    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 1, 9);
3708    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 10, 9);
3709    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 19, 9);
3710    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 20, 9);
3711    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 21, 9);
3712    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 0, 1);
3713    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 1, 8);
3714    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 9, 8);
3715    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 18, 8);
3716    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 19, 8);
3717    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 20, 8);
3718    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 0, 1);
3719    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 1, -1);
3720    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 5, -1);
3721    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 9, -1);
3722    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 10, -1);
3723    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 11, -1);
3724    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 19, 0, 1);
3725    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 19, 1, -10);
3726    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 19, 2, -10);
3727    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 20, 0, 1);
3728    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 20, 1, 1);
3729    test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
3730    test(S("abcdefghij"), 10, 0, S(""), 0, 0, 0);
3731    test(S("abcdefghij"), 10, 0, S(""), 0, 1, 0);
3732    test(S("abcdefghij"), 10, 0, S(""), 1, 0, 0);
3733    test(S("abcdefghij"), 10, 0, S("abcde"), 0, 0, 0);
3734    test(S("abcdefghij"), 10, 0, S("abcde"), 0, 1, -1);
3735    test(S("abcdefghij"), 10, 0, S("abcde"), 0, 2, -2);
3736    test(S("abcdefghij"), 10, 0, S("abcde"), 0, 4, -4);
3737    test(S("abcdefghij"), 10, 0, S("abcde"), 0, 5, -5);
3738    test(S("abcdefghij"), 10, 0, S("abcde"), 0, 6, -5);
3739    test(S("abcdefghij"), 10, 0, S("abcde"), 1, 0, 0);
3740    test(S("abcdefghij"), 10, 0, S("abcde"), 1, 1, -1);
3741    test(S("abcdefghij"), 10, 0, S("abcde"), 1, 2, -2);
3742    test(S("abcdefghij"), 10, 0, S("abcde"), 1, 3, -3);
3743    test(S("abcdefghij"), 10, 0, S("abcde"), 1, 4, -4);
3744    test(S("abcdefghij"), 10, 0, S("abcde"), 1, 5, -4);
3745    test(S("abcdefghij"), 10, 0, S("abcde"), 2, 0, 0);
3746    test(S("abcdefghij"), 10, 0, S("abcde"), 2, 1, -1);
3747    test(S("abcdefghij"), 10, 0, S("abcde"), 2, 2, -2);
3748    test(S("abcdefghij"), 10, 0, S("abcde"), 2, 3, -3);
3749    test(S("abcdefghij"), 10, 0, S("abcde"), 2, 4, -3);
3750    test(S("abcdefghij"), 10, 0, S("abcde"), 4, 0, 0);
3751    test(S("abcdefghij"), 10, 0, S("abcde"), 4, 1, -1);
3752}
3753
3754template <class S>
3755void test35()
3756{
3757    test(S("abcdefghij"), 10, 0, S("abcde"), 4, 2, -1);
3758    test(S("abcdefghij"), 10, 0, S("abcde"), 5, 0, 0);
3759    test(S("abcdefghij"), 10, 0, S("abcde"), 5, 1, 0);
3760    test(S("abcdefghij"), 10, 0, S("abcde"), 6, 0, 0);
3761    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 0, 0);
3762    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 1, -1);
3763    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 5, -5);
3764    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 9, -9);
3765    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 10, -10);
3766    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 11, -10);
3767    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 0, 0);
3768    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 1, -1);
3769    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 4, -4);
3770    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 8, -8);
3771    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 9, -9);
3772    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 10, -9);
3773    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 0, 0);
3774    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 1, -1);
3775    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 2, -2);
3776    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 4, -4);
3777    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 5, -5);
3778    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 6, -5);
3779    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 9, 0, 0);
3780    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 9, 1, -1);
3781    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 9, 2, -1);
3782    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 10, 0, 0);
3783    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 10, 1, 0);
3784    test(S("abcdefghij"), 10, 0, S("abcdefghij"), 11, 0, 0);
3785    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3786    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
3787    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
3788    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
3789    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
3790    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
3791    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3792    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
3793    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
3794    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
3795    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
3796    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
3797    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3798    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
3799    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
3800    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
3801    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
3802    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
3803    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
3804    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
3805    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
3806    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
3807    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
3808    test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
3809    test(S("abcdefghij"), 10, 1, S(""), 0, 0, 0);
3810    test(S("abcdefghij"), 10, 1, S(""), 0, 1, 0);
3811    test(S("abcdefghij"), 10, 1, S(""), 1, 0, 0);
3812    test(S("abcdefghij"), 10, 1, S("abcde"), 0, 0, 0);
3813    test(S("abcdefghij"), 10, 1, S("abcde"), 0, 1, -1);
3814    test(S("abcdefghij"), 10, 1, S("abcde"), 0, 2, -2);
3815    test(S("abcdefghij"), 10, 1, S("abcde"), 0, 4, -4);
3816    test(S("abcdefghij"), 10, 1, S("abcde"), 0, 5, -5);
3817    test(S("abcdefghij"), 10, 1, S("abcde"), 0, 6, -5);
3818    test(S("abcdefghij"), 10, 1, S("abcde"), 1, 0, 0);
3819    test(S("abcdefghij"), 10, 1, S("abcde"), 1, 1, -1);
3820    test(S("abcdefghij"), 10, 1, S("abcde"), 1, 2, -2);
3821    test(S("abcdefghij"), 10, 1, S("abcde"), 1, 3, -3);
3822    test(S("abcdefghij"), 10, 1, S("abcde"), 1, 4, -4);
3823    test(S("abcdefghij"), 10, 1, S("abcde"), 1, 5, -4);
3824    test(S("abcdefghij"), 10, 1, S("abcde"), 2, 0, 0);
3825    test(S("abcdefghij"), 10, 1, S("abcde"), 2, 1, -1);
3826    test(S("abcdefghij"), 10, 1, S("abcde"), 2, 2, -2);
3827    test(S("abcdefghij"), 10, 1, S("abcde"), 2, 3, -3);
3828    test(S("abcdefghij"), 10, 1, S("abcde"), 2, 4, -3);
3829    test(S("abcdefghij"), 10, 1, S("abcde"), 4, 0, 0);
3830    test(S("abcdefghij"), 10, 1, S("abcde"), 4, 1, -1);
3831    test(S("abcdefghij"), 10, 1, S("abcde"), 4, 2, -1);
3832    test(S("abcdefghij"), 10, 1, S("abcde"), 5, 0, 0);
3833    test(S("abcdefghij"), 10, 1, S("abcde"), 5, 1, 0);
3834    test(S("abcdefghij"), 10, 1, S("abcde"), 6, 0, 0);
3835    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 0, 0);
3836    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 1, -1);
3837    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 5, -5);
3838    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 9, -9);
3839    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 10, -10);
3840    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 11, -10);
3841    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 0, 0);
3842    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 1, -1);
3843    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 4, -4);
3844    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 8, -8);
3845    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 9, -9);
3846    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 10, -9);
3847    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 0, 0);
3848    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 1, -1);
3849    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 2, -2);
3850    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 4, -4);
3851    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 5, -5);
3852    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 6, -5);
3853    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 9, 0, 0);
3854    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 9, 1, -1);
3855    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 9, 2, -1);
3856    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 10, 0, 0);
3857}
3858
3859template <class S>
3860void test36()
3861{
3862    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 10, 1, 0);
3863    test(S("abcdefghij"), 10, 1, S("abcdefghij"), 11, 0, 0);
3864    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 0, 0);
3865    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 1, -1);
3866    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 10, -10);
3867    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 19, -19);
3868    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 20, -20);
3869    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 21, -20);
3870    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 0, 0);
3871    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
3872    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 9, -9);
3873    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 18, -18);
3874    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 19, -19);
3875    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 20, -19);
3876    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 0, 0);
3877    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
3878    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
3879    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
3880    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
3881    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
3882    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 19, 0, 0);
3883    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 19, 1, -1);
3884    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 19, 2, -1);
3885    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 20, 0, 0);
3886    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 20, 1, 0);
3887    test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
3888    test(S("abcdefghij"), 11, 0, S(""), 0, 0, 0);
3889    test(S("abcdefghij"), 11, 0, S(""), 0, 1, 0);
3890    test(S("abcdefghij"), 11, 0, S(""), 1, 0, 0);
3891    test(S("abcdefghij"), 11, 0, S("abcde"), 0, 0, 0);
3892    test(S("abcdefghij"), 11, 0, S("abcde"), 0, 1, 0);
3893    test(S("abcdefghij"), 11, 0, S("abcde"), 0, 2, 0);
3894    test(S("abcdefghij"), 11, 0, S("abcde"), 0, 4, 0);
3895    test(S("abcdefghij"), 11, 0, S("abcde"), 0, 5, 0);
3896    test(S("abcdefghij"), 11, 0, S("abcde"), 0, 6, 0);
3897    test(S("abcdefghij"), 11, 0, S("abcde"), 1, 0, 0);
3898    test(S("abcdefghij"), 11, 0, S("abcde"), 1, 1, 0);
3899    test(S("abcdefghij"), 11, 0, S("abcde"), 1, 2, 0);
3900    test(S("abcdefghij"), 11, 0, S("abcde"), 1, 3, 0);
3901    test(S("abcdefghij"), 11, 0, S("abcde"), 1, 4, 0);
3902    test(S("abcdefghij"), 11, 0, S("abcde"), 1, 5, 0);
3903    test(S("abcdefghij"), 11, 0, S("abcde"), 2, 0, 0);
3904    test(S("abcdefghij"), 11, 0, S("abcde"), 2, 1, 0);
3905    test(S("abcdefghij"), 11, 0, S("abcde"), 2, 2, 0);
3906    test(S("abcdefghij"), 11, 0, S("abcde"), 2, 3, 0);
3907    test(S("abcdefghij"), 11, 0, S("abcde"), 2, 4, 0);
3908    test(S("abcdefghij"), 11, 0, S("abcde"), 4, 0, 0);
3909    test(S("abcdefghij"), 11, 0, S("abcde"), 4, 1, 0);
3910    test(S("abcdefghij"), 11, 0, S("abcde"), 4, 2, 0);
3911    test(S("abcdefghij"), 11, 0, S("abcde"), 5, 0, 0);
3912    test(S("abcdefghij"), 11, 0, S("abcde"), 5, 1, 0);
3913    test(S("abcdefghij"), 11, 0, S("abcde"), 6, 0, 0);
3914    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 0, 0);
3915    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 1, 0);
3916    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 5, 0);
3917    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 9, 0);
3918    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 10, 0);
3919    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 11, 0);
3920    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 0, 0);
3921    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 1, 0);
3922    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 4, 0);
3923    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 8, 0);
3924    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 9, 0);
3925    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 10, 0);
3926    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 0, 0);
3927    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 1, 0);
3928    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 2, 0);
3929    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 4, 0);
3930    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 5, 0);
3931    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 6, 0);
3932    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 9, 0, 0);
3933    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 9, 1, 0);
3934    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 9, 2, 0);
3935    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 10, 0, 0);
3936    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 10, 1, 0);
3937    test(S("abcdefghij"), 11, 0, S("abcdefghij"), 11, 0, 0);
3938    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3939    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 1, 0);
3940    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 10, 0);
3941    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 19, 0);
3942    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 20, 0);
3943    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 21, 0);
3944    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3945    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 1, 0);
3946    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 9, 0);
3947    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 18, 0);
3948    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 19, 0);
3949    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 20, 0);
3950    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3951    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 1, 0);
3952    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 5, 0);
3953    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 9, 0);
3954    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 10, 0);
3955    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 11, 0);
3956    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
3957    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 19, 1, 0);
3958    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 19, 2, 0);
3959    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
3960    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
3961    test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
3962}
3963
3964template <class S>
3965void test37()
3966{
3967    test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 0, 0, 0);
3968    test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 0, 1, 0);
3969    test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 1, 0, 0);
3970    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 0, 0);
3971    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 1, -1);
3972    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 2, -2);
3973    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 4, -4);
3974    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 5, -5);
3975    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 6, -5);
3976    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 0, 0);
3977    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 1, -1);
3978    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 2, -2);
3979    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 3, -3);
3980    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 4, -4);
3981    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 5, -4);
3982    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 0, 0);
3983    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 1, -1);
3984    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 2, -2);
3985    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 3, -3);
3986    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 4, -3);
3987    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 4, 0, 0);
3988    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 4, 1, -1);
3989    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 4, 2, -1);
3990    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 5, 0, 0);
3991    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 5, 1, 0);
3992    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 6, 0, 0);
3993    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 0, 0);
3994    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 1, -1);
3995    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 5, -5);
3996    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 9, -9);
3997    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 10, -10);
3998    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 11, -10);
3999    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 0, 0);
4000    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 1, -1);
4001    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 4, -4);
4002    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 8, -8);
4003    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 9, -9);
4004    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 10, -9);
4005    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 0, 0);
4006    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 1, -1);
4007    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 2, -2);
4008    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 4, -4);
4009    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 5, -5);
4010    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 6, -5);
4011    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 9, 0, 0);
4012    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 9, 1, -1);
4013    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 9, 2, -1);
4014    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 10, 0, 0);
4015    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 10, 1, 0);
4016    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 11, 0, 0);
4017    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
4018    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
4019    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
4020    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
4021    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
4022    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
4023    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
4024    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
4025    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
4026    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
4027    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
4028    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
4029    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
4030    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
4031    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
4032    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
4033    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
4034    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
4035    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
4036    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
4037    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
4038    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
4039    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
4040    test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
4041    test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 0, 0, 1);
4042    test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 0, 1, 1);
4043    test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 1, 0, 0);
4044    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 0, 1);
4045    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 1, 0);
4046    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 2, -1);
4047    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 4, -3);
4048    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 5, -4);
4049    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 6, -4);
4050    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 0, 1);
4051    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 1, -1);
4052    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 2, -1);
4053    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 3, -1);
4054    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 4, -1);
4055    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 5, -1);
4056    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 0, 1);
4057    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 1, -2);
4058    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 2, -2);
4059    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 3, -2);
4060    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 4, -2);
4061    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 4, 0, 1);
4062    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 4, 1, -4);
4063    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 4, 2, -4);
4064    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 5, 0, 1);
4065    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 5, 1, 1);
4066    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 6, 0, 0);
4067}
4068
4069template <class S>
4070void test38()
4071{
4072    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 0, 1);
4073    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 1, 0);
4074    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 5, -4);
4075    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 9, -8);
4076    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 10, -9);
4077    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 11, -9);
4078    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 0, 1);
4079    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 1, -1);
4080    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 4, -1);
4081    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 8, -1);
4082    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 9, -1);
4083    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 10, -1);
4084    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 0, 1);
4085    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 1, -5);
4086    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 2, -5);
4087    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 4, -5);
4088    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 5, -5);
4089    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 6, -5);
4090    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 9, 0, 1);
4091    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 9, 1, -9);
4092    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 9, 2, -9);
4093    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 10, 0, 1);
4094    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 10, 1, 1);
4095    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 11, 0, 0);
4096    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
4097    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, 0);
4098    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -9);
4099    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -18);
4100    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -19);
4101    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -19);
4102    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
4103    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
4104    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -1);
4105    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -1);
4106    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -1);
4107    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -1);
4108    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
4109    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -10);
4110    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -10);
4111    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -10);
4112    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
4113    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
4114    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
4115    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -19);
4116    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -19);
4117    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
4118    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
4119    test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
4120    test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 0, 0, 10);
4121    test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 0, 1, 10);
4122    test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 1, 0, 0);
4123    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 0, 10);
4124    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 1, 9);
4125    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 2, 8);
4126    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 4, 6);
4127    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 5, 5);
4128    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 6, 5);
4129    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 0, 10);
4130    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 1, -1);
4131    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 2, -1);
4132    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 3, -1);
4133    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 4, -1);
4134    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 5, -1);
4135    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 0, 10);
4136    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 1, -2);
4137    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 2, -2);
4138    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 3, -2);
4139    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 4, -2);
4140    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 4, 0, 10);
4141    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 4, 1, -4);
4142    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 4, 2, -4);
4143    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 5, 0, 10);
4144    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 5, 1, 10);
4145    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 6, 0, 0);
4146    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 0, 10);
4147    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 1, 9);
4148    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 5, 5);
4149    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 9, 1);
4150    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 10, 0);
4151    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 11, 0);
4152    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 0, 10);
4153    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 1, -1);
4154    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 4, -1);
4155    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 8, -1);
4156    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 9, -1);
4157    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 10, -1);
4158    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 0, 10);
4159    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 1, -5);
4160    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 2, -5);
4161    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 4, -5);
4162    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 5, -5);
4163    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 6, -5);
4164    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 9, 0, 10);
4165    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 9, 1, -9);
4166    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 9, 2, -9);
4167    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 10, 0, 10);
4168    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 10, 1, 10);
4169    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 11, 0, 0);
4170    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 0, 10);
4171    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 1, 9);
4172}
4173
4174template <class S>
4175void test39()
4176{
4177    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 10, 0);
4178    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 19, -9);
4179    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 20, -10);
4180    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 21, -10);
4181    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 0, 10);
4182    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 1, -1);
4183    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 9, -1);
4184    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 18, -1);
4185    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 19, -1);
4186    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 20, -1);
4187    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 0, 10);
4188    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 1, -10);
4189    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 5, -10);
4190    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 9, -10);
4191    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 10, -10);
4192    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 11, -10);
4193    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 19, 0, 10);
4194    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 19, 1, -19);
4195    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 19, 2, -19);
4196    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 20, 0, 10);
4197    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 20, 1, 10);
4198    test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 21, 0, 0);
4199    test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 0, 0, 19);
4200    test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 0, 1, 19);
4201    test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 1, 0, 0);
4202    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 0, 19);
4203    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 1, 18);
4204    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 2, 17);
4205    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 4, 15);
4206    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 5, 14);
4207    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 6, 14);
4208    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 0, 19);
4209    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 1, -1);
4210    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 2, -1);
4211    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 3, -1);
4212    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 4, -1);
4213    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 5, -1);
4214    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 0, 19);
4215    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 1, -2);
4216    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 2, -2);
4217    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 3, -2);
4218    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 4, -2);
4219    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 4, 0, 19);
4220    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 4, 1, -4);
4221    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 4, 2, -4);
4222    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 5, 0, 19);
4223    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 5, 1, 19);
4224    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 6, 0, 0);
4225    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 0, 19);
4226    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 1, 18);
4227    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 5, 14);
4228    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 9, 10);
4229    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 10, 9);
4230    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 11, 9);
4231    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 0, 19);
4232    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 1, -1);
4233    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 4, -1);
4234    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 8, -1);
4235    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 9, -1);
4236    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 10, -1);
4237    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 0, 19);
4238    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 1, -5);
4239    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 2, -5);
4240    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 4, -5);
4241    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 5, -5);
4242    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 6, -5);
4243    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9, 0, 19);
4244    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9, 1, -9);
4245    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9, 2, -9);
4246    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 10, 0, 19);
4247    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 10, 1, 19);
4248    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 11, 0, 0);
4249    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 0, 19);
4250    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 1, 18);
4251    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 10, 9);
4252    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 19, 0);
4253    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 20, -1);
4254    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 21, -1);
4255    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 0, 19);
4256    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 1, -1);
4257    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 9, -1);
4258    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 18, -1);
4259    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 19, -1);
4260    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 20, -1);
4261    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 0, 19);
4262    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 1, -10);
4263    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 5, -10);
4264    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 9, -10);
4265    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 10, -10);
4266    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 11, -10);
4267    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 19, 0, 19);
4268    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 19, 1, -19);
4269    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 19, 2, -19);
4270    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 20, 0, 19);
4271    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 20, 1, 19);
4272    test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 21, 0, 0);
4273    test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 0, 0, 20);
4274    test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 0, 1, 20);
4275    test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 1, 0, 0);
4276    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 0, 20);
4277}
4278
4279template <class S>
4280void test40()
4281{
4282    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 1, 19);
4283    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 2, 18);
4284    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 4, 16);
4285    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 5, 15);
4286    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 6, 15);
4287    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 0, 20);
4288    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 1, -1);
4289    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 2, -1);
4290    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 3, -1);
4291    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 4, -1);
4292    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 5, -1);
4293    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 0, 20);
4294    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 1, -2);
4295    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 2, -2);
4296    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 3, -2);
4297    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 4, -2);
4298    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 4, 0, 20);
4299    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 4, 1, -4);
4300    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 4, 2, -4);
4301    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 5, 0, 20);
4302    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 5, 1, 20);
4303    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 6, 0, 0);
4304    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 0, 20);
4305    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 1, 19);
4306    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 5, 15);
4307    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 9, 11);
4308    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 10, 10);
4309    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 11, 10);
4310    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 0, 20);
4311    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 1, -1);
4312    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 4, -1);
4313    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 8, -1);
4314    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 9, -1);
4315    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 10, -1);
4316    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 0, 20);
4317    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 1, -5);
4318    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 2, -5);
4319    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 4, -5);
4320    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 5, -5);
4321    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 6, -5);
4322    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 9, 0, 20);
4323    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 9, 1, -9);
4324    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 9, 2, -9);
4325    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 10, 0, 20);
4326    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 10, 1, 20);
4327    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 11, 0, 0);
4328    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 0, 20);
4329    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 1, 19);
4330    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 10, 10);
4331    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 19, 1);
4332    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 20, 0);
4333    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 21, 0);
4334    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 0, 20);
4335    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 1, -1);
4336    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 9, -1);
4337    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 18, -1);
4338    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 19, -1);
4339    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 20, -1);
4340    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 0, 20);
4341    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 1, -10);
4342    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 5, -10);
4343    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 9, -10);
4344    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 10, -10);
4345    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 11, -10);
4346    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 19, 0, 20);
4347    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 19, 1, -19);
4348    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 19, 2, -19);
4349    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 20, 0, 20);
4350    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 20, 1, 20);
4351    test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 21, 0, 0);
4352    test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 0, 0, 20);
4353    test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 0, 1, 20);
4354    test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 1, 0, 0);
4355    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 0, 20);
4356    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 1, 19);
4357    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 2, 18);
4358    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 4, 16);
4359    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 5, 15);
4360    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 6, 15);
4361    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 0, 20);
4362    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 1, -1);
4363    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 2, -1);
4364    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 3, -1);
4365    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 4, -1);
4366    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 5, -1);
4367    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 0, 20);
4368    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 1, -2);
4369    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 2, -2);
4370    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 3, -2);
4371    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 4, -2);
4372    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 4, 0, 20);
4373    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 4, 1, -4);
4374    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 4, 2, -4);
4375    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 5, 0, 20);
4376    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 5, 1, 20);
4377    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 6, 0, 0);
4378    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 0, 20);
4379    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 1, 19);
4380    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 5, 15);
4381    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 9, 11);
4382}
4383
4384template <class S>
4385void test41()
4386{
4387    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 10, 10);
4388    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 11, 10);
4389    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 0, 20);
4390    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 1, -1);
4391    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 4, -1);
4392    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 8, -1);
4393    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 9, -1);
4394    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 10, -1);
4395    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 0, 20);
4396    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 1, -5);
4397    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 2, -5);
4398    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 4, -5);
4399    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 5, -5);
4400    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 6, -5);
4401    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 9, 0, 20);
4402    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 9, 1, -9);
4403    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 9, 2, -9);
4404    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 10, 0, 20);
4405    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 10, 1, 20);
4406    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 11, 0, 0);
4407    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 0, 20);
4408    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 1, 19);
4409    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 10, 10);
4410    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 19, 1);
4411    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 20, 0);
4412    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 21, 0);
4413    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 0, 20);
4414    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 1, -1);
4415    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 9, -1);
4416    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 18, -1);
4417    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 19, -1);
4418    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 20, -1);
4419    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 0, 20);
4420    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 1, -10);
4421    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 5, -10);
4422    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 9, -10);
4423    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 10, -10);
4424    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 11, -10);
4425    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 19, 0, 20);
4426    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 19, 1, -19);
4427    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 19, 2, -19);
4428    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 20, 0, 20);
4429    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 20, 1, 20);
4430    test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 21, 0, 0);
4431    test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 0, 0, 0);
4432    test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 0, 1, 0);
4433    test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 1, 0, 0);
4434    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 0, 0);
4435    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 1, -1);
4436    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 2, -2);
4437    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 4, -4);
4438    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 5, -5);
4439    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 6, -5);
4440    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 0, 0);
4441    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 1, -1);
4442    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 2, -2);
4443    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 3, -3);
4444    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 4, -4);
4445    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 5, -4);
4446    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 0, 0);
4447    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 1, -1);
4448    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 2, -2);
4449    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 3, -3);
4450    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 4, -3);
4451    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 4, 0, 0);
4452    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 4, 1, -1);
4453    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 4, 2, -1);
4454    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 5, 0, 0);
4455    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 5, 1, 0);
4456    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 6, 0, 0);
4457    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 0, 0);
4458    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 1, -1);
4459    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 5, -5);
4460    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 9, -9);
4461    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 10, -10);
4462    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 11, -10);
4463    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 0, 0);
4464    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 1, -1);
4465    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 4, -4);
4466    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 8, -8);
4467    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 9, -9);
4468    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 10, -9);
4469    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 0, 0);
4470    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 1, -1);
4471    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 2, -2);
4472    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 4, -4);
4473    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 5, -5);
4474    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 6, -5);
4475    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 9, 0, 0);
4476    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 9, 1, -1);
4477    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 9, 2, -1);
4478    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 10, 0, 0);
4479    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 10, 1, 0);
4480    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 11, 0, 0);
4481    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
4482    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
4483    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
4484    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
4485    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
4486    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
4487}
4488
4489template <class S>
4490void test42()
4491{
4492    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
4493    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
4494    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
4495    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
4496    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
4497    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
4498    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
4499    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
4500    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
4501    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
4502    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
4503    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
4504    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
4505    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
4506    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
4507    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
4508    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
4509    test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
4510    test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 0, 0, 1);
4511    test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 0, 1, 1);
4512    test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 1, 0, 0);
4513    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 0, 1);
4514    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 1, 1);
4515    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 2, 1);
4516    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 4, 1);
4517    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 5, 1);
4518    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 6, 1);
4519    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 0, 1);
4520    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 1, 0);
4521    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 2, -1);
4522    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 3, -2);
4523    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 4, -3);
4524    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 5, -3);
4525    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 0, 1);
4526    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 1, -1);
4527    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 2, -1);
4528    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 3, -1);
4529    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 4, -1);
4530    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 4, 0, 1);
4531    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 4, 1, -3);
4532    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 4, 2, -3);
4533    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 5, 0, 1);
4534    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 5, 1, 1);
4535    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 6, 0, 0);
4536    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 0, 1);
4537    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 1, 1);
4538    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 5, 1);
4539    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 9, 1);
4540    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 10, 1);
4541    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 11, 1);
4542    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 0, 1);
4543    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 1, 0);
4544    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 4, -3);
4545    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 8, -7);
4546    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 9, -8);
4547    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 10, -8);
4548    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 0, 1);
4549    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 1, -4);
4550    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 2, -4);
4551    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 4, -4);
4552    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 5, -4);
4553    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 6, -4);
4554    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 9, 0, 1);
4555    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 9, 1, -8);
4556    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 9, 2, -8);
4557    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 10, 0, 1);
4558    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 10, 1, 1);
4559    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 11, 0, 0);
4560    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
4561    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 1, 1);
4562    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 10, 1);
4563    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 19, 1);
4564    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 20, 1);
4565    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 21, 1);
4566    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
4567    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 1, 0);
4568    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 9, -8);
4569    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 18, -17);
4570    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 19, -18);
4571    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 20, -18);
4572    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
4573    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 1, -9);
4574    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 5, -9);
4575    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
4576    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 10, -9);
4577    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 11, -9);
4578    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
4579    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 19, 1, -18);
4580    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 19, 2, -18);
4581    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
4582    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
4583    test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
4584    test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 0, 0, 9);
4585    test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 0, 1, 9);
4586    test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 1, 0, 0);
4587    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 0, 9);
4588    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 1, 1);
4589    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 2, 1);
4590    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 4, 1);
4591    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 5, 1);
4592}
4593
4594template <class S>
4595void test43()
4596{
4597    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 6, 1);
4598    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 0, 9);
4599    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 1, 8);
4600    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 2, 7);
4601    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 3, 6);
4602    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 4, 5);
4603    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 5, 5);
4604    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 0, 9);
4605    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 1, -1);
4606    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 2, -1);
4607    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 3, -1);
4608    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 4, -1);
4609    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 4, 0, 9);
4610    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 4, 1, -3);
4611    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 4, 2, -3);
4612    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 5, 0, 9);
4613    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 5, 1, 9);
4614    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 6, 0, 0);
4615    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 0, 9);
4616    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 1, 1);
4617    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 5, 1);
4618    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 9, 1);
4619    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 10, 1);
4620    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 11, 1);
4621    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 0, 9);
4622    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 1, 8);
4623    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 4, 5);
4624    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 8, 1);
4625    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 9, 0);
4626    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 10, 0);
4627    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 0, 9);
4628    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 1, -4);
4629    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 2, -4);
4630    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 4, -4);
4631    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 5, -4);
4632    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 6, -4);
4633    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 9, 0, 9);
4634    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 9, 1, -8);
4635    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 9, 2, -8);
4636    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 10, 0, 9);
4637    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 10, 1, 9);
4638    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 11, 0, 0);
4639    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 0, 9);
4640    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 1, 1);
4641    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 10, 1);
4642    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 19, 1);
4643    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 20, 1);
4644    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 21, 1);
4645    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 0, 9);
4646    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 1, 8);
4647    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 9, 0);
4648    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 18, -9);
4649    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 19, -10);
4650    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 20, -10);
4651    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 0, 9);
4652    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 1, -9);
4653    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 5, -9);
4654    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 9, -9);
4655    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 10, -9);
4656    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 11, -9);
4657    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 19, 0, 9);
4658    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 19, 1, -18);
4659    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 19, 2, -18);
4660    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 20, 0, 9);
4661    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 20, 1, 9);
4662    test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 21, 0, 0);
4663    test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 0, 0, 18);
4664    test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 0, 1, 18);
4665    test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 1, 0, 0);
4666    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 0, 18);
4667    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 1, 1);
4668    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 2, 1);
4669    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 4, 1);
4670    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 5, 1);
4671    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 6, 1);
4672    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 0, 18);
4673    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 1, 17);
4674    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 2, 16);
4675    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 3, 15);
4676    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 4, 14);
4677    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 5, 14);
4678    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 0, 18);
4679    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 1, -1);
4680    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 2, -1);
4681    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 3, -1);
4682    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 4, -1);
4683    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 4, 0, 18);
4684    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 4, 1, -3);
4685    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 4, 2, -3);
4686    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 5, 0, 18);
4687    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 5, 1, 18);
4688    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 6, 0, 0);
4689    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 0, 18);
4690    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 1, 1);
4691    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 5, 1);
4692    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 9, 1);
4693    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 10, 1);
4694    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 11, 1);
4695    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 0, 18);
4696    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 1, 17);
4697}
4698
4699template <class S>
4700void test44()
4701{
4702    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 4, 14);
4703    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 8, 10);
4704    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 9, 9);
4705    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 10, 9);
4706    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 0, 18);
4707    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 1, -4);
4708    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 2, -4);
4709    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 4, -4);
4710    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 5, -4);
4711    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 6, -4);
4712    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 9, 0, 18);
4713    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 9, 1, -8);
4714    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 9, 2, -8);
4715    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 10, 0, 18);
4716    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 10, 1, 18);
4717    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 11, 0, 0);
4718    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 0, 18);
4719    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 1, 1);
4720    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 10, 1);
4721    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 19, 1);
4722    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 20, 1);
4723    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 21, 1);
4724    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 0, 18);
4725    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 1, 17);
4726    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 9, 9);
4727    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 18, 0);
4728    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 19, -1);
4729    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 20, -1);
4730    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 0, 18);
4731    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 1, -9);
4732    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 5, -9);
4733    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 9, -9);
4734    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 10, -9);
4735    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 11, -9);
4736    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 19, 0, 18);
4737    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 19, 1, -18);
4738    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 19, 2, -18);
4739    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 20, 0, 18);
4740    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 20, 1, 18);
4741    test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 21, 0, 0);
4742    test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 0, 0, 19);
4743    test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 0, 1, 19);
4744    test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 1, 0, 0);
4745    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 0, 19);
4746    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 1, 1);
4747    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 2, 1);
4748    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 4, 1);
4749    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 5, 1);
4750    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 6, 1);
4751    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 0, 19);
4752    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 1, 18);
4753    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 2, 17);
4754    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 3, 16);
4755    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 4, 15);
4756    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 5, 15);
4757    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 0, 19);
4758    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 1, -1);
4759    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 2, -1);
4760    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 3, -1);
4761    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 4, -1);
4762    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 4, 0, 19);
4763    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 4, 1, -3);
4764    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 4, 2, -3);
4765    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 5, 0, 19);
4766    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 5, 1, 19);
4767    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 6, 0, 0);
4768    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 0, 19);
4769    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 1, 1);
4770    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 5, 1);
4771    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 9, 1);
4772    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 10, 1);
4773    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 11, 1);
4774    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 0, 19);
4775    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 1, 18);
4776    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 4, 15);
4777    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 8, 11);
4778    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 9, 10);
4779    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 10, 10);
4780    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 0, 19);
4781    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 1, -4);
4782    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 2, -4);
4783    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 4, -4);
4784    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 5, -4);
4785    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 6, -4);
4786    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 9, 0, 19);
4787    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 9, 1, -8);
4788    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 9, 2, -8);
4789    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 10, 0, 19);
4790    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 10, 1, 19);
4791    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 11, 0, 0);
4792    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 0, 19);
4793    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 1, 1);
4794    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 10, 1);
4795    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 19, 1);
4796    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 20, 1);
4797    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 21, 1);
4798    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 0, 19);
4799    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 1, 18);
4800    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 9, 10);
4801    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 18, 1);
4802}
4803
4804template <class S>
4805void test45()
4806{
4807    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 19, 0);
4808    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 20, 0);
4809    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 0, 19);
4810    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 1, -9);
4811    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 5, -9);
4812    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 9, -9);
4813    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 10, -9);
4814    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 11, -9);
4815    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 19, 0, 19);
4816    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 19, 1, -18);
4817    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 19, 2, -18);
4818    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 20, 0, 19);
4819    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 20, 1, 19);
4820    test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 21, 0, 0);
4821    test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 0, 0, 19);
4822    test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 0, 1, 19);
4823    test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 1, 0, 0);
4824    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 0, 19);
4825    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 1, 1);
4826    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 2, 1);
4827    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 4, 1);
4828    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 5, 1);
4829    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 6, 1);
4830    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 0, 19);
4831    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 1, 18);
4832    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 2, 17);
4833    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 3, 16);
4834    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 4, 15);
4835    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 5, 15);
4836    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 0, 19);
4837    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 1, -1);
4838    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 2, -1);
4839    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 3, -1);
4840    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 4, -1);
4841    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 4, 0, 19);
4842    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 4, 1, -3);
4843    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 4, 2, -3);
4844    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 5, 0, 19);
4845    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 5, 1, 19);
4846    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 6, 0, 0);
4847    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 0, 19);
4848    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 1, 1);
4849    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 5, 1);
4850    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 9, 1);
4851    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 10, 1);
4852    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 11, 1);
4853    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 0, 19);
4854    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 1, 18);
4855    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 4, 15);
4856    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 8, 11);
4857    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 9, 10);
4858    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 10, 10);
4859    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 0, 19);
4860    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 1, -4);
4861    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 2, -4);
4862    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 4, -4);
4863    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 5, -4);
4864    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 6, -4);
4865    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 9, 0, 19);
4866    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 9, 1, -8);
4867    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 9, 2, -8);
4868    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 10, 0, 19);
4869    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 10, 1, 19);
4870    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 11, 0, 0);
4871    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 0, 19);
4872    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 1, 1);
4873    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 10, 1);
4874    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 19, 1);
4875    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 20, 1);
4876    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 21, 1);
4877    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 0, 19);
4878    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 1, 18);
4879    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 9, 10);
4880    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 18, 1);
4881    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 19, 0);
4882    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 20, 0);
4883    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 0, 19);
4884    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 1, -9);
4885    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 5, -9);
4886    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 9, -9);
4887    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 10, -9);
4888    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 11, -9);
4889    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 19, 0, 19);
4890    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 19, 1, -18);
4891    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 19, 2, -18);
4892    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 20, 0, 19);
4893    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 20, 1, 19);
4894    test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 21, 0, 0);
4895    test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 0, 0, 0);
4896    test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 0, 1, 0);
4897    test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 1, 0, 0);
4898    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 0, 0);
4899    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 1, -1);
4900    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 2, -2);
4901    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 4, -4);
4902    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 5, -5);
4903    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 6, -5);
4904    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 0, 0);
4905    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 1, -1);
4906    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 2, -2);
4907}
4908
4909template <class S>
4910void test46()
4911{
4912    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 3, -3);
4913    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 4, -4);
4914    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 5, -4);
4915    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 0, 0);
4916    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 1, -1);
4917    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 2, -2);
4918    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 3, -3);
4919    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 4, -3);
4920    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 4, 0, 0);
4921    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 4, 1, -1);
4922    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 4, 2, -1);
4923    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 5, 0, 0);
4924    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 5, 1, 0);
4925    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 6, 0, 0);
4926    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 0, 0);
4927    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 1, -1);
4928    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 5, -5);
4929    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 9, -9);
4930    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 10, -10);
4931    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 11, -10);
4932    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 0, 0);
4933    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 1, -1);
4934    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 4, -4);
4935    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 8, -8);
4936    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 9, -9);
4937    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 10, -9);
4938    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 0, 0);
4939    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 1, -1);
4940    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 2, -2);
4941    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 4, -4);
4942    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 5, -5);
4943    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 6, -5);
4944    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 9, 0, 0);
4945    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 9, 1, -1);
4946    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 9, 2, -1);
4947    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 10, 0, 0);
4948    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 10, 1, 0);
4949    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 11, 0, 0);
4950    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
4951    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
4952    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
4953    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
4954    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
4955    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
4956    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
4957    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
4958    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
4959    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
4960    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
4961    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
4962    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
4963    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
4964    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
4965    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
4966    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
4967    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
4968    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
4969    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
4970    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
4971    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
4972    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
4973    test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
4974    test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 0, 0, 1);
4975    test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 0, 1, 1);
4976    test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 1, 0, 0);
4977    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 0, 1);
4978    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 1, 10);
4979    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 2, 10);
4980    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 4, 10);
4981    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 5, 10);
4982    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 6, 10);
4983    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 0, 1);
4984    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 1, 9);
4985    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 2, 9);
4986    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 3, 9);
4987    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 4, 9);
4988    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 5, 9);
4989    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 0, 1);
4990    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 1, 8);
4991    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 2, 8);
4992    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 3, 8);
4993    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 4, 8);
4994    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 4, 0, 1);
4995    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 4, 1, 6);
4996    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 4, 2, 6);
4997    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 5, 0, 1);
4998    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 5, 1, 1);
4999    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 6, 0, 0);
5000    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 0, 1);
5001    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 1, 10);
5002    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 5, 10);
5003    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 9, 10);
5004    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 10, 10);
5005    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 11, 10);
5006    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 0, 1);
5007    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 1, 9);
5008    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 4, 9);
5009    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 8, 9);
5010    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 9, 9);
5011    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 10, 9);
5012}
5013
5014template <class S>
5015void test47()
5016{
5017    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 0, 1);
5018    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 1, 5);
5019    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 2, 5);
5020    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 4, 5);
5021    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 5, 5);
5022    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 6, 5);
5023    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 9, 0, 1);
5024    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 9, 1, 1);
5025    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 9, 2, 1);
5026    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 10, 0, 1);
5027    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 10, 1, 1);
5028    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 11, 0, 0);
5029    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
5030    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 1, 10);
5031    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 10, 10);
5032    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 19, 10);
5033    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 20, 10);
5034    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 21, 10);
5035    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
5036    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 1, 9);
5037    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 9, 9);
5038    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 18, 9);
5039    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 19, 9);
5040    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 20, 9);
5041    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
5042    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 1, 0);
5043    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 5, -4);
5044    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 9, -8);
5045    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 10, -9);
5046    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 11, -9);
5047    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
5048    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 19, 1, -9);
5049    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 19, 2, -9);
5050    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
5051    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
5052    test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
5053    test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 0, 0, 5);
5054    test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 0, 1, 5);
5055    test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 1, 0, 0);
5056    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 0, 5);
5057    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 1, 10);
5058    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 2, 10);
5059    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 4, 10);
5060    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 5, 10);
5061    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 6, 10);
5062    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 0, 5);
5063    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 1, 9);
5064    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 2, 9);
5065    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 3, 9);
5066    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 4, 9);
5067    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 5, 9);
5068    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 0, 5);
5069    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 1, 8);
5070    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 2, 8);
5071    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 3, 8);
5072    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 4, 8);
5073    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 4, 0, 5);
5074    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 4, 1, 6);
5075    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 4, 2, 6);
5076    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 5, 0, 5);
5077    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 5, 1, 5);
5078    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 6, 0, 0);
5079    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 0, 5);
5080    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 1, 10);
5081    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 5, 10);
5082    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 9, 10);
5083    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 10, 10);
5084    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 11, 10);
5085    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 0, 5);
5086    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 1, 9);
5087    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 4, 9);
5088    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 8, 9);
5089    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 9, 9);
5090    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 10, 9);
5091    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 0, 5);
5092    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 1, 5);
5093    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 2, 5);
5094    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 4, 5);
5095    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 5, 5);
5096    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 6, 5);
5097    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 9, 0, 5);
5098    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 9, 1, 1);
5099    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 9, 2, 1);
5100    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 10, 0, 5);
5101    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 10, 1, 5);
5102    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 11, 0, 0);
5103    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 0, 5);
5104    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 1, 10);
5105    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 10, 10);
5106    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 19, 10);
5107    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 20, 10);
5108    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 21, 10);
5109    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 0, 5);
5110    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 1, 9);
5111    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 9, 9);
5112    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 18, 9);
5113    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 19, 9);
5114    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 20, 9);
5115    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 0, 5);
5116    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 1, 4);
5117}
5118
5119template <class S>
5120void test48()
5121{
5122    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 5, 0);
5123    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 9, -4);
5124    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 10, -5);
5125    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 11, -5);
5126    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 19, 0, 5);
5127    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 19, 1, -9);
5128    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 19, 2, -9);
5129    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 20, 0, 5);
5130    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 20, 1, 5);
5131    test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
5132    test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 0, 0, 9);
5133    test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 0, 1, 9);
5134    test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 1, 0, 0);
5135    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 0, 9);
5136    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 1, 10);
5137    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 2, 10);
5138    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 4, 10);
5139    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 5, 10);
5140    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 6, 10);
5141    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 0, 9);
5142    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 1, 9);
5143    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 2, 9);
5144    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 3, 9);
5145    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 4, 9);
5146    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 5, 9);
5147    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 0, 9);
5148    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 1, 8);
5149    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 2, 8);
5150    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 3, 8);
5151    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 4, 8);
5152    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 4, 0, 9);
5153    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 4, 1, 6);
5154    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 4, 2, 6);
5155    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 5, 0, 9);
5156    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 5, 1, 9);
5157    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 6, 0, 0);
5158    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 0, 9);
5159    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 1, 10);
5160    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 5, 10);
5161    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 9, 10);
5162    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 10, 10);
5163    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 11, 10);
5164    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 0, 9);
5165    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 1, 9);
5166    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 4, 9);
5167    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 8, 9);
5168    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 9, 9);
5169    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 10, 9);
5170    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 0, 9);
5171    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 1, 5);
5172    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 2, 5);
5173    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 4, 5);
5174    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 5, 5);
5175    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 6, 5);
5176    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 9, 0, 9);
5177    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 9, 1, 1);
5178    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 9, 2, 1);
5179    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 10, 0, 9);
5180    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 10, 1, 9);
5181    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 11, 0, 0);
5182    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 0, 9);
5183    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 1, 10);
5184    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 10, 10);
5185    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 19, 10);
5186    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 20, 10);
5187    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 21, 10);
5188    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 0, 9);
5189    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 1, 9);
5190    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 9, 9);
5191    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 18, 9);
5192    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 19, 9);
5193    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 20, 9);
5194    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 0, 9);
5195    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 1, 8);
5196    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 5, 4);
5197    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 9, 0);
5198    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 10, -1);
5199    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 11, -1);
5200    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 19, 0, 9);
5201    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 19, 1, -9);
5202    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 19, 2, -9);
5203    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 20, 0, 9);
5204    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 20, 1, 9);
5205    test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 21, 0, 0);
5206    test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 0, 0, 10);
5207    test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 0, 1, 10);
5208    test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 1, 0, 0);
5209    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 0, 10);
5210    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 1, 10);
5211    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 2, 10);
5212    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 4, 10);
5213    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 5, 10);
5214    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 6, 10);
5215    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 0, 10);
5216    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 1, 9);
5217    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 2, 9);
5218    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 3, 9);
5219    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 4, 9);
5220    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 5, 9);
5221    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 0, 10);
5222}
5223
5224template <class S>
5225void test49()
5226{
5227    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 1, 8);
5228    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 2, 8);
5229    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 3, 8);
5230    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 4, 8);
5231    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 4, 0, 10);
5232    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 4, 1, 6);
5233    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 4, 2, 6);
5234    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 5, 0, 10);
5235    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 5, 1, 10);
5236    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 6, 0, 0);
5237    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 0, 10);
5238    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 1, 10);
5239    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 5, 10);
5240    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 9, 10);
5241    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 10, 10);
5242    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 11, 10);
5243    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 0, 10);
5244    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 1, 9);
5245    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 4, 9);
5246    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 8, 9);
5247    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 9, 9);
5248    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 10, 9);
5249    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 0, 10);
5250    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 1, 5);
5251    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 2, 5);
5252    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 4, 5);
5253    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 5, 5);
5254    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 6, 5);
5255    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 9, 0, 10);
5256    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 9, 1, 1);
5257    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 9, 2, 1);
5258    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 10, 0, 10);
5259    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 10, 1, 10);
5260    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 11, 0, 0);
5261    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 0, 10);
5262    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 1, 10);
5263    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 10, 10);
5264    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 19, 10);
5265    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 20, 10);
5266    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 21, 10);
5267    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 0, 10);
5268    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 1, 9);
5269    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 9, 9);
5270    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 18, 9);
5271    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 19, 9);
5272    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 20, 9);
5273    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 0, 10);
5274    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 1, 9);
5275    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 5, 5);
5276    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 9, 1);
5277    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 10, 0);
5278    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 11, 0);
5279    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 19, 0, 10);
5280    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 19, 1, -9);
5281    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 19, 2, -9);
5282    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 20, 0, 10);
5283    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 20, 1, 10);
5284    test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 21, 0, 0);
5285    test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 0, 0, 10);
5286    test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 0, 1, 10);
5287    test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 1, 0, 0);
5288    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 0, 10);
5289    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 1, 10);
5290    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 2, 10);
5291    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 4, 10);
5292    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 5, 10);
5293    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 6, 10);
5294    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 0, 10);
5295    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 1, 9);
5296    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 2, 9);
5297    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 3, 9);
5298    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 4, 9);
5299    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 5, 9);
5300    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 0, 10);
5301    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 1, 8);
5302    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 2, 8);
5303    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 3, 8);
5304    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 4, 8);
5305    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 4, 0, 10);
5306    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 4, 1, 6);
5307    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 4, 2, 6);
5308    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 5, 0, 10);
5309    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 5, 1, 10);
5310    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 6, 0, 0);
5311    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 0, 10);
5312    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 1, 10);
5313    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 5, 10);
5314    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 9, 10);
5315    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 10, 10);
5316    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 11, 10);
5317    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 0, 10);
5318    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 1, 9);
5319    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 4, 9);
5320    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 8, 9);
5321    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 9, 9);
5322    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 10, 9);
5323    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 0, 10);
5324    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 1, 5);
5325    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 2, 5);
5326    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 4, 5);
5327}
5328
5329template <class S>
5330void test50()
5331{
5332    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 5, 5);
5333    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 6, 5);
5334    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 9, 0, 10);
5335    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 9, 1, 1);
5336    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 9, 2, 1);
5337    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 10, 0, 10);
5338    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 10, 1, 10);
5339    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 11, 0, 0);
5340    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 0, 10);
5341    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 1, 10);
5342    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 10, 10);
5343    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 19, 10);
5344    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 20, 10);
5345    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 21, 10);
5346    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 0, 10);
5347    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 1, 9);
5348    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 9, 9);
5349    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 18, 9);
5350    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 19, 9);
5351    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 20, 9);
5352    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 0, 10);
5353    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 1, 9);
5354    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 5, 5);
5355    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 9, 1);
5356    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 10, 0);
5357    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 11, 0);
5358    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 19, 0, 10);
5359    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 19, 1, -9);
5360    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 19, 2, -9);
5361    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 20, 0, 10);
5362    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 20, 1, 10);
5363    test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 21, 0, 0);
5364    test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 0, 0, 0);
5365    test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 0, 1, 0);
5366    test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 1, 0, 0);
5367    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 0, 0);
5368    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 1, -1);
5369    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 2, -2);
5370    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 4, -4);
5371    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 5, -5);
5372    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 6, -5);
5373    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 0, 0);
5374    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 1, -1);
5375    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 2, -2);
5376    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 3, -3);
5377    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 4, -4);
5378    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 5, -4);
5379    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 0, 0);
5380    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 1, -1);
5381    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 2, -2);
5382    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 3, -3);
5383    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 4, -3);
5384    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 4, 0, 0);
5385    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 4, 1, -1);
5386    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 4, 2, -1);
5387    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 5, 0, 0);
5388    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 5, 1, 0);
5389    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 6, 0, 0);
5390    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 0, 0);
5391    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 1, -1);
5392    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 5, -5);
5393    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 9, -9);
5394    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 10, -10);
5395    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 11, -10);
5396    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 0, 0);
5397    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 1, -1);
5398    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 4, -4);
5399    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 8, -8);
5400    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 9, -9);
5401    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 10, -9);
5402    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 0, 0);
5403    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 1, -1);
5404    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 2, -2);
5405    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 4, -4);
5406    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 5, -5);
5407    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 6, -5);
5408    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 9, 0, 0);
5409    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 9, 1, -1);
5410    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 9, 2, -1);
5411    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 10, 0, 0);
5412    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 10, 1, 0);
5413    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 11, 0, 0);
5414    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
5415    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
5416    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
5417    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
5418    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
5419    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
5420    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
5421    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
5422    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
5423    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
5424    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
5425    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
5426    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
5427    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
5428    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
5429    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
5430    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
5431    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
5432}
5433
5434template <class S>
5435void test51()
5436{
5437    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
5438    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
5439    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
5440    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
5441    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
5442    test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
5443    test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 0, 0, 1);
5444    test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 0, 1, 1);
5445    test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 1, 0, 0);
5446    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 0, 1);
5447    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 1, 19);
5448    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 2, 19);
5449    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 4, 19);
5450    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 5, 19);
5451    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 6, 19);
5452    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 0, 1);
5453    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 1, 18);
5454    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 2, 18);
5455    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 3, 18);
5456    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 4, 18);
5457    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 5, 18);
5458    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 0, 1);
5459    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 1, 17);
5460    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 2, 17);
5461    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 3, 17);
5462    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 4, 17);
5463    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 4, 0, 1);
5464    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 4, 1, 15);
5465    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 4, 2, 15);
5466    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 5, 0, 1);
5467    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 5, 1, 1);
5468    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 6, 0, 0);
5469    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 0, 1);
5470    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 1, 19);
5471    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 5, 19);
5472    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 9, 19);
5473    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 10, 19);
5474    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 11, 19);
5475    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 0, 1);
5476    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 1, 18);
5477    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 4, 18);
5478    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 8, 18);
5479    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 9, 18);
5480    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 10, 18);
5481    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 0, 1);
5482    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 1, 14);
5483    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 2, 14);
5484    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 4, 14);
5485    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 5, 14);
5486    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 6, 14);
5487    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 9, 0, 1);
5488    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 9, 1, 10);
5489    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 9, 2, 10);
5490    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 10, 0, 1);
5491    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 10, 1, 1);
5492    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 11, 0, 0);
5493    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
5494    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 1, 19);
5495    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 10, 19);
5496    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 19, 19);
5497    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 20, 19);
5498    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 21, 19);
5499    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
5500    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 1, 18);
5501    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 9, 18);
5502    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 18, 18);
5503    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 19, 18);
5504    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 20, 18);
5505    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
5506    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 1, 9);
5507    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 5, 9);
5508    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 9, 9);
5509    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 10, 9);
5510    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 11, 9);
5511    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
5512    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19, 1, 0);
5513    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19, 2, 0);
5514    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
5515    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
5516    test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
5517    test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 0, 0, 1);
5518    test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 0, 1, 1);
5519    test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 1, 0, 0);
5520    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 0, 1);
5521    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 1, 19);
5522    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 2, 19);
5523    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 4, 19);
5524    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 5, 19);
5525    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 6, 19);
5526    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 0, 1);
5527    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 1, 18);
5528    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 2, 18);
5529    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 3, 18);
5530    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 4, 18);
5531    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 5, 18);
5532    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 0, 1);
5533    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 1, 17);
5534    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 2, 17);
5535    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 3, 17);
5536    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 4, 17);
5537}
5538
5539template <class S>
5540void test52()
5541{
5542    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 4, 0, 1);
5543    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 4, 1, 15);
5544    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 4, 2, 15);
5545    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 5, 0, 1);
5546    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 5, 1, 1);
5547    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 6, 0, 0);
5548    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 0, 1);
5549    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 1, 19);
5550    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 5, 19);
5551    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 9, 19);
5552    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 10, 19);
5553    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 11, 19);
5554    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 0, 1);
5555    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 1, 18);
5556    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 4, 18);
5557    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 8, 18);
5558    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 9, 18);
5559    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 10, 18);
5560    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 0, 1);
5561    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 1, 14);
5562    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 2, 14);
5563    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 4, 14);
5564    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 5, 14);
5565    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 6, 14);
5566    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 9, 0, 1);
5567    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 9, 1, 10);
5568    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 9, 2, 10);
5569    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 10, 0, 1);
5570    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 10, 1, 1);
5571    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 11, 0, 0);
5572    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 0, 1);
5573    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 1, 19);
5574    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 10, 19);
5575    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 19, 19);
5576    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 20, 19);
5577    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 21, 19);
5578    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 0, 1);
5579    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 1, 18);
5580    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 9, 18);
5581    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 18, 18);
5582    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 19, 18);
5583    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 20, 18);
5584    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 0, 1);
5585    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 1, 9);
5586    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 5, 9);
5587    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 9, 9);
5588    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 10, 9);
5589    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 11, 9);
5590    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19, 0, 1);
5591    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19, 1, 0);
5592    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19, 2, 0);
5593    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 20, 0, 1);
5594    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 20, 1, 1);
5595    test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
5596    test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 0, 0, 0);
5597    test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 0, 1, 0);
5598    test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 1, 0, 0);
5599    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 0, 0);
5600    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 1, -1);
5601    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 2, -2);
5602    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 4, -4);
5603    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 5, -5);
5604    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 6, -5);
5605    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 0, 0);
5606    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 1, -1);
5607    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 2, -2);
5608    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 3, -3);
5609    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 4, -4);
5610    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 5, -4);
5611    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 0, 0);
5612    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 1, -1);
5613    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 2, -2);
5614    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 3, -3);
5615    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 4, -3);
5616    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 4, 0, 0);
5617    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 4, 1, -1);
5618    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 4, 2, -1);
5619    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 5, 0, 0);
5620    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 5, 1, 0);
5621    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 6, 0, 0);
5622    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 0, 0);
5623    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 1, -1);
5624    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 5, -5);
5625    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 9, -9);
5626    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 10, -10);
5627    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 11, -10);
5628    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 0, 0);
5629    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 1, -1);
5630    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 4, -4);
5631    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 8, -8);
5632    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 9, -9);
5633    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 10, -9);
5634    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 0, 0);
5635    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 1, -1);
5636    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 2, -2);
5637    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 4, -4);
5638    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 5, -5);
5639    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 6, -5);
5640    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 9, 0, 0);
5641    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 9, 1, -1);
5642}
5643
5644template <class S>
5645void test53()
5646{
5647    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 9, 2, -1);
5648    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 10, 0, 0);
5649    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 10, 1, 0);
5650    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 11, 0, 0);
5651    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
5652    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
5653    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
5654    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
5655    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
5656    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
5657    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
5658    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
5659    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
5660    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
5661    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
5662    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
5663    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
5664    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
5665    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
5666    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
5667    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
5668    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
5669    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
5670    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
5671    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
5672    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
5673    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
5674    test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
5675    test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 0, 0, 0);
5676    test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 0, 1, 0);
5677    test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 1, 0, 0);
5678    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 0, 0);
5679    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 1, -1);
5680    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 2, -2);
5681    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 4, -4);
5682    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 5, -5);
5683    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 6, -5);
5684    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 0, 0);
5685    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 1, -1);
5686    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 2, -2);
5687    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 3, -3);
5688    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 4, -4);
5689    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 5, -4);
5690    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 0, 0);
5691    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 1, -1);
5692    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 2, -2);
5693    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 3, -3);
5694    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 4, -3);
5695    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 4, 0, 0);
5696    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 4, 1, -1);
5697    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 4, 2, -1);
5698    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 5, 0, 0);
5699    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 5, 1, 0);
5700    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 6, 0, 0);
5701    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 0, 0);
5702    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 1, -1);
5703    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 5, -5);
5704    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 9, -9);
5705    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 10, -10);
5706    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 11, -10);
5707    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 0, 0);
5708    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 1, -1);
5709    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 4, -4);
5710    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 8, -8);
5711    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 9, -9);
5712    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 10, -9);
5713    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 0, 0);
5714    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 1, -1);
5715    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 2, -2);
5716    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 4, -4);
5717    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 5, -5);
5718    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 6, -5);
5719    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 9, 0, 0);
5720    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 9, 1, -1);
5721    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 9, 2, -1);
5722    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 10, 0, 0);
5723    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 10, 1, 0);
5724    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 11, 0, 0);
5725    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 0, 0);
5726    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 1, -1);
5727    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 10, -10);
5728    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 19, -19);
5729    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 20, -20);
5730    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 21, -20);
5731    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 0, 0);
5732    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
5733    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 9, -9);
5734    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 18, -18);
5735    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 19, -19);
5736    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 20, -19);
5737    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 0, 0);
5738    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
5739    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
5740    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
5741    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
5742    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
5743    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 19, 0, 0);
5744    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 19, 1, -1);
5745    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 19, 2, -1);
5746    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 20, 0, 0);
5747}
5748
5749template <class S>
5750void test54()
5751{
5752    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 20, 1, 0);
5753    test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
5754    test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 0, 0, 0);
5755    test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 0, 1, 0);
5756    test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 1, 0, 0);
5757    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 0, 0);
5758    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 1, 0);
5759    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 2, 0);
5760    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 4, 0);
5761    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 5, 0);
5762    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 6, 0);
5763    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 0, 0);
5764    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 1, 0);
5765    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 2, 0);
5766    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 3, 0);
5767    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 4, 0);
5768    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 5, 0);
5769    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 0, 0);
5770    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 1, 0);
5771    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 2, 0);
5772    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 3, 0);
5773    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 4, 0);
5774    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 4, 0, 0);
5775    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 4, 1, 0);
5776    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 4, 2, 0);
5777    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 5, 0, 0);
5778    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 5, 1, 0);
5779    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 6, 0, 0);
5780    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 0, 0);
5781    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 1, 0);
5782    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 5, 0);
5783    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 9, 0);
5784    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 10, 0);
5785    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 11, 0);
5786    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 0, 0);
5787    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 1, 0);
5788    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 4, 0);
5789    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 8, 0);
5790    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 9, 0);
5791    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 10, 0);
5792    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 0, 0);
5793    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 1, 0);
5794    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 2, 0);
5795    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 4, 0);
5796    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 5, 0);
5797    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 6, 0);
5798    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 9, 0, 0);
5799    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 9, 1, 0);
5800    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 9, 2, 0);
5801    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 10, 0, 0);
5802    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 10, 1, 0);
5803    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 11, 0, 0);
5804    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
5805    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 1, 0);
5806    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 10, 0);
5807    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 19, 0);
5808    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 20, 0);
5809    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 21, 0);
5810    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
5811    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 1, 0);
5812    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 9, 0);
5813    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 18, 0);
5814    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 19, 0);
5815    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 20, 0);
5816    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
5817    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 1, 0);
5818    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 5, 0);
5819    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 9, 0);
5820    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 10, 0);
5821    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 11, 0);
5822    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
5823    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 19, 1, 0);
5824    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 19, 2, 0);
5825    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
5826    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
5827    test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
5828}
5829
5830template<class S>
5831void test55()
5832{
5833    test_npos(S(""), 0, 0, S(""), 0, 0);
5834    test_npos(S(""), 0, 0, S("abcde"), 0, -5);
5835    test_npos(S("abcde"), 0, 0, S("abcdefghij"), 0, -10);
5836    test_npos(S("abcde"), 0, 0, S("abcdefghij"), 1, -9);
5837    test_npos(S("abcde"), 0, 0, S("abcdefghij"), 5, -5);
5838}
5839
5840int main()
5841{
5842    {
5843    typedef std::string S;
5844    test0<S>();
5845    test1<S>();
5846    test2<S>();
5847    test3<S>();
5848    test4<S>();
5849    test5<S>();
5850    test6<S>();
5851    test7<S>();
5852    test8<S>();
5853    test9<S>();
5854    test10<S>();
5855    test11<S>();
5856    test12<S>();
5857    test13<S>();
5858    test14<S>();
5859    test15<S>();
5860    test16<S>();
5861    test17<S>();
5862    test18<S>();
5863    test19<S>();
5864    test20<S>();
5865    test21<S>();
5866    test22<S>();
5867    test23<S>();
5868    test24<S>();
5869    test25<S>();
5870    test26<S>();
5871    test27<S>();
5872    test28<S>();
5873    test29<S>();
5874    test30<S>();
5875    test31<S>();
5876    test32<S>();
5877    test33<S>();
5878    test34<S>();
5879    test35<S>();
5880    test36<S>();
5881    test37<S>();
5882    test38<S>();
5883    test39<S>();
5884    test40<S>();
5885    test41<S>();
5886    test42<S>();
5887    test43<S>();
5888    test44<S>();
5889    test45<S>();
5890    test46<S>();
5891    test47<S>();
5892    test48<S>();
5893    test49<S>();
5894    test50<S>();
5895    test51<S>();
5896    test52<S>();
5897    test53<S>();
5898    test54<S>();
5899    test55<S>();
5900    }
5901#if TEST_STD_VER >= 11
5902    {
5903    typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
5904    test0<S>();
5905    test1<S>();
5906    test2<S>();
5907    test3<S>();
5908    test4<S>();
5909    test5<S>();
5910    test6<S>();
5911    test7<S>();
5912    test8<S>();
5913    test9<S>();
5914    test10<S>();
5915    test11<S>();
5916    test12<S>();
5917    test13<S>();
5918    test14<S>();
5919    test15<S>();
5920    test16<S>();
5921    test17<S>();
5922    test18<S>();
5923    test19<S>();
5924    test20<S>();
5925    test21<S>();
5926    test22<S>();
5927    test23<S>();
5928    test24<S>();
5929    test25<S>();
5930    test26<S>();
5931    test27<S>();
5932    test28<S>();
5933    test29<S>();
5934    test30<S>();
5935    test31<S>();
5936    test32<S>();
5937    test33<S>();
5938    test34<S>();
5939    test35<S>();
5940    test36<S>();
5941    test37<S>();
5942    test38<S>();
5943    test39<S>();
5944    test40<S>();
5945    test41<S>();
5946    test42<S>();
5947    test43<S>();
5948    test44<S>();
5949    test45<S>();
5950    test46<S>();
5951    test47<S>();
5952    test48<S>();
5953    test49<S>();
5954    test50<S>();
5955    test51<S>();
5956    test52<S>();
5957    test53<S>();
5958    test54<S>();
5959    test55<S>();
5960    }
5961#endif
5962}
5963