@c15t/backend 1.2.0-canary.8 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +53 -52
- package/CHANGELOG.md +7 -0
- package/dist/__tests__/server.test.d.ts +2 -0
- package/dist/__tests__/server.test.d.ts.map +1 -0
- package/dist/contracts/index.d.ts +1 -1
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts.cjs +708 -0
- package/dist/contracts.js +661 -0
- package/dist/core.cjs +98 -47
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +98 -47
- package/dist/middleware/openapi/config.d.ts +1 -1
- package/dist/middleware/openapi/config.d.ts.map +1 -1
- package/dist/pkgs/data-model/index.cjs +57 -39
- package/dist/pkgs/data-model/index.js +57 -39
- package/dist/pkgs/data-model/schema/index.cjs +57 -39
- package/dist/pkgs/data-model/schema/index.js +57 -39
- package/dist/router.cjs +3 -1
- package/dist/router.js +3 -1
- package/dist/schema/consent-policy/registry.d.ts.map +1 -1
- package/dist/schema/create-registry.d.ts.map +1 -1
- package/dist/schema/index.cjs +57 -39
- package/dist/schema/index.js +57 -39
- package/package.json +9 -4
- package/rslib.config.ts +1 -0
- package/src/__tests__/server.test.ts +96 -0
- package/src/contracts/index.ts +2 -0
- package/src/core.ts +34 -1
- package/src/middleware/cors/cors.test.ts +0 -1
- package/src/middleware/openapi/config.ts +10 -7
- package/src/schema/consent-policy/registry.ts +74 -51
- package/.turbo/turbo-fmt.log +0 -7
- package/.turbo/turbo-test.log +0 -426
- package/coverage/coverage-final.json +0 -88
- package/coverage/coverage-summary.json +0 -89
- package/coverage/html/backend/index.html +0 -116
- package/coverage/html/backend/rslib.config.ts.html +0 -415
- package/coverage/html/backend/src/contracts/consent/index.html +0 -161
- package/coverage/html/backend/src/contracts/consent/index.ts.html +0 -112
- package/coverage/html/backend/src/contracts/consent/post.contract.ts.html +0 -550
- package/coverage/html/backend/src/contracts/consent/show-banner.contract.ts.html +0 -220
- package/coverage/html/backend/src/contracts/consent/verify.contract.ts.html +0 -463
- package/coverage/html/backend/src/contracts/index.html +0 -116
- package/coverage/html/backend/src/contracts/index.ts.html +0 -139
- package/coverage/html/backend/src/contracts/meta/index.html +0 -131
- package/coverage/html/backend/src/contracts/meta/index.ts.html +0 -100
- package/coverage/html/backend/src/contracts/meta/status.contract.ts.html +0 -196
- package/coverage/html/backend/src/contracts/shared/index.html +0 -116
- package/coverage/html/backend/src/contracts/shared/jurisdiction.schema.ts.html +0 -175
- package/coverage/html/backend/src/core.ts.html +0 -1342
- package/coverage/html/backend/src/handlers/consent/index.html +0 -161
- package/coverage/html/backend/src/handlers/consent/index.ts.html +0 -112
- package/coverage/html/backend/src/handlers/consent/post.handler.ts.html +0 -904
- package/coverage/html/backend/src/handlers/consent/show-banner.handler.ts.html +0 -532
- package/coverage/html/backend/src/handlers/consent/verify.handler.ts.html +0 -1000
- package/coverage/html/backend/src/handlers/meta/index.html +0 -131
- package/coverage/html/backend/src/handlers/meta/index.ts.html +0 -100
- package/coverage/html/backend/src/handlers/meta/status.handler.ts.html +0 -226
- package/coverage/html/backend/src/index.html +0 -161
- package/coverage/html/backend/src/init.ts.html +0 -1018
- package/coverage/html/backend/src/middleware/cors/cors.ts.html +0 -661
- package/coverage/html/backend/src/middleware/cors/index.html +0 -146
- package/coverage/html/backend/src/middleware/cors/is-origin-trusted.ts.html +0 -463
- package/coverage/html/backend/src/middleware/cors/process-cors.ts.html +0 -358
- package/coverage/html/backend/src/middleware/openapi/config.ts.html +0 -160
- package/coverage/html/backend/src/middleware/openapi/handlers.ts.html +0 -481
- package/coverage/html/backend/src/middleware/openapi/index.html +0 -131
- package/coverage/html/backend/src/pkgs/api-router/hooks/index.html +0 -116
- package/coverage/html/backend/src/pkgs/api-router/hooks/processor.ts.html +0 -544
- package/coverage/html/backend/src/pkgs/api-router/index.html +0 -116
- package/coverage/html/backend/src/pkgs/api-router/telemetry.ts.html +0 -334
- package/coverage/html/backend/src/pkgs/api-router/utils/index.html +0 -116
- package/coverage/html/backend/src/pkgs/api-router/utils/ip.ts.html +0 -361
- package/coverage/html/backend/src/pkgs/data-model/fields/field-factory.ts.html +0 -709
- package/coverage/html/backend/src/pkgs/data-model/fields/id-generator.ts.html +0 -256
- package/coverage/html/backend/src/pkgs/data-model/fields/index.html +0 -161
- package/coverage/html/backend/src/pkgs/data-model/fields/superjson-utils.ts.html +0 -136
- package/coverage/html/backend/src/pkgs/data-model/fields/zod-fields.ts.html +0 -496
- package/coverage/html/backend/src/pkgs/data-model/hooks/create-hooks.ts.html +0 -349
- package/coverage/html/backend/src/pkgs/data-model/hooks/index.html +0 -176
- package/coverage/html/backend/src/pkgs/data-model/hooks/update-hooks.ts.html +0 -358
- package/coverage/html/backend/src/pkgs/data-model/hooks/update-many-hooks.ts.html +0 -613
- package/coverage/html/backend/src/pkgs/data-model/hooks/utils.ts.html +0 -538
- package/coverage/html/backend/src/pkgs/data-model/hooks/with-hooks-factory.ts.html +0 -289
- package/coverage/html/backend/src/pkgs/db-adapters/adapter-factory.ts.html +0 -289
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.ts.html +0 -2203
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/drizzle-adapter/index.html +0 -116
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/index.html +0 -116
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/dialect.ts.html +0 -670
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/index.html +0 -131
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.ts.html +0 -3634
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/tests/index.html +0 -116
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.ts.html +0 -1417
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/memory-adapter/index.html +0 -116
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.ts.html +0 -2071
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/prisma-adapter/index.html +0 -116
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.ts.html +0 -1834
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/test.ts.html +0 -316
- package/coverage/html/backend/src/pkgs/db-adapters/index.html +0 -131
- package/coverage/html/backend/src/pkgs/db-adapters/utils.ts.html +0 -238
- package/coverage/html/backend/src/pkgs/migrations/get-migration.ts.html +0 -343
- package/coverage/html/backend/src/pkgs/migrations/get-schema/get-schema.ts.html +0 -217
- package/coverage/html/backend/src/pkgs/migrations/get-schema/index.html +0 -146
- package/coverage/html/backend/src/pkgs/migrations/get-schema/process-fields.ts.html +0 -280
- package/coverage/html/backend/src/pkgs/migrations/get-schema/process-tables.ts.html +0 -289
- package/coverage/html/backend/src/pkgs/migrations/index.html +0 -176
- package/coverage/html/backend/src/pkgs/migrations/migration-builders.ts.html +0 -595
- package/coverage/html/backend/src/pkgs/migrations/migration-execution.ts.html +0 -301
- package/coverage/html/backend/src/pkgs/migrations/schema-comparison.ts.html +0 -694
- package/coverage/html/backend/src/pkgs/migrations/type-mapping.ts.html +0 -817
- package/coverage/html/backend/src/pkgs/results/core/error-class.ts.html +0 -976
- package/coverage/html/backend/src/pkgs/results/core/error-codes.ts.html +0 -703
- package/coverage/html/backend/src/pkgs/results/core/index.html +0 -146
- package/coverage/html/backend/src/pkgs/results/core/tracing.ts.html +0 -280
- package/coverage/html/backend/src/pkgs/results/create-telemetry-options.ts.html +0 -271
- package/coverage/html/backend/src/pkgs/results/index.html +0 -131
- package/coverage/html/backend/src/pkgs/results/orpc-error-handler.ts.html +0 -496
- package/coverage/html/backend/src/pkgs/results/results/index.html +0 -131
- package/coverage/html/backend/src/pkgs/results/results/recovery-utils.ts.html +0 -628
- package/coverage/html/backend/src/pkgs/results/results/result-helpers.ts.html +0 -1234
- package/coverage/html/backend/src/pkgs/utils/env.ts.html +0 -337
- package/coverage/html/backend/src/pkgs/utils/index.html +0 -146
- package/coverage/html/backend/src/pkgs/utils/logger.ts.html +0 -199
- package/coverage/html/backend/src/pkgs/utils/url.ts.html +0 -400
- package/coverage/html/backend/src/router.ts.html +0 -109
- package/coverage/html/backend/src/schema/audit-log/index.html +0 -146
- package/coverage/html/backend/src/schema/audit-log/registry.ts.html +0 -436
- package/coverage/html/backend/src/schema/audit-log/schema.ts.html +0 -223
- package/coverage/html/backend/src/schema/audit-log/table.ts.html +0 -640
- package/coverage/html/backend/src/schema/consent/index.html +0 -146
- package/coverage/html/backend/src/schema/consent/registry.ts.html +0 -616
- package/coverage/html/backend/src/schema/consent/schema.ts.html +0 -238
- package/coverage/html/backend/src/schema/consent/table.ts.html +0 -748
- package/coverage/html/backend/src/schema/consent-policy/index.html +0 -146
- package/coverage/html/backend/src/schema/consent-policy/registry.ts.html +0 -1063
- package/coverage/html/backend/src/schema/consent-policy/schema.ts.html +0 -265
- package/coverage/html/backend/src/schema/consent-policy/table.ts.html +0 -535
- package/coverage/html/backend/src/schema/consent-purpose/index.html +0 -146
- package/coverage/html/backend/src/schema/consent-purpose/registry.ts.html +0 -589
- package/coverage/html/backend/src/schema/consent-purpose/schema.ts.html +0 -259
- package/coverage/html/backend/src/schema/consent-purpose/table.ts.html +0 -547
- package/coverage/html/backend/src/schema/consent-record/index.html +0 -131
- package/coverage/html/backend/src/schema/consent-record/schema.ts.html +0 -211
- package/coverage/html/backend/src/schema/consent-record/table.ts.html +0 -457
- package/coverage/html/backend/src/schema/create-registry.ts.html +0 -148
- package/coverage/html/backend/src/schema/definition.ts.html +0 -685
- package/coverage/html/backend/src/schema/domain/index.html +0 -146
- package/coverage/html/backend/src/schema/domain/registry.ts.html +0 -973
- package/coverage/html/backend/src/schema/domain/schema.ts.html +0 -214
- package/coverage/html/backend/src/schema/domain/table.ts.html +0 -496
- package/coverage/html/backend/src/schema/index.html +0 -146
- package/coverage/html/backend/src/schema/schemas.ts.html +0 -166
- package/coverage/html/backend/src/schema/subject/index.html +0 -146
- package/coverage/html/backend/src/schema/subject/registry.ts.html +0 -973
- package/coverage/html/backend/src/schema/subject/schema.ts.html +0 -208
- package/coverage/html/backend/src/schema/subject/table.ts.html +0 -499
- package/coverage/html/backend/src/server.ts.html +0 -463
- package/coverage/html/backend/src/testing/contract-testing.ts.html +0 -1396
- package/coverage/html/backend/src/testing/index.html +0 -116
- package/coverage/html/base.css +0 -224
- package/coverage/html/block-navigation.js +0 -87
- package/coverage/html/favicon.png +0 -0
- package/coverage/html/index.html +0 -656
- package/coverage/html/prettify.css +0 -1
- package/coverage/html/prettify.js +0 -2
- package/coverage/html/sort-arrow-sprite.png +0 -0
- package/coverage/html/sorter.js +0 -196
|
@@ -1,1396 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
<!doctype html>
|
|
3
|
-
<html lang="en">
|
|
4
|
-
|
|
5
|
-
<head>
|
|
6
|
-
<title>Code coverage report for backend/src/testing/contract-testing.ts</title>
|
|
7
|
-
<meta charset="utf-8" />
|
|
8
|
-
<link rel="stylesheet" href="../../../prettify.css" />
|
|
9
|
-
<link rel="stylesheet" href="../../../base.css" />
|
|
10
|
-
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
|
|
11
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
-
<style type='text/css'>
|
|
13
|
-
.coverage-summary .sorter {
|
|
14
|
-
background-image: url(../../../sort-arrow-sprite.png);
|
|
15
|
-
}
|
|
16
|
-
</style>
|
|
17
|
-
</head>
|
|
18
|
-
|
|
19
|
-
<body>
|
|
20
|
-
<div class='wrapper'>
|
|
21
|
-
<div class='pad1'>
|
|
22
|
-
<h1><a href="../../../index.html">All files</a> / <a href="index.html">backend/src/testing</a> contract-testing.ts</h1>
|
|
23
|
-
<div class='clearfix'>
|
|
24
|
-
|
|
25
|
-
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">70.7% </span>
|
|
27
|
-
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>111/157</span>
|
|
29
|
-
</div>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">65.51% </span>
|
|
34
|
-
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>57/87</span>
|
|
36
|
-
</div>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">67.74% </span>
|
|
41
|
-
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>21/31</span>
|
|
43
|
-
</div>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">70.58% </span>
|
|
48
|
-
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>108/153</span>
|
|
50
|
-
</div>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
</div>
|
|
54
|
-
<p class="quiet">
|
|
55
|
-
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
-
</p>
|
|
57
|
-
<template id="filterTemplate">
|
|
58
|
-
<div class="quiet">
|
|
59
|
-
Filter:
|
|
60
|
-
<input type="search" id="fileSearch">
|
|
61
|
-
</div>
|
|
62
|
-
</template>
|
|
63
|
-
</div>
|
|
64
|
-
<div class='status-line medium'></div>
|
|
65
|
-
<pre><table class="coverage">
|
|
66
|
-
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
-
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
-
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
-
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
-
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
-
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
-
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
-
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
-
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
-
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
-
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
-
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
-
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
-
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
-
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
-
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
-
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
-
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
-
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
-
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
-
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
-
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
-
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
-
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
-
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
-
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
-
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
-
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
-
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
-
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
-
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
-
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
-
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
-
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
-
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
-
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
-
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
-
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
-
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
-
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
-
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
-
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
-
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
-
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
-
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
-
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
-
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
-
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
-
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
-
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
-
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
-
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
-
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
-
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
-
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
-
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
-
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
-
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
-
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
-
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
-
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
-
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
-
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
-
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
-
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
-
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
-
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
-
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
-
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
-
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
-
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
-
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
-
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
-
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
-
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
-
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
-
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
-
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
-
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
-
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
-
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
-
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
-
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
-
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
-
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
-
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
-
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
-
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
-
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
-
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
-
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
-
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
-
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
-
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
-
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
-
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
-
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
-
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
-
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
-
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
-
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
-
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
-
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
-
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
-
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
-
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
-
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
-
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
-
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
-
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
-
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
-
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
-
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
-
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
-
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
-
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
-
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
-
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
-
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
-
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
-
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
-
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
-
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
-
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
-
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
-
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
-
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
-
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
-
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
-
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
-
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
-
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
-
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
-
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
-
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
-
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
-
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
-
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
-
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
-
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
-
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
-
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
-
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
-
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
-
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
-
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
-
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
-
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
-
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
-
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
-
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
-
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
-
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
-
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
-
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
-
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
-
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
-
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
-
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
-
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
-
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
-
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
-
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
-
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
-
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
-
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
-
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
-
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
-
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
-
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
-
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
-
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
-
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
-
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
-
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
-
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
-
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
-
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
-
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
-
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
-
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
-
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
-
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
-
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
-
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
-
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
-
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
-
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
-
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
-
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
-
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
-
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
-
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
-
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
-
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
-
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
-
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
-
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
-
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
-
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
-
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
-
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
-
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
-
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
-
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
-
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
-
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
-
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
-
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
-
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
-
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
-
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
-
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
-
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
-
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
-
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
-
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
-
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
-
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
-
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
-
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
-
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
-
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
-
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
-
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
-
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
-
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
-
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
-
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
-
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
-
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
-
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
-
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
-
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
-
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
-
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
-
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
-
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
-
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
-
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
-
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
-
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
-
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
-
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
-
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
-
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
-
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
-
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
-
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
-
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
-
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
-
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
-
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
-
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
-
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
-
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
-
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
-
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
-
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
-
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
-
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
-
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
-
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
-
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
-
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
-
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
-
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
-
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
-
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
-
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
-
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
-
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
-
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
-
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
-
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
-
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
-
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
-
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
-
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
-
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
-
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
-
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
-
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
-
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
-
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
-
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
-
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
-
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
-
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
-
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
-
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
-
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
-
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
-
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
-
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
-
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
-
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
-
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
-
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
-
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
-
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
-
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
-
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
-
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
-
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
-
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
-
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
-
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
-
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
-
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
-
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
-
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
-
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
-
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
-
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
-
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
-
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
-
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
-
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
-
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
-
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
-
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
-
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
-
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
-
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
-
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
-
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
-
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
-
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
-
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
-
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
-
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
-
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
-
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
-
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
-
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
-
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
-
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
-
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
-
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
-
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
-
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
-
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
-
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
-
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
-
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
-
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
-
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
-
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
-
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
-
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
-
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
-
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
-
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
-
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
-
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
-
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
-
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
-
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
-
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
-
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
-
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
-
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
-
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
-
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
-
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
-
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
-
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
-
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
-
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
-
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
-
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
-
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
-
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
-
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
-
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
-
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
-
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
-
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
-
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
-
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
-
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
-
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
-
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
-
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
-
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
-
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
-
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
-
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
-
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
-
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
-
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
-
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
-
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
-
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
-
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
-
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
-
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
-
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
-
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
-
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
-
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
-
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
-
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
-
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
-
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
-
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
-
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
-
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
-
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
-
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
-
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
-
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
-
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
-
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
-
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
-
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
-
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
-
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
-
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
-
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
-
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
-
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
-
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
-
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
-
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
-
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
-
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
-
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
-
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
-
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
-
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
-
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
-
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
-
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
-
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
-
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
-
<a name='L438'></a><a href='#L438'>438</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span>
|
|
504
|
-
<span class="cline-any cline-neutral"> </span>
|
|
505
|
-
<span class="cline-any cline-neutral"> </span>
|
|
506
|
-
<span class="cline-any cline-neutral"> </span>
|
|
507
|
-
<span class="cline-any cline-neutral"> </span>
|
|
508
|
-
<span class="cline-any cline-neutral"> </span>
|
|
509
|
-
<span class="cline-any cline-neutral"> </span>
|
|
510
|
-
<span class="cline-any cline-neutral"> </span>
|
|
511
|
-
<span class="cline-any cline-neutral"> </span>
|
|
512
|
-
<span class="cline-any cline-neutral"> </span>
|
|
513
|
-
<span class="cline-any cline-neutral"> </span>
|
|
514
|
-
<span class="cline-any cline-neutral"> </span>
|
|
515
|
-
<span class="cline-any cline-neutral"> </span>
|
|
516
|
-
<span class="cline-any cline-neutral"> </span>
|
|
517
|
-
<span class="cline-any cline-neutral"> </span>
|
|
518
|
-
<span class="cline-any cline-neutral"> </span>
|
|
519
|
-
<span class="cline-any cline-neutral"> </span>
|
|
520
|
-
<span class="cline-any cline-neutral"> </span>
|
|
521
|
-
<span class="cline-any cline-neutral"> </span>
|
|
522
|
-
<span class="cline-any cline-neutral"> </span>
|
|
523
|
-
<span class="cline-any cline-neutral"> </span>
|
|
524
|
-
<span class="cline-any cline-neutral"> </span>
|
|
525
|
-
<span class="cline-any cline-neutral"> </span>
|
|
526
|
-
<span class="cline-any cline-neutral"> </span>
|
|
527
|
-
<span class="cline-any cline-neutral"> </span>
|
|
528
|
-
<span class="cline-any cline-neutral"> </span>
|
|
529
|
-
<span class="cline-any cline-neutral"> </span>
|
|
530
|
-
<span class="cline-any cline-neutral"> </span>
|
|
531
|
-
<span class="cline-any cline-neutral"> </span>
|
|
532
|
-
<span class="cline-any cline-neutral"> </span>
|
|
533
|
-
<span class="cline-any cline-neutral"> </span>
|
|
534
|
-
<span class="cline-any cline-neutral"> </span>
|
|
535
|
-
<span class="cline-any cline-neutral"> </span>
|
|
536
|
-
<span class="cline-any cline-neutral"> </span>
|
|
537
|
-
<span class="cline-any cline-neutral"> </span>
|
|
538
|
-
<span class="cline-any cline-neutral"> </span>
|
|
539
|
-
<span class="cline-any cline-neutral"> </span>
|
|
540
|
-
<span class="cline-any cline-neutral"> </span>
|
|
541
|
-
<span class="cline-any cline-neutral"> </span>
|
|
542
|
-
<span class="cline-any cline-neutral"> </span>
|
|
543
|
-
<span class="cline-any cline-neutral"> </span>
|
|
544
|
-
<span class="cline-any cline-neutral"> </span>
|
|
545
|
-
<span class="cline-any cline-yes">3x</span>
|
|
546
|
-
<span class="cline-any cline-neutral"> </span>
|
|
547
|
-
<span class="cline-any cline-neutral"> </span>
|
|
548
|
-
<span class="cline-any cline-neutral"> </span>
|
|
549
|
-
<span class="cline-any cline-neutral"> </span>
|
|
550
|
-
<span class="cline-any cline-neutral"> </span>
|
|
551
|
-
<span class="cline-any cline-yes">3x</span>
|
|
552
|
-
<span class="cline-any cline-yes">4x</span>
|
|
553
|
-
<span class="cline-any cline-yes">4x</span>
|
|
554
|
-
<span class="cline-any cline-no"> </span>
|
|
555
|
-
<span class="cline-any cline-neutral"> </span>
|
|
556
|
-
<span class="cline-any cline-neutral"> </span>
|
|
557
|
-
<span class="cline-any cline-neutral"> </span>
|
|
558
|
-
<span class="cline-any cline-yes">4x</span>
|
|
559
|
-
<span class="cline-any cline-yes">4x</span>
|
|
560
|
-
<span class="cline-any cline-neutral"> </span>
|
|
561
|
-
<span class="cline-any cline-neutral"> </span>
|
|
562
|
-
<span class="cline-any cline-neutral"> </span>
|
|
563
|
-
<span class="cline-any cline-no"> </span>
|
|
564
|
-
<span class="cline-any cline-neutral"> </span>
|
|
565
|
-
<span class="cline-any cline-neutral"> </span>
|
|
566
|
-
<span class="cline-any cline-neutral"> </span>
|
|
567
|
-
<span class="cline-any cline-neutral"> </span>
|
|
568
|
-
<span class="cline-any cline-neutral"> </span>
|
|
569
|
-
<span class="cline-any cline-yes">3x</span>
|
|
570
|
-
<span class="cline-any cline-yes">12x</span>
|
|
571
|
-
<span class="cline-any cline-yes">12x</span>
|
|
572
|
-
<span class="cline-any cline-no"> </span>
|
|
573
|
-
<span class="cline-any cline-neutral"> </span>
|
|
574
|
-
<span class="cline-any cline-neutral"> </span>
|
|
575
|
-
<span class="cline-any cline-neutral"> </span>
|
|
576
|
-
<span class="cline-any cline-yes">12x</span>
|
|
577
|
-
<span class="cline-any cline-yes">12x</span>
|
|
578
|
-
<span class="cline-any cline-neutral"> </span>
|
|
579
|
-
<span class="cline-any cline-neutral"> </span>
|
|
580
|
-
<span class="cline-any cline-neutral"> </span>
|
|
581
|
-
<span class="cline-any cline-no"> </span>
|
|
582
|
-
<span class="cline-any cline-neutral"> </span>
|
|
583
|
-
<span class="cline-any cline-neutral"> </span>
|
|
584
|
-
<span class="cline-any cline-neutral"> </span>
|
|
585
|
-
<span class="cline-any cline-neutral"> </span>
|
|
586
|
-
<span class="cline-any cline-neutral"> </span>
|
|
587
|
-
<span class="cline-any cline-neutral"> </span>
|
|
588
|
-
<span class="cline-any cline-yes">3x</span>
|
|
589
|
-
<span class="cline-any cline-yes">3x</span>
|
|
590
|
-
<span class="cline-any cline-yes">3x</span>
|
|
591
|
-
<span class="cline-any cline-neutral"> </span>
|
|
592
|
-
<span class="cline-any cline-yes">3x</span>
|
|
593
|
-
<span class="cline-any cline-neutral"> </span>
|
|
594
|
-
<span class="cline-any cline-neutral"> </span>
|
|
595
|
-
<span class="cline-any cline-yes">3x</span>
|
|
596
|
-
<span class="cline-any cline-yes">2x</span>
|
|
597
|
-
<span class="cline-any cline-neutral"> </span>
|
|
598
|
-
<span class="cline-any cline-neutral"> </span>
|
|
599
|
-
<span class="cline-any cline-neutral"> </span>
|
|
600
|
-
<span class="cline-any cline-yes">3x</span>
|
|
601
|
-
<span class="cline-any cline-neutral"> </span>
|
|
602
|
-
<span class="cline-any cline-yes">3x</span>
|
|
603
|
-
<span class="cline-any cline-yes">3x</span>
|
|
604
|
-
<span class="cline-any cline-yes">3x</span>
|
|
605
|
-
<span class="cline-any cline-yes">3x</span>
|
|
606
|
-
<span class="cline-any cline-yes">3x</span>
|
|
607
|
-
<span class="cline-any cline-neutral"> </span>
|
|
608
|
-
<span class="cline-any cline-neutral"> </span>
|
|
609
|
-
<span class="cline-any cline-neutral"> </span>
|
|
610
|
-
<span class="cline-any cline-yes">3x</span>
|
|
611
|
-
<span class="cline-any cline-yes">2x</span>
|
|
612
|
-
<span class="cline-any cline-yes">2x</span>
|
|
613
|
-
<span class="cline-any cline-yes">2x</span>
|
|
614
|
-
<span class="cline-any cline-yes">2x</span>
|
|
615
|
-
<span class="cline-any cline-neutral"> </span>
|
|
616
|
-
<span class="cline-any cline-neutral"> </span>
|
|
617
|
-
<span class="cline-any cline-neutral"> </span>
|
|
618
|
-
<span class="cline-any cline-neutral"> </span>
|
|
619
|
-
<span class="cline-any cline-neutral"> </span>
|
|
620
|
-
<span class="cline-any cline-neutral"> </span>
|
|
621
|
-
<span class="cline-any cline-yes">3x</span>
|
|
622
|
-
<span class="cline-any cline-neutral"> </span>
|
|
623
|
-
<span class="cline-any cline-neutral"> </span>
|
|
624
|
-
<span class="cline-any cline-neutral"> </span>
|
|
625
|
-
<span class="cline-any cline-neutral"> </span>
|
|
626
|
-
<span class="cline-any cline-no"> </span>
|
|
627
|
-
<span class="cline-any cline-no"> </span>
|
|
628
|
-
<span class="cline-any cline-no"> </span>
|
|
629
|
-
<span class="cline-any cline-no"> </span>
|
|
630
|
-
<span class="cline-any cline-neutral"> </span>
|
|
631
|
-
<span class="cline-any cline-no"> </span>
|
|
632
|
-
<span class="cline-any cline-neutral"> </span>
|
|
633
|
-
<span class="cline-any cline-neutral"> </span>
|
|
634
|
-
<span class="cline-any cline-neutral"> </span>
|
|
635
|
-
<span class="cline-any cline-yes">3x</span>
|
|
636
|
-
<span class="cline-any cline-neutral"> </span>
|
|
637
|
-
<span class="cline-any cline-neutral"> </span>
|
|
638
|
-
<span class="cline-any cline-neutral"> </span>
|
|
639
|
-
<span class="cline-any cline-neutral"> </span>
|
|
640
|
-
<span class="cline-any cline-no"> </span>
|
|
641
|
-
<span class="cline-any cline-no"> </span>
|
|
642
|
-
<span class="cline-any cline-no"> </span>
|
|
643
|
-
<span class="cline-any cline-no"> </span>
|
|
644
|
-
<span class="cline-any cline-neutral"> </span>
|
|
645
|
-
<span class="cline-any cline-no"> </span>
|
|
646
|
-
<span class="cline-any cline-neutral"> </span>
|
|
647
|
-
<span class="cline-any cline-neutral"> </span>
|
|
648
|
-
<span class="cline-any cline-neutral"> </span>
|
|
649
|
-
<span class="cline-any cline-yes">3x</span>
|
|
650
|
-
<span class="cline-any cline-neutral"> </span>
|
|
651
|
-
<span class="cline-any cline-neutral"> </span>
|
|
652
|
-
<span class="cline-any cline-neutral"> </span>
|
|
653
|
-
<span class="cline-any cline-no"> </span>
|
|
654
|
-
<span class="cline-any cline-no"> </span>
|
|
655
|
-
<span class="cline-any cline-no"> </span>
|
|
656
|
-
<span class="cline-any cline-no"> </span>
|
|
657
|
-
<span class="cline-any cline-neutral"> </span>
|
|
658
|
-
<span class="cline-any cline-neutral"> </span>
|
|
659
|
-
<span class="cline-any cline-no"> </span>
|
|
660
|
-
<span class="cline-any cline-no"> </span>
|
|
661
|
-
<span class="cline-any cline-neutral"> </span>
|
|
662
|
-
<span class="cline-any cline-neutral"> </span>
|
|
663
|
-
<span class="cline-any cline-neutral"> </span>
|
|
664
|
-
<span class="cline-any cline-no"> </span>
|
|
665
|
-
<span class="cline-any cline-no"> </span>
|
|
666
|
-
<span class="cline-any cline-neutral"> </span>
|
|
667
|
-
<span class="cline-any cline-neutral"> </span>
|
|
668
|
-
<span class="cline-any cline-neutral"> </span>
|
|
669
|
-
<span class="cline-any cline-no"> </span>
|
|
670
|
-
<span class="cline-any cline-no"> </span>
|
|
671
|
-
<span class="cline-any cline-no"> </span>
|
|
672
|
-
<span class="cline-any cline-neutral"> </span>
|
|
673
|
-
<span class="cline-any cline-no"> </span>
|
|
674
|
-
<span class="cline-any cline-no"> </span>
|
|
675
|
-
<span class="cline-any cline-neutral"> </span>
|
|
676
|
-
<span class="cline-any cline-neutral"> </span>
|
|
677
|
-
<span class="cline-any cline-neutral"> </span>
|
|
678
|
-
<span class="cline-any cline-neutral"> </span>
|
|
679
|
-
<span class="cline-any cline-neutral"> </span>
|
|
680
|
-
<span class="cline-any cline-neutral"> </span>
|
|
681
|
-
<span class="cline-any cline-no"> </span>
|
|
682
|
-
<span class="cline-any cline-neutral"> </span>
|
|
683
|
-
<span class="cline-any cline-no"> </span>
|
|
684
|
-
<span class="cline-any cline-no"> </span>
|
|
685
|
-
<span class="cline-any cline-no"> </span>
|
|
686
|
-
<span class="cline-any cline-neutral"> </span>
|
|
687
|
-
<span class="cline-any cline-no"> </span>
|
|
688
|
-
<span class="cline-any cline-neutral"> </span>
|
|
689
|
-
<span class="cline-any cline-neutral"> </span>
|
|
690
|
-
<span class="cline-any cline-neutral"> </span>
|
|
691
|
-
<span class="cline-any cline-neutral"> </span>
|
|
692
|
-
<span class="cline-any cline-neutral"> </span>
|
|
693
|
-
<span class="cline-any cline-neutral"> </span>
|
|
694
|
-
<span class="cline-any cline-neutral"> </span>
|
|
695
|
-
<span class="cline-any cline-neutral"> </span>
|
|
696
|
-
<span class="cline-any cline-yes">3x</span>
|
|
697
|
-
<span class="cline-any cline-yes">5x</span>
|
|
698
|
-
<span class="cline-any cline-neutral"> </span>
|
|
699
|
-
<span class="cline-any cline-yes">5x</span>
|
|
700
|
-
<span class="cline-any cline-no"> </span>
|
|
701
|
-
<span class="cline-any cline-no"> </span>
|
|
702
|
-
<span class="cline-any cline-neutral"> </span>
|
|
703
|
-
<span class="cline-any cline-no"> </span>
|
|
704
|
-
<span class="cline-any cline-neutral"> </span>
|
|
705
|
-
<span class="cline-any cline-neutral"> </span>
|
|
706
|
-
<span class="cline-any cline-neutral"> </span>
|
|
707
|
-
<span class="cline-any cline-neutral"> </span>
|
|
708
|
-
<span class="cline-any cline-neutral"> </span>
|
|
709
|
-
<span class="cline-any cline-yes">5x</span>
|
|
710
|
-
<span class="cline-any cline-neutral"> </span>
|
|
711
|
-
<span class="cline-any cline-yes">2x</span>
|
|
712
|
-
<span class="cline-any cline-neutral"> </span>
|
|
713
|
-
<span class="cline-any cline-neutral"> </span>
|
|
714
|
-
<span class="cline-any cline-neutral"> </span>
|
|
715
|
-
<span class="cline-any cline-neutral"> </span>
|
|
716
|
-
<span class="cline-any cline-neutral"> </span>
|
|
717
|
-
<span class="cline-any cline-neutral"> </span>
|
|
718
|
-
<span class="cline-any cline-neutral"> </span>
|
|
719
|
-
<span class="cline-any cline-neutral"> </span>
|
|
720
|
-
<span class="cline-any cline-yes">3x</span>
|
|
721
|
-
<span class="cline-any cline-neutral"> </span>
|
|
722
|
-
<span class="cline-any cline-neutral"> </span>
|
|
723
|
-
<span class="cline-any cline-neutral"> </span>
|
|
724
|
-
<span class="cline-any cline-neutral"> </span>
|
|
725
|
-
<span class="cline-any cline-neutral"> </span>
|
|
726
|
-
<span class="cline-any cline-neutral"> </span>
|
|
727
|
-
<span class="cline-any cline-neutral"> </span>
|
|
728
|
-
<span class="cline-any cline-neutral"> </span>
|
|
729
|
-
<span class="cline-any cline-neutral"> </span>
|
|
730
|
-
<span class="cline-any cline-neutral"> </span>
|
|
731
|
-
<span class="cline-any cline-neutral"> </span>
|
|
732
|
-
<span class="cline-any cline-yes">5x</span>
|
|
733
|
-
<span class="cline-any cline-yes">16x</span>
|
|
734
|
-
<span class="cline-any cline-neutral"> </span>
|
|
735
|
-
<span class="cline-any cline-yes">16x</span>
|
|
736
|
-
<span class="cline-any cline-yes">16x</span>
|
|
737
|
-
<span class="cline-any cline-neutral"> </span>
|
|
738
|
-
<span class="cline-any cline-yes">16x</span>
|
|
739
|
-
<span class="cline-any cline-yes">16x</span>
|
|
740
|
-
<span class="cline-any cline-neutral"> </span>
|
|
741
|
-
<span class="cline-any cline-yes">16x</span>
|
|
742
|
-
<span class="cline-any cline-no"> </span>
|
|
743
|
-
<span class="cline-any cline-neutral"> </span>
|
|
744
|
-
<span class="cline-any cline-neutral"> </span>
|
|
745
|
-
<span class="cline-any cline-yes">16x</span>
|
|
746
|
-
<span class="cline-any cline-yes">16x</span>
|
|
747
|
-
<span class="cline-any cline-yes">16x</span>
|
|
748
|
-
<span class="cline-any cline-neutral"> </span>
|
|
749
|
-
<span class="cline-any cline-neutral"> </span>
|
|
750
|
-
<span class="cline-any cline-yes">22x</span>
|
|
751
|
-
<span class="cline-any cline-neutral"> </span>
|
|
752
|
-
<span class="cline-any cline-neutral"> </span>
|
|
753
|
-
<span class="cline-any cline-neutral"> </span>
|
|
754
|
-
<span class="cline-any cline-neutral"> </span>
|
|
755
|
-
<span class="cline-any cline-neutral"> </span>
|
|
756
|
-
<span class="cline-any cline-neutral"> </span>
|
|
757
|
-
<span class="cline-any cline-neutral"> </span>
|
|
758
|
-
<span class="cline-any cline-neutral"> </span>
|
|
759
|
-
<span class="cline-any cline-neutral"> </span>
|
|
760
|
-
<span class="cline-any cline-neutral"> </span>
|
|
761
|
-
<span class="cline-any cline-yes">3x</span>
|
|
762
|
-
<span class="cline-any cline-neutral"> </span>
|
|
763
|
-
<span class="cline-any cline-neutral"> </span>
|
|
764
|
-
<span class="cline-any cline-neutral"> </span>
|
|
765
|
-
<span class="cline-any cline-neutral"> </span>
|
|
766
|
-
<span class="cline-any cline-neutral"> </span>
|
|
767
|
-
<span class="cline-any cline-neutral"> </span>
|
|
768
|
-
<span class="cline-any cline-neutral"> </span>
|
|
769
|
-
<span class="cline-any cline-neutral"> </span>
|
|
770
|
-
<span class="cline-any cline-neutral"> </span>
|
|
771
|
-
<span class="cline-any cline-neutral"> </span>
|
|
772
|
-
<span class="cline-any cline-neutral"> </span>
|
|
773
|
-
<span class="cline-any cline-neutral"> </span>
|
|
774
|
-
<span class="cline-any cline-neutral"> </span>
|
|
775
|
-
<span class="cline-any cline-neutral"> </span>
|
|
776
|
-
<span class="cline-any cline-neutral"> </span>
|
|
777
|
-
<span class="cline-any cline-neutral"> </span>
|
|
778
|
-
<span class="cline-any cline-neutral"> </span>
|
|
779
|
-
<span class="cline-any cline-neutral"> </span>
|
|
780
|
-
<span class="cline-any cline-neutral"> </span>
|
|
781
|
-
<span class="cline-any cline-neutral"> </span>
|
|
782
|
-
<span class="cline-any cline-neutral"> </span>
|
|
783
|
-
<span class="cline-any cline-neutral"> </span>
|
|
784
|
-
<span class="cline-any cline-neutral"> </span>
|
|
785
|
-
<span class="cline-any cline-yes">2x</span>
|
|
786
|
-
<span class="cline-any cline-yes">2x</span>
|
|
787
|
-
<span class="cline-any cline-yes">2x</span>
|
|
788
|
-
<span class="cline-any cline-yes">4x</span>
|
|
789
|
-
<span class="cline-any cline-neutral"> </span>
|
|
790
|
-
<span class="cline-any cline-neutral"> </span>
|
|
791
|
-
<span class="cline-any cline-neutral"> </span>
|
|
792
|
-
<span class="cline-any cline-neutral"> </span>
|
|
793
|
-
<span class="cline-any cline-neutral"> </span>
|
|
794
|
-
<span class="cline-any cline-yes">2x</span>
|
|
795
|
-
<span class="cline-any cline-yes">2x</span>
|
|
796
|
-
<span class="cline-any cline-yes">2x</span>
|
|
797
|
-
<span class="cline-any cline-neutral"> </span>
|
|
798
|
-
<span class="cline-any cline-yes">2x</span>
|
|
799
|
-
<span class="cline-any cline-yes">8x</span>
|
|
800
|
-
<span class="cline-any cline-neutral"> </span>
|
|
801
|
-
<span class="cline-any cline-yes">8x</span>
|
|
802
|
-
<span class="cline-any cline-yes">16x</span>
|
|
803
|
-
<span class="cline-any cline-yes">16x</span>
|
|
804
|
-
<span class="cline-any cline-no"> </span>
|
|
805
|
-
<span class="cline-any cline-neutral"> </span>
|
|
806
|
-
<span class="cline-any cline-neutral"> </span>
|
|
807
|
-
<span class="cline-any cline-yes">16x</span>
|
|
808
|
-
<span class="cline-any cline-yes">16x</span>
|
|
809
|
-
<span class="cline-any cline-yes">5x</span>
|
|
810
|
-
<span class="cline-any cline-yes">5x</span>
|
|
811
|
-
<span class="cline-any cline-yes">5x</span>
|
|
812
|
-
<span class="cline-any cline-neutral"> </span>
|
|
813
|
-
<span class="cline-any cline-neutral"> </span>
|
|
814
|
-
<span class="cline-any cline-neutral"> </span>
|
|
815
|
-
<span class="cline-any cline-neutral"> </span>
|
|
816
|
-
<span class="cline-any cline-neutral"> </span>
|
|
817
|
-
<span class="cline-any cline-yes">8x</span>
|
|
818
|
-
<span class="cline-any cline-yes">5x</span>
|
|
819
|
-
<span class="cline-any cline-neutral"> </span>
|
|
820
|
-
<span class="cline-any cline-neutral"> </span>
|
|
821
|
-
<span class="cline-any cline-neutral"> </span>
|
|
822
|
-
<span class="cline-any cline-neutral"> </span>
|
|
823
|
-
<span class="cline-any cline-neutral"> </span>
|
|
824
|
-
<span class="cline-any cline-neutral"> </span>
|
|
825
|
-
<span class="cline-any cline-neutral"> </span>
|
|
826
|
-
<span class="cline-any cline-neutral"> </span>
|
|
827
|
-
<span class="cline-any cline-neutral"> </span>
|
|
828
|
-
<span class="cline-any cline-yes">2x</span>
|
|
829
|
-
<span class="cline-any cline-neutral"> </span>
|
|
830
|
-
<span class="cline-any cline-yes">2x</span>
|
|
831
|
-
<span class="cline-any cline-neutral"> </span>
|
|
832
|
-
<span class="cline-any cline-yes">2x</span>
|
|
833
|
-
<span class="cline-any cline-yes">4x</span>
|
|
834
|
-
<span class="cline-any cline-yes">4x</span>
|
|
835
|
-
<span class="cline-any cline-no"> </span>
|
|
836
|
-
<span class="cline-any cline-neutral"> </span>
|
|
837
|
-
<span class="cline-any cline-neutral"> </span>
|
|
838
|
-
<span class="cline-any cline-yes">4x</span>
|
|
839
|
-
<span class="cline-any cline-yes">4x</span>
|
|
840
|
-
<span class="cline-any cline-yes">2x</span>
|
|
841
|
-
<span class="cline-any cline-neutral"> </span>
|
|
842
|
-
<span class="cline-any cline-neutral"> </span>
|
|
843
|
-
<span class="cline-any cline-yes">2x</span>
|
|
844
|
-
<span class="cline-any cline-yes">2x</span>
|
|
845
|
-
<span class="cline-any cline-yes">1x</span>
|
|
846
|
-
<span class="cline-any cline-neutral"> </span>
|
|
847
|
-
<span class="cline-any cline-neutral"> </span>
|
|
848
|
-
<span class="cline-any cline-neutral"> </span>
|
|
849
|
-
<span class="cline-any cline-neutral"> </span>
|
|
850
|
-
<span class="cline-any cline-yes">2x</span>
|
|
851
|
-
<span class="cline-any cline-yes">2x</span>
|
|
852
|
-
<span class="cline-any cline-no"> </span>
|
|
853
|
-
<span class="cline-any cline-no"> </span>
|
|
854
|
-
<span class="cline-any cline-neutral"> </span>
|
|
855
|
-
<span class="cline-any cline-neutral"> </span>
|
|
856
|
-
<span class="cline-any cline-neutral"> </span>
|
|
857
|
-
<span class="cline-any cline-neutral"> </span>
|
|
858
|
-
<span class="cline-any cline-neutral"> </span>
|
|
859
|
-
<span class="cline-any cline-neutral"> </span>
|
|
860
|
-
<span class="cline-any cline-yes">2x</span>
|
|
861
|
-
<span class="cline-any cline-yes">2x</span>
|
|
862
|
-
<span class="cline-any cline-yes">2x</span>
|
|
863
|
-
<span class="cline-any cline-neutral"> </span>
|
|
864
|
-
<span class="cline-any cline-yes">2x</span>
|
|
865
|
-
<span class="cline-any cline-yes">6x</span>
|
|
866
|
-
<span class="cline-any cline-yes">6x</span>
|
|
867
|
-
<span class="cline-any cline-neutral"> </span>
|
|
868
|
-
<span class="cline-any cline-yes">6x</span>
|
|
869
|
-
<span class="cline-any cline-yes">12x</span>
|
|
870
|
-
<span class="cline-any cline-yes">12x</span>
|
|
871
|
-
<span class="cline-any cline-yes">9x</span>
|
|
872
|
-
<span class="cline-any cline-neutral"> </span>
|
|
873
|
-
<span class="cline-any cline-neutral"> </span>
|
|
874
|
-
<span class="cline-any cline-yes">3x</span>
|
|
875
|
-
<span class="cline-any cline-yes">3x</span>
|
|
876
|
-
<span class="cline-any cline-no"> </span>
|
|
877
|
-
<span class="cline-any cline-neutral"> </span>
|
|
878
|
-
<span class="cline-any cline-neutral"> </span>
|
|
879
|
-
<span class="cline-any cline-yes">3x</span>
|
|
880
|
-
<span class="cline-any cline-yes">3x</span>
|
|
881
|
-
<span class="cline-any cline-neutral"> </span>
|
|
882
|
-
<span class="cline-any cline-neutral"> </span>
|
|
883
|
-
<span class="cline-any cline-neutral"> </span>
|
|
884
|
-
<span class="cline-any cline-neutral"> </span>
|
|
885
|
-
<span class="cline-any cline-yes">1x</span>
|
|
886
|
-
<span class="cline-any cline-yes">1x</span>
|
|
887
|
-
<span class="cline-any cline-no"> </span>
|
|
888
|
-
<span class="cline-any cline-no"> </span>
|
|
889
|
-
<span class="cline-any cline-neutral"> </span>
|
|
890
|
-
<span class="cline-any cline-no"> </span>
|
|
891
|
-
<span class="cline-any cline-no"> </span>
|
|
892
|
-
<span class="cline-any cline-neutral"> </span>
|
|
893
|
-
<span class="cline-any cline-neutral"> </span>
|
|
894
|
-
<span class="cline-any cline-neutral"> </span>
|
|
895
|
-
<span class="cline-any cline-neutral"> </span>
|
|
896
|
-
<span class="cline-any cline-neutral"> </span>
|
|
897
|
-
<span class="cline-any cline-neutral"> </span>
|
|
898
|
-
<span class="cline-any cline-yes">6x</span>
|
|
899
|
-
<span class="cline-any cline-neutral"> </span>
|
|
900
|
-
<span class="cline-any cline-neutral"> </span>
|
|
901
|
-
<span class="cline-any cline-neutral"> </span>
|
|
902
|
-
<span class="cline-any cline-yes">6x</span>
|
|
903
|
-
<span class="cline-any cline-neutral"> </span>
|
|
904
|
-
<span class="cline-any cline-neutral"> </span>
|
|
905
|
-
<span class="cline-any cline-neutral"> </span>
|
|
906
|
-
<span class="cline-any cline-neutral"> </span>
|
|
907
|
-
<span class="cline-any cline-neutral"> </span>
|
|
908
|
-
<span class="cline-any cline-neutral"> </span>
|
|
909
|
-
<span class="cline-any cline-neutral"> </span>
|
|
910
|
-
<span class="cline-any cline-yes">2x</span>
|
|
911
|
-
<span class="cline-any cline-yes">2x</span>
|
|
912
|
-
<span class="cline-any cline-neutral"> </span>
|
|
913
|
-
<span class="cline-any cline-yes">2x</span>
|
|
914
|
-
<span class="cline-any cline-yes">4x</span>
|
|
915
|
-
<span class="cline-any cline-yes">4x</span>
|
|
916
|
-
<span class="cline-any cline-yes">2x</span>
|
|
917
|
-
<span class="cline-any cline-neutral"> </span>
|
|
918
|
-
<span class="cline-any cline-neutral"> </span>
|
|
919
|
-
<span class="cline-any cline-neutral"> </span>
|
|
920
|
-
<span class="cline-any cline-yes">2x</span>
|
|
921
|
-
<span class="cline-any cline-neutral"> </span>
|
|
922
|
-
<span class="cline-any cline-neutral"> </span>
|
|
923
|
-
<span class="cline-any cline-neutral"> </span>
|
|
924
|
-
<span class="cline-any cline-neutral"> </span>
|
|
925
|
-
<span class="cline-any cline-neutral"> </span>
|
|
926
|
-
<span class="cline-any cline-yes">1x</span>
|
|
927
|
-
<span class="cline-any cline-neutral"> </span>
|
|
928
|
-
<span class="cline-any cline-neutral"> </span>
|
|
929
|
-
<span class="cline-any cline-neutral"> </span>
|
|
930
|
-
<span class="cline-any cline-neutral"> </span>
|
|
931
|
-
<span class="cline-any cline-neutral"> </span>
|
|
932
|
-
<span class="cline-any cline-neutral"> </span>
|
|
933
|
-
<span class="cline-any cline-yes">2x</span>
|
|
934
|
-
<span class="cline-any cline-neutral"> </span>
|
|
935
|
-
<span class="cline-any cline-neutral"> </span>
|
|
936
|
-
<span class="cline-any cline-neutral"> </span>
|
|
937
|
-
<span class="cline-any cline-neutral"> </span>
|
|
938
|
-
<span class="cline-any cline-neutral"> </span>
|
|
939
|
-
<span class="cline-any cline-neutral"> </span>
|
|
940
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import type { Schema as ORPCSchema } from '@orpc/contract';
|
|
941
|
-
import { describe, expect, it } from 'vitest';
|
|
942
|
-
import type { ZodIssue, z } from 'zod';
|
|
943
|
-
|
|
944
|
-
/**
|
|
945
|
-
* Contract test utilities for creating reusable test patterns
|
|
946
|
-
* across multiple contracts
|
|
947
|
-
*/
|
|
948
|
-
|
|
949
|
-
type ContractTestHelpers = {
|
|
950
|
-
validateInput?: (
|
|
951
|
-
input: unknown
|
|
952
|
-
) => z.SafeParseReturnType<unknown, unknown> | undefined;
|
|
953
|
-
validateOutput: (
|
|
954
|
-
output: unknown
|
|
955
|
-
) => z.SafeParseReturnType<unknown, unknown> | undefined;
|
|
956
|
-
testInput: (testName: string, input: unknown, shouldBeValid: boolean) => void;
|
|
957
|
-
testOutput: (
|
|
958
|
-
testName: string,
|
|
959
|
-
output: unknown,
|
|
960
|
-
shouldBeValid: boolean
|
|
961
|
-
) => void;
|
|
962
|
-
testDiscriminatedUnion: (
|
|
963
|
-
discriminator: string,
|
|
964
|
-
validValues: string[]
|
|
965
|
-
) => void;
|
|
966
|
-
testRequiredFields: (schema: 'input' | 'output', fields: string[]) => void;
|
|
967
|
-
};
|
|
968
|
-
|
|
969
|
-
type ContractSchema = z.ZodType | ORPCSchema<unknown, unknown>;
|
|
970
|
-
|
|
971
|
-
/**
|
|
972
|
-
* Creates a test suite for basic contract validation
|
|
973
|
-
* @param contractName Display name for the contract
|
|
974
|
-
* @param contract The contract to test
|
|
975
|
-
*/
|
|
976
|
-
export function createContractTests(
|
|
977
|
-
contractName: string,
|
|
978
|
-
contract: {
|
|
979
|
-
'~orpc'?: { inputSchema?: ContractSchema; outputSchema?: ContractSchema };
|
|
980
|
-
}
|
|
981
|
-
): ContractTestHelpers {
|
|
982
|
-
const schemas = {
|
|
983
|
-
input: contract['~orpc']?.inputSchema,
|
|
984
|
-
output: contract['~orpc']?.outputSchema,
|
|
985
|
-
};
|
|
986
|
-
|
|
987
|
-
// Helper functions
|
|
988
|
-
const validateInput = (input: unknown) => {
|
|
989
|
-
const schema = schemas.input;
|
|
990
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (!schema) {
|
|
991
|
-
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
992
|
-
}
|
|
993
|
-
|
|
994
|
-
// Handle both Zod and oRPC schemas
|
|
995
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if ('safeParse' in schema) {
|
|
996
|
-
return schema.safeParse(input);
|
|
997
|
-
}
|
|
998
|
-
// For oRPC schemas, we'll need to implement validation
|
|
999
|
-
// This is a placeholder - you may need to implement actual validation
|
|
1000
|
-
<span class="cstat-no" title="statement not covered" > return { success: true, data: input } as z.SafeParseReturnType<</span>
|
|
1001
|
-
unknown,
|
|
1002
|
-
unknown
|
|
1003
|
-
>;
|
|
1004
|
-
};
|
|
1005
|
-
|
|
1006
|
-
const validateOutput = (output: unknown) => {
|
|
1007
|
-
const schema = schemas.output;
|
|
1008
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (!schema) {
|
|
1009
|
-
<span class="cstat-no" title="statement not covered" > return undefined;</span>
|
|
1010
|
-
}
|
|
1011
|
-
|
|
1012
|
-
// Handle both Zod and oRPC schemas
|
|
1013
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if ('safeParse' in schema) {
|
|
1014
|
-
return schema.safeParse(output);
|
|
1015
|
-
}
|
|
1016
|
-
// For oRPC schemas, we'll need to implement validation
|
|
1017
|
-
// This is a placeholder - you may need to implement actual validation
|
|
1018
|
-
<span class="cstat-no" title="statement not covered" > return { success: true, data: output } as z.SafeParseReturnType<</span>
|
|
1019
|
-
unknown,
|
|
1020
|
-
unknown
|
|
1021
|
-
>;
|
|
1022
|
-
};
|
|
1023
|
-
|
|
1024
|
-
// Create base test suite
|
|
1025
|
-
describe(`${contractName} Contract`, () => {
|
|
1026
|
-
describe('Schema Structure', () => {
|
|
1027
|
-
it('has properly defined schemas', () => {
|
|
1028
|
-
// Only require output schema
|
|
1029
|
-
expect(schemas.output).toBeDefined();
|
|
1030
|
-
|
|
1031
|
-
// Input schema is optional
|
|
1032
|
-
if (schemas.input) {
|
|
1033
|
-
expect(schemas.input).toBeDefined();
|
|
1034
|
-
}
|
|
1035
|
-
});
|
|
1036
|
-
|
|
1037
|
-
it('schemas are serializable', () => {
|
|
1038
|
-
// Test serialization for output schema
|
|
1039
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (schemas.output) {
|
|
1040
|
-
const serialized = JSON.stringify(schemas.output);
|
|
1041
|
-
expect(serialized).toBeDefined();
|
|
1042
|
-
expect(typeof serialized).toBe('string');
|
|
1043
|
-
expect(() => JSON.parse(serialized)).not.toThrow();
|
|
1044
|
-
}
|
|
1045
|
-
|
|
1046
|
-
// Test serialization for input schema if it exists
|
|
1047
|
-
if (schemas.input) {
|
|
1048
|
-
const serialized = JSON.stringify(schemas.input);
|
|
1049
|
-
expect(serialized).toBeDefined();
|
|
1050
|
-
expect(typeof serialized).toBe('string');
|
|
1051
|
-
expect(() => JSON.parse(serialized)).not.toThrow();
|
|
1052
|
-
}
|
|
1053
|
-
});
|
|
1054
|
-
});
|
|
1055
|
-
});
|
|
1056
|
-
|
|
1057
|
-
// Define test helpers
|
|
1058
|
-
const testInput = <span class="fstat-no" title="function not covered" >(</span>
|
|
1059
|
-
testName: string,
|
|
1060
|
-
input: unknown,
|
|
1061
|
-
shouldBeValid: boolean
|
|
1062
|
-
) => {
|
|
1063
|
-
<span class="cstat-no" title="statement not covered" > it(`${testName}`, <span class="fstat-no" title="function not covered" >() => {</span></span>
|
|
1064
|
-
const result = <span class="cstat-no" title="statement not covered" >validateInput(input);</span>
|
|
1065
|
-
<span class="cstat-no" title="statement not covered" > if (!result) {</span>
|
|
1066
|
-
<span class="cstat-no" title="statement not covered" > throw new Error('Validation result is undefined');</span>
|
|
1067
|
-
}
|
|
1068
|
-
<span class="cstat-no" title="statement not covered" > expect(result.success).toBe(shouldBeValid);</span>
|
|
1069
|
-
});
|
|
1070
|
-
};
|
|
1071
|
-
|
|
1072
|
-
const testOutput = <span class="fstat-no" title="function not covered" >(</span>
|
|
1073
|
-
testName: string,
|
|
1074
|
-
output: unknown,
|
|
1075
|
-
shouldBeValid: boolean
|
|
1076
|
-
) => {
|
|
1077
|
-
<span class="cstat-no" title="statement not covered" > it(`${testName}`, <span class="fstat-no" title="function not covered" >() => {</span></span>
|
|
1078
|
-
const result = <span class="cstat-no" title="statement not covered" >validateOutput(output);</span>
|
|
1079
|
-
<span class="cstat-no" title="statement not covered" > if (!result) {</span>
|
|
1080
|
-
<span class="cstat-no" title="statement not covered" > throw new Error('Validation result is undefined');</span>
|
|
1081
|
-
}
|
|
1082
|
-
<span class="cstat-no" title="statement not covered" > expect(result.success).toBe(shouldBeValid);</span>
|
|
1083
|
-
});
|
|
1084
|
-
};
|
|
1085
|
-
|
|
1086
|
-
const testDiscriminatedUnion = <span class="fstat-no" title="function not covered" >(</span>
|
|
1087
|
-
discriminator: string,
|
|
1088
|
-
validValues: string[]
|
|
1089
|
-
) => {
|
|
1090
|
-
<span class="cstat-no" title="statement not covered" > describe('Discriminated Union validation', <span class="fstat-no" title="function not covered" >() => {</span></span>
|
|
1091
|
-
<span class="cstat-no" title="statement not covered" > it(`uses '${discriminator}' as discriminator`, <span class="fstat-no" title="function not covered" >() => {</span></span>
|
|
1092
|
-
<span class="cstat-no" title="statement not covered" > if (!schemas.input) {</span>
|
|
1093
|
-
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1094
|
-
}
|
|
1095
|
-
// Only check Zod schemas for discriminated unions
|
|
1096
|
-
<span class="cstat-no" title="statement not covered" > if ('_def' in schemas.input) {</span>
|
|
1097
|
-
const schema = <span class="cstat-no" title="statement not covered" >schemas.input as z.ZodDiscriminatedUnion<</span>
|
|
1098
|
-
string,
|
|
1099
|
-
z.ZodObject<z.ZodRawShape>[]
|
|
1100
|
-
>;
|
|
1101
|
-
<span class="cstat-no" title="statement not covered" > expect(schema._def.typeName).toBe('ZodDiscriminatedUnion');</span>
|
|
1102
|
-
<span class="cstat-no" title="statement not covered" > expect(schema._def.discriminator).toBe(discriminator);</span>
|
|
1103
|
-
}
|
|
1104
|
-
});
|
|
1105
|
-
|
|
1106
|
-
<span class="cstat-no" title="statement not covered" > it('validates all defined discriminator values', <span class="fstat-no" title="function not covered" >() => {</span></span>
|
|
1107
|
-
<span class="cstat-no" title="statement not covered" > if (!schemas.input) {</span>
|
|
1108
|
-
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1109
|
-
}
|
|
1110
|
-
<span class="cstat-no" title="statement not covered" > for (const value of validValues) {</span>
|
|
1111
|
-
const input = <span class="cstat-no" title="statement not covered" >{</span>
|
|
1112
|
-
[discriminator]: value,
|
|
1113
|
-
// Add minimum required fields based on your contract
|
|
1114
|
-
};
|
|
1115
|
-
|
|
1116
|
-
// This test assumes minimal input - you may need to add required fields
|
|
1117
|
-
// based on the specific contract being tested
|
|
1118
|
-
const result = <span class="cstat-no" title="statement not covered" >validateInput(input);</span>
|
|
1119
|
-
// Specifically assert that it fails due to missing required fields
|
|
1120
|
-
<span class="cstat-no" title="statement not covered" > expect(result?.success).toBe(false);</span>
|
|
1121
|
-
<span class="cstat-no" title="statement not covered" > if (!result?.success) {</span>
|
|
1122
|
-
<span class="cstat-no" title="statement not covered" > expect(</span>
|
|
1123
|
-
result?.error.issues.some(
|
|
1124
|
-
<span class="fstat-no" title="function not covered" > (i</span>ssue) => <span class="cstat-no" title="statement not covered" >issue.code === 'invalid_type'</span>
|
|
1125
|
-
)
|
|
1126
|
-
).toBe(true);
|
|
1127
|
-
}
|
|
1128
|
-
}
|
|
1129
|
-
});
|
|
1130
|
-
});
|
|
1131
|
-
};
|
|
1132
|
-
|
|
1133
|
-
const testRequiredFields = (schema: 'input' | 'output', fields: string[]) => {
|
|
1134
|
-
describe(`Required ${schema} fields`, () => {
|
|
1135
|
-
// Skip if testing input fields but no input schema exists
|
|
1136
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (schema === 'input' && !schemas.input) {
|
|
1137
|
-
<span class="cstat-no" title="statement not covered" > it('skips input field tests as no input schema exists', <span class="fstat-no" title="function not covered" >() => {</span></span>
|
|
1138
|
-
<span class="cstat-no" title="statement not covered" > expect(true).toBe(true);</span>
|
|
1139
|
-
});
|
|
1140
|
-
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
1141
|
-
}
|
|
1142
|
-
|
|
1143
|
-
// Create a sample of valid data to test against
|
|
1144
|
-
let sampleValid: Record<string, unknown>;
|
|
1145
|
-
|
|
1146
|
-
if (schema === 'input') {
|
|
1147
|
-
// For input schema, we need a valid input based on the contract type
|
|
1148
|
-
sampleValid = {
|
|
1149
|
-
type: 'marketing_communications', // A common type that most contracts would have
|
|
1150
|
-
domain: 'example.com',
|
|
1151
|
-
// Add other fields that might be required by your contracts
|
|
1152
|
-
subjectId: 'test-123',
|
|
1153
|
-
metadata: {},
|
|
1154
|
-
};
|
|
1155
|
-
} else {
|
|
1156
|
-
// For output schema, create a generic valid output
|
|
1157
|
-
sampleValid = {
|
|
1158
|
-
id: 'test-123',
|
|
1159
|
-
domainId: 'domain-123',
|
|
1160
|
-
domain: 'example.com',
|
|
1161
|
-
type: 'marketing_communications',
|
|
1162
|
-
status: 'granted',
|
|
1163
|
-
recordId: 'record-123',
|
|
1164
|
-
givenAt: new Date().toISOString(),
|
|
1165
|
-
metadata: {},
|
|
1166
|
-
};
|
|
1167
|
-
}
|
|
1168
|
-
|
|
1169
|
-
for (const field of fields) {
|
|
1170
|
-
it(`requires '${field}' field`, () => {
|
|
1171
|
-
// Create a copy of the valid data without the tested field
|
|
1172
|
-
const invalidData = { ...sampleValid };
|
|
1173
|
-
delete invalidData[field];
|
|
1174
|
-
|
|
1175
|
-
const validator = schema === 'input' ? validateInput : validateOutput;
|
|
1176
|
-
const result = validator(invalidData);
|
|
1177
|
-
|
|
1178
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (!result) {
|
|
1179
|
-
<span class="cstat-no" title="statement not covered" > throw new Error('Validation result is undefined');</span>
|
|
1180
|
-
}
|
|
1181
|
-
|
|
1182
|
-
expect(result.success).toBe(false);
|
|
1183
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (!result.success) {
|
|
1184
|
-
expect(
|
|
1185
|
-
result.error.issues.some(
|
|
1186
|
-
(issue: ZodIssue) =>
|
|
1187
|
-
issue.path.some((p) => String(p).includes(field)) ||
|
|
1188
|
-
issue.message.includes('required')
|
|
1189
|
-
)
|
|
1190
|
-
).toBe(true);
|
|
1191
|
-
}
|
|
1192
|
-
});
|
|
1193
|
-
}
|
|
1194
|
-
});
|
|
1195
|
-
};
|
|
1196
|
-
|
|
1197
|
-
// Return the test helpers for re-use
|
|
1198
|
-
return {
|
|
1199
|
-
validateInput,
|
|
1200
|
-
validateOutput,
|
|
1201
|
-
testInput,
|
|
1202
|
-
testOutput,
|
|
1203
|
-
testDiscriminatedUnion,
|
|
1204
|
-
testRequiredFields,
|
|
1205
|
-
};
|
|
1206
|
-
}
|
|
1207
|
-
|
|
1208
|
-
/**
|
|
1209
|
-
* Creates consistency tests for multiple related contracts
|
|
1210
|
-
*/
|
|
1211
|
-
export function createConsistencyTests(
|
|
1212
|
-
contracts: Record<
|
|
1213
|
-
string,
|
|
1214
|
-
{
|
|
1215
|
-
'~orpc'?: {
|
|
1216
|
-
inputSchema?: ContractSchema;
|
|
1217
|
-
outputSchema?: ContractSchema;
|
|
1218
|
-
};
|
|
1219
|
-
}
|
|
1220
|
-
>
|
|
1221
|
-
) {
|
|
1222
|
-
describe('Contract Consistency', () => {
|
|
1223
|
-
it('all contracts have output schemas', () => {
|
|
1224
|
-
for (const [_name, contract] of Object.entries(contracts)) {
|
|
1225
|
-
expect(contract['~orpc']?.outputSchema).toBeDefined();
|
|
1226
|
-
}
|
|
1227
|
-
});
|
|
1228
|
-
|
|
1229
|
-
// Field type consistency - ensure common fields use same types across contracts
|
|
1230
|
-
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: excessive cognitive complexity is acceptable here
|
|
1231
|
-
it('common fields have consistent types across contracts', () => {
|
|
1232
|
-
const commonFields = ['id', 'domainId', 'type', 'status'];
|
|
1233
|
-
const contractEntries = Object.entries(contracts);
|
|
1234
|
-
|
|
1235
|
-
for (const field of commonFields) {
|
|
1236
|
-
const fieldTypes = new Set();
|
|
1237
|
-
|
|
1238
|
-
for (const [_name, contract] of contractEntries) {
|
|
1239
|
-
const schema = contract['~orpc']?.outputSchema;
|
|
1240
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (!schema || !('shape' in schema)) {
|
|
1241
|
-
<span class="cstat-no" title="statement not covered" > continue;</span>
|
|
1242
|
-
}
|
|
1243
|
-
|
|
1244
|
-
const shape = schema.shape as Record<string, z.ZodTypeAny>;
|
|
1245
|
-
if (field in shape) {
|
|
1246
|
-
const fieldDef = shape[field];
|
|
1247
|
-
<span class="missing-if-branch" title="else path not taken" >E</span>if (fieldDef) {
|
|
1248
|
-
fieldTypes.add(fieldDef.constructor.name);
|
|
1249
|
-
}
|
|
1250
|
-
}
|
|
1251
|
-
}
|
|
1252
|
-
|
|
1253
|
-
// If the field exists in multiple contracts, they should all use the same type
|
|
1254
|
-
if (fieldTypes.size > 0) {
|
|
1255
|
-
expect(
|
|
1256
|
-
fieldTypes.size,
|
|
1257
|
-
`Field '${field}' has inconsistent types across contracts`
|
|
1258
|
-
).toBe(1);
|
|
1259
|
-
}
|
|
1260
|
-
}
|
|
1261
|
-
});
|
|
1262
|
-
|
|
1263
|
-
// Validate enum value consistency across contracts
|
|
1264
|
-
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: excessive cognitive complexity is acceptable here
|
|
1265
|
-
it('enum values are consistent across contracts', () => {
|
|
1266
|
-
// Example: status field should have the same allowed values in all contracts
|
|
1267
|
-
const statusValues = new Map<string, string[]>();
|
|
1268
|
-
|
|
1269
|
-
for (const [name, contract] of Object.entries(contracts)) {
|
|
1270
|
-
const schema = contract['~orpc']?.outputSchema;
|
|
1271
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (!schema || !('shape' in schema)) {
|
|
1272
|
-
<span class="cstat-no" title="statement not covered" > continue;</span>
|
|
1273
|
-
}
|
|
1274
|
-
|
|
1275
|
-
const shape = schema.shape as Record<string, z.ZodTypeAny>;
|
|
1276
|
-
if (!shape.status) {
|
|
1277
|
-
continue;
|
|
1278
|
-
}
|
|
1279
|
-
|
|
1280
|
-
const statusField = shape.status;
|
|
1281
|
-
if ('_def' in statusField && 'values' in statusField._def) {
|
|
1282
|
-
statusValues.set(name, statusField._def.values as string[]);
|
|
1283
|
-
}
|
|
1284
|
-
}
|
|
1285
|
-
|
|
1286
|
-
// All status enums should have the same values
|
|
1287
|
-
const allValues = Array.from(statusValues.values());
|
|
1288
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (allValues.length > 1) {
|
|
1289
|
-
<span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >1; i</span> < allValues.length; i++) {</span>
|
|
1290
|
-
<span class="cstat-no" title="statement not covered" > expect(allValues[i]).toEqual(allValues[0]);</span>
|
|
1291
|
-
}
|
|
1292
|
-
}
|
|
1293
|
-
});
|
|
1294
|
-
|
|
1295
|
-
// Validation rule consistency for common fields
|
|
1296
|
-
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: excessive cognitive complexity is acceptable here
|
|
1297
|
-
it('validation rules for common fields are consistent', () => {
|
|
1298
|
-
const contractEntries = Object.entries(contracts);
|
|
1299
|
-
const commonStringFields = ['domain', 'subjectId', 'externalSubjectId'];
|
|
1300
|
-
|
|
1301
|
-
for (const field of commonStringFields) {
|
|
1302
|
-
const minLengths = new Set();
|
|
1303
|
-
const maxLengths = new Set();
|
|
1304
|
-
|
|
1305
|
-
for (const [_name, contract] of contractEntries) {
|
|
1306
|
-
const schema = contract['~orpc']?.inputSchema;
|
|
1307
|
-
if (!schema || !('shape' in schema)) {
|
|
1308
|
-
continue;
|
|
1309
|
-
}
|
|
1310
|
-
|
|
1311
|
-
const shape = schema.shape as Record<string, z.ZodTypeAny>;
|
|
1312
|
-
<span class="missing-if-branch" title="if path not taken" >I</span>if (!shape[field]) {
|
|
1313
|
-
<span class="cstat-no" title="statement not covered" > continue;</span>
|
|
1314
|
-
}
|
|
1315
|
-
|
|
1316
|
-
const fieldSchema = shape[field];
|
|
1317
|
-
if (
|
|
1318
|
-
'_def' in fieldSchema &&
|
|
1319
|
-
fieldSchema._def.typeName === 'ZodString'
|
|
1320
|
-
) {
|
|
1321
|
-
// Extract min/max length if they exist
|
|
1322
|
-
const checks = fieldSchema._def.checks || <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
|
|
1323
|
-
for (const check of checks) {
|
|
1324
|
-
<span class="cstat-no" title="statement not covered" > if (check.kind === 'min') {</span>
|
|
1325
|
-
<span class="cstat-no" title="statement not covered" > minLengths.add(check.value);</span>
|
|
1326
|
-
}
|
|
1327
|
-
<span class="cstat-no" title="statement not covered" > if (check.kind === 'max') {</span>
|
|
1328
|
-
<span class="cstat-no" title="statement not covered" > maxLengths.add(check.value);</span>
|
|
1329
|
-
}
|
|
1330
|
-
}
|
|
1331
|
-
}
|
|
1332
|
-
}
|
|
1333
|
-
|
|
1334
|
-
// All contracts should use the same min/max for common string fields
|
|
1335
|
-
expect(
|
|
1336
|
-
minLengths.size,
|
|
1337
|
-
`Inconsistent min length for field '${field}'`
|
|
1338
|
-
).toBeLessThanOrEqual(1);
|
|
1339
|
-
expect(
|
|
1340
|
-
maxLengths.size,
|
|
1341
|
-
`Inconsistent max length for field '${field}'`
|
|
1342
|
-
).toBeLessThanOrEqual(1);
|
|
1343
|
-
}
|
|
1344
|
-
});
|
|
1345
|
-
|
|
1346
|
-
// Discriminated union consistency
|
|
1347
|
-
it('discriminated unions use consistent discriminator across contracts', () => {
|
|
1348
|
-
const discriminators = new Set();
|
|
1349
|
-
|
|
1350
|
-
for (const [_name, contract] of Object.entries(contracts)) {
|
|
1351
|
-
const schema = contract['~orpc']?.inputSchema;
|
|
1352
|
-
if (!schema || !('_def' in schema)) {
|
|
1353
|
-
continue;
|
|
1354
|
-
}
|
|
1355
|
-
|
|
1356
|
-
// Check if schema is a discriminated union
|
|
1357
|
-
if (
|
|
1358
|
-
'typeName' in schema._def &&
|
|
1359
|
-
schema._def.typeName === 'ZodDiscriminatedUnion' &&
|
|
1360
|
-
'discriminator' in schema._def
|
|
1361
|
-
) {
|
|
1362
|
-
// Safe assertion since we've checked the property exists
|
|
1363
|
-
discriminators.add(
|
|
1364
|
-
(schema._def as { discriminator: string }).discriminator
|
|
1365
|
-
);
|
|
1366
|
-
}
|
|
1367
|
-
}
|
|
1368
|
-
|
|
1369
|
-
// All contracts should use the same discriminator (e.g., 'type')
|
|
1370
|
-
expect(
|
|
1371
|
-
discriminators.size,
|
|
1372
|
-
'Inconsistent discriminator fields used across contracts'
|
|
1373
|
-
).toBeLessThanOrEqual(1);
|
|
1374
|
-
});
|
|
1375
|
-
});
|
|
1376
|
-
}
|
|
1377
|
-
</pre></td></tr></table></pre>
|
|
1378
|
-
|
|
1379
|
-
<div class='push'></div><!-- for sticky footer -->
|
|
1380
|
-
</div><!-- /wrapper -->
|
|
1381
|
-
<div class='footer quiet pad2 space-top1 center small'>
|
|
1382
|
-
Code coverage generated by
|
|
1383
|
-
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1384
|
-
at 2025-05-08T20:18:30.062Z
|
|
1385
|
-
</div>
|
|
1386
|
-
<script src="../../../prettify.js"></script>
|
|
1387
|
-
<script>
|
|
1388
|
-
window.onload = function () {
|
|
1389
|
-
prettyPrint();
|
|
1390
|
-
};
|
|
1391
|
-
</script>
|
|
1392
|
-
<script src="../../../sorter.js"></script>
|
|
1393
|
-
<script src="../../../block-navigation.js"></script>
|
|
1394
|
-
</body>
|
|
1395
|
-
</html>
|
|
1396
|
-
|