@aztec/protocol-contracts 5.0.0-nightly.20260402 → 5.0.0-nightly.20260404

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "transpiled": true,
3
- "noir_version": "1.0.0-beta.19+c033e48bb813206dd272c1d24ea3c220f69f3fc4",
3
+ "noir_version": "1.0.0-beta.19+ed8c124c32d66390b1ed7092e209af9185eb5756",
4
4
  "name": "AuthRegistry",
5
5
  "functions": [
6
6
  {
@@ -45,10 +45,6 @@
45
45
  ],
46
46
  "return_type": null,
47
47
  "error_types": {
48
- "361444214588792908": {
49
- "error_kind": "string",
50
- "string": "attempt to multiply with overflow"
51
- },
52
48
  "13455385521185560676": {
53
49
  "error_kind": "string",
54
50
  "string": "Storage slot 0 not allowed. Storage slots must start from 1."
@@ -56,19 +52,11 @@
56
52
  "13929691561421487185": {
57
53
  "error_kind": "string",
58
54
  "string": "Function _set_authorized can only be called by the same contract"
59
- },
60
- "14990209321349310352": {
61
- "error_kind": "string",
62
- "string": "attempt to add with overflow"
63
- },
64
- "16431471497789672479": {
65
- "error_kind": "string",
66
- "string": "Index out of bounds"
67
55
  }
68
56
  }
69
57
  },
70
- "bytecode": "JwACBAEoAAABBIBJJwAABEklAAAATicCBQQDJwIGBAAfCgAFAAYARhwASEgBLQhGAi0IRwMtCEgEJQAAAH4nAgIESScCAwQAOw4AAwACLAAAQwAwZE5y4TGgKbhQRbaBgVhdKDPoSHm5cJFD4fWT8AAAACcARAQDJwBFAAAmHgIABQAeAgAFAB4CAAYBCiIGQwcWCgcIHAoICQAEKgkGCCcCBgEACioHBgkkAgAJAAAAuycCCgQAPAYKAQoqCAUHJAIABwAAAM0lAAABtycCBQACKQIABwDvUlNNLQgBCCcCCQQEAAgBCQEnAwgEAQAiCAIJLQoJCi0OBwoAIgoCCi0OBQoAIgoCCi0OAgonAgUECS0IAAktCggLAAgABQAlAAAByS0CAAAtCgsCCiICRQUKKgUGCCQCAAgAAAFDJQAAA6MtCAEFJwIIBAQACAEIAScDBQQBACIFAggtCggJLQ4HCQAiCQIJLQ4CCQAiCQIJLQ4DCScCAwQHLQgABy0KBQkACAADACUAAAHJLQIAAC0KCQIKIgJFAwoqAwYFJAIABQAAAaslAAADoxwKBAMAMAoAAwACJioBAAEFwVA0rCVIvFE8BAIBJisCAAUAAAAAAAAAAAMAAAAAAAAAAC0IAQQnAgYEBQAIAQYBJwMEBAEAIgQCBi0KBgctDEUHACIHAgctDEUHACIHAgctDEUHACIHAgctDgUHJwIFBAAnAgYEAScCBwEBJwIIBAItCgUDIwAAAjYKKgMFCQAqBAYKLQsKCgAqBAgLLQsLCyQCAAkAAAJfIwAAAlotCgoCJgQiA0QJBiIJRA0KKg0DDCQCAAwAAAJ7JQAAA7UMIglEDCQCAAwAAAKNJQAAA8cAIgICDQAqDQkMLQsMDAAqCgwNLQIEAycABAQFJQAAA9ktCAUKACoKBgwtDg0MACoJBgwOKgkMDSQCAA0AAALSJQAABDMMIgxEDSQCAA0AAALkJQAAA8cAIgICDgAqDgwNLQsNDQAqCw0MLQIKAycABAQFJQAAA9ktCAULACoLCA0tDgwNACIERAotCwoKACoJCAwOKgkMDSQCAA0AAAMyJQAABDMMIgxECSQCAAkAAANEJQAAA8cAIgICDQAqDQwJLQsJCQAqCgkMLQILAycABAQFJQAAA9ktCAUJACIJRAotDgwKLQgBBCcCCgQFAAgBCgEnAwQEAQAiCQIKACIEAgs/DwAKAAsAKgMGCS0KCQMjAAACNioBAAEFursh14IzGGQ8BAIBJioBAAEFBQQbmSCvYEw8BAIBJioBAAEF5AhQRQK1jB88BAIBJi0BAwYKAAYCByQAAAcAAAQuLQABBQAAAQQBAAADBAktAAMKLQAFCyMAAAQXLQEKCC0ECAsAAAoCCgAACwILDAAKCQwkAAAMAAAEBScBBQQBIwAABDItAAMFJioBAAEF0Afr9MvGZ5A8BAIBJg==",
71
- "debug_symbols": "tZjbbuIwEIbfJddceA4+9VVWVUVbukJCtGJhpVXFu+9M7Emgkq1uYG/Kx6T5PTP+Y5t8Dq+b59PPp+3+7f3X8PDjc3g+bHe77c+n3fvL+rh930v0c3D6BzAMD7QagGB4iPop3wEEWAKgVzhU8K5e8r5C0IhX8BWiRWKqkMggCgSBjAXQOQO5HUUQwRnkCkgGqQJZhCzCFuFYwYNBqBBMOdhYQYdggcgGqUJCg1ghWySHAqTJY1DwFcAikCpo8gQKsQKhgUXYImwRTb6Ar6DJF2CDXCHqEJqPJj+CJl8gVMhgUCOsyRdQwaCQK4BFEA0kMXYCmjyLE9hrRG/XQUfQQQvYpWyRXCPeoUGooB0r4A1yBWSDOoTXeR8h6O3iKB+lLg4KoUJSwajgCwSnoycBQAOLoEXIGehdWYCdQargycAiwSJBBL30J0QsaQTLJyQwsEh2Bt5ASvYylVHnooBFNNURNFWPCrGCpjqCplrAIt4iXgVJIZduxDHnEVKFaJEYK4xTOYLk7KXhUf1TQIeQzif1TwGLABmIspe6kpp/BF1aCoQKbBG2yJhzVPBlrKQ5j6CeL2ARzblAqqA5+6wQKow5j1Aj2YGBRcAiY5/T+bwabIV8Oh42G10gL5ZMWUg/1ofN/jg87E+73Wr4vd6dxn/69bHej5/H9UGuihc2+1f5FMG37W6jdF7Nd7v2rSjLSb0bCf0kABCvJKAj4dhF03CMMInE6zSwoxGTKWSek4j87TrE8aYQU2rWwW0JYrZWEIe5FV+S8HfoRPiPnZBtAa0Mrb7VidSWYEBrJsvm2+pE7lQBXrfwUgd4DK1OQK8SXe1KIaHdin4WDHMWmZpZdKzJ6OZe5EnBL2rmRR1fyoCOM/PUy3zRSYZFlqD2Q96RkCm0h8Njnl3lvzQydiRAd9MiARfeRkfXGp1mYrLJoDw/5JTStULHE9JBnJqZ5ydUDj/Xi1WnGcGRTUhwPM8IfT+LednNciJrZ9ExZnY82cJl19ag3iNmEnSxaGII359Vl9NkDOebs4q++6BP0+pdbGp8059i95Y/8Q7+xJv9iXfwJ93sT7yDP+kO/qSb/Yl38Cd1/MkyuC3hfKkBYZE/qelP6lQSs7NmRLFGMwtKvX66aUcU9s0TCuXegzJvBRcmz/+UhuM5jfbxgDvnTpLftLazkhgFmyIdk1KIUyIR/JIDF+TpiYUcqenS3unVeZzOjRdHz3+SSNNB3uVlWQC56bREaZmEm499AMsKyXGWwFt7sVQCeDqHy2unhRI4S8DNM7JUIuZJIsVlEvOMyOwslJgO4gju1kKWSiBNPxLlLVxTwqfe4hd43k/mKQHZ4h/l2/ple7h673lWrcN2/bzb1K9vp/3LxdXjnw+7Yu9NPw7vL5vX02GjSvPLU/nzA2QrkjXiUd5rwvgVV5D48ayj/wU="
58
+ "bytecode": "JwACBAEoAAABBIBHJwAABEclAAAATicCBQQDJwIGBAAfCgAFAAYARBwARkYBLQhEAi0IRQMtCEYEJQAAAHQnAgIERycCAwQAOw4AAwACLAAAQwAwZE5y4TGgKbhQRbaBgVhdKDPoSHm5cJFD4fWT8AAAACYeAgAFAB4CAAUAHgIABgEKIgZDBxYKBwgcCggJAAQqCQYIJwIGAQAKKgcGCSQCAAkAAACxJwIKBAA8BgoBCioIBQckAgAHAAAAwyUAAAH4JwIFAAIpAgAHAO9SU00rAgAIAAAAAAAAAAADAAAAAAAAAAAtCAEJJwIKBAUACAEKAScDCQQBACIJAgotCgoLLQ4HCwAiCwILLQ4FCwAiCwILLQ4CCwAiCwILLQ4ICy0IAQInAgUEBQAIAQUBJwMCBAEAIgkCBQAiAgIKPw8ABQAKJwIFBAEAKgIFCS0LCQknAgIAAAoqCQIKCioKBgskAgALAAABbiUAAAIKLQgBCicCCwQFAAgBCwEnAwoEAQAiCgILLQoLDC0OBwwAIgwCDC0OCQwAIgwCDC0OAwwAIgwCDC0OCAwtCAEDJwIHBAUACAEHAScDAwQBACIKAgcAIgMCCD8PAAcACAAqAwUHLQsHBwoqBwIDCioDBgIkAgACAAAB7CUAAAIKHAoEAgAwCgACAAcmKgEAAQXBUDSsJUi8UTwEAgEmKgEAAQW6uyHXgjMYZDwEAgEm",
59
+ "debug_symbols": "tZdbbuMwDEX34u98iCL1YLYyKIo0dYsARhK4yQCDInsfqhb9KCAhE09/kmPKvqaoS9n+bF7bl+v78+H4dvpotr8+m5f+0HWH9+futN9dDqejRD8bk34AfLPFTQMWmm1I/3IMIIASgDSCPgOZPEQug0sRl8Bl8BrxMUNAhSDgBaLNwEZBLrdyC2uMAmdAjSAp6BBphDTiNOJiBm8VQoYACj5D1FtETSMmQcnZMirEAdCggkZAI6ARm9LwCTgDagTTOVGAUEEjTiMeFNLaJMFgFFyGqJGoEdYIk0IcgFLOA4QMYBXyLSit/wBJMCTgDCn5ATRCGiGNOI0kA2BM4BTkHDICgRQ0EkMGlnyIEqRIuN02jXr1+dK3bbLqzLxi6fOub4+XZnu8dt2m+b3rrl8nfZx3x6//y66XUdFuj6/yL4Jvh65NdNtMV5vypeI8l6+2aN0oABAWElCRMFJx1TBS4lEkLNOwFY0QVYFpSiLQ3fPw0atCiLE4DypLIJGWAmVdp1ksk3D/oRL+ByuBYKxOI82+VIlYlpDG0WKSbHqlSnBlFuDSZjrMA5z1pUpAbSbEOhFfLkU9C4IpC8ZiFhVrkjVTLXhUcA8VczaPb9OAijMZ1JhsJ2sTPGQJLDd5RUKWUHNwlidXuW+FDBUJSHvfIAEzb1uDS41KMeUpphPhqRIoDb9QqHiCpw2Pkeyk4ZYraivFYENqbjZsyhpQM7dK4Gy7st4vFWp7JgQezR3DYxoWx23TBiprUG1d/biu1kx7HsS705DFHKvBDMU0qvYyHKc0XNFeNlR3nNFfzoSixp2NIn1XahTL6xsFzdpGQVjfKGjXNwri2kZBWt8oVY07GwX96kappXFvo1TtdWejYEWDZC30oUZzDfAPNQoWG4UqFg1stBqBLRezoNrWQ2Z8RxB2xXc2wtrKTg/HWbfxP6VhaEqj/MJElfdPRAzqUvkYQ1sUqbgUfRgTCeCW711PcrjbH/rFN/YtifWH3UvX5sO363E/G738OeuIfqOf+9O+fb32bVKaf6jLZw+7DYenW7rbXw=="
72
60
  },
73
61
  {
74
62
  "name": "consume",
@@ -109,10 +97,6 @@
109
97
  "visibility": "public"
110
98
  },
111
99
  "error_types": {
112
- "361444214588792908": {
113
- "error_kind": "string",
114
- "string": "attempt to multiply with overflow"
115
- },
116
100
  "5525725861591553972": {
117
101
  "error_kind": "string",
118
102
  "string": "rejecting all"
@@ -121,22 +105,14 @@
121
105
  "error_kind": "string",
122
106
  "string": "Storage slot 0 not allowed. Storage slots must start from 1."
123
107
  },
124
- "14990209321349310352": {
125
- "error_kind": "string",
126
- "string": "attempt to add with overflow"
127
- },
128
- "16431471497789672479": {
129
- "error_kind": "string",
130
- "string": "Index out of bounds"
131
- },
132
108
  "17089945683942782951": {
133
109
  "error_kind": "string",
134
110
  "string": "unauthorized"
135
111
  }
136
112
  }
137
113
  },
138
- "bytecode": "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",
139
- "debug_symbols": "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"
114
+ "bytecode": "JwACBAEoAAABBIBIJwAABEglAAAASScCBAQCJwIFBAAfCgAEAAUARS0IRQItCEYDJQAAAHgtAgJHJwIDBEcnAgQEATsOAAQAAykAAEMAR9rNcywAAEQAMGROcuExoCm4UEW2gYFYXSgz6Eh5uXCRQ+H1k/AAAAAmHgIABAAeAgAEACcCBAABKQIABQDvUlNNKwIABgAAAAAAAAAAAwAAAAAAAAAALQgBBycCCAQFAAgBCAEnAwcEAQAiBwIILQoICS0OBQkAIgkCCS0OBAkAIgkCCS0OAgkAIgkCCS0OBgktCAEEJwIIBAUACAEIAScDBAQBACIHAggAIgQCCT8PAAgACScCBwQBACoEBwgtCwgIJwIEAAAKKggECScCCgEACioJCgskAgALAAABMiUAAAQjHgIACQAvKgAIAAkACxwKCwkCHAoJCAAcCggJAhwKCQsBHAoLCAIcCggJAQoqCQoIJAIACAAAAW8lAAAENR4CAAgBCiIIRAkWCgkLHAoLDAAEKgwICwoqCQoIJAIACAAAAZ0nAgwEADwGDAEeAgAIAx4CAAkEKQIADADDt7IGKwIADQAAAAAAAAAABQAAAAAAAAAALQgBDicCDwQFAAgBDwEnAw4EAQAiDgIPLQoPEC0ODBAAIhACEC0OCxAAIhACEC0OCBAAIhACEC0ODRAtCAEIJwILBAUACAELAScDCAQBACIOAgsAIggCDD8PAAsADAAqCAcLLQsLCwAqCwkMLQIIAycABAQFJQAABEctCAUJACoJBwstDgwLJwILBAIAKggLDC0LDAwAKgwDCC0CCQMnAAQEBSUAAARHLQgFAwAqAwsMLQ4IDC0IAQgnAgkEBQAIAQkBJwMIBAEAIgMCCQAiCAILPw8ACQALACoIBwMtCwMDJwIIAAItCAEJJwILBAUACAELAScDCQQBACIJAgstCgsMLQ4FDAAiDAIMLQ4IDAAiDAIMLQ4CDAAiDAIMLQ4GDC0IAQInAggEBQAIAQgBJwMCBAEAIgkCCAAiAgILPw8ACAALACoCBwgtCwgICioIBAsKKgsKDCQCAAwAAAMpJQAABCMtCAELJwIMBAUACAEMAScDCwQBACILAgwtCgwNLQ4FDQAiDQINLQ4IDQAiDQINLQ4DDQAiDQINLQ4GDS0IAQMnAgUEBQAIAQUBJwMDBAEAIgsCBQAiAwIGPw8ABQAGACoDBwUtCwUFCioFBAYKKgYKByQCAAcAAAOnJQAABCMeAgAGAC8qAAUABgAHHAoHCAIcCggGABwKBgcCHAoHCAEcCggGAhwKBgcBJwIGAQEkAgAHAAAD5CUAAAShLQsJBgAiBgIGLQ4GCS0LAgYAIgYCBi0OBgItCwsCACICAgItDgILLQsDAgAiAgICLQ4CAzAKAAQABS0IQwImKgEAAQW6uyHXgjMYZDwEAgEmKgEAAQVMr1JlAlqXtDwEAgEmLQEDBgoABgIHJAAABwAABJwtAAEFAAABBAEAAAMECS0AAwotAAULIwAABIUtAQoILQQICwAACgIKAAALAgsMAAoJDCQAAAwAAARzJwEFBAEjAAAEoC0AAwUmKgEAAQXtK68NmiE35zwEAgEm",
115
+ "debug_symbols": "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"
140
116
  },
141
117
  {
142
118
  "name": "is_consumable",
@@ -178,30 +154,18 @@
178
154
  "visibility": "public"
179
155
  },
180
156
  "error_types": {
181
- "361444214588792908": {
182
- "error_kind": "string",
183
- "string": "attempt to multiply with overflow"
184
- },
185
157
  "13455385521185560676": {
186
158
  "error_kind": "string",
187
159
  "string": "Storage slot 0 not allowed. Storage slots must start from 1."
188
160
  },
189
- "14990209321349310352": {
190
- "error_kind": "string",
191
- "string": "attempt to add with overflow"
192
- },
193
- "16431471497789672479": {
194
- "error_kind": "string",
195
- "string": "Index out of bounds"
196
- },
197
161
  "17312933876399746100": {
198
162
  "error_kind": "string",
199
163
  "string": "Function is_consumable can only be called statically"
200
164
  }
201
165
  }
202
166
  },
203
- "bytecode": "JwACBAEoAAABBIBJJwAABEklAAAASScCBAQCJwIFBAAfCgAEAAUARi0IRgItCEcDJQAAAFktAgJIJwIDBEgnAgQEATsOAAQAAycAQwQDJwBEAAAnAEUBASYeAgAEAB4CAAQAHgIABAkkAgAEAAAAdSUAAAIlJwIEAAEpAgAFAO9SU00tCAEGJwIHBAQACAEHAScDBgQBACIGAgctCgcILQ4FCAAiCAIILQ4ECAAiCAIILQ4CCCcCBwQILQgACC0KBgoACAAHACUAAAI3LQIAAC0KCgQKIgREBicCBwEACioGBwgkAgAIAAAA8CUAAAQMHgIABgAvKgAEAAYACBwKCAYCHAoGBAAcCgQGAhwKBggBHAoIBAIcCgQGARYKBgQnAgYAAi0IAQgnAgkEBAAIAQkBJwMIBAEAIggCCS0KCQotDgUKACIKAgotDgYKACIKAgotDgIKJwIGBAktCAAJLQoICwAIAAYAJQAAAjctAgAALQoLAgoiAkQGCioGBwgkAgAIAAABjCUAAAQMLQgBBicCCAQEAAgBCAEnAwYEAQAiBgIILQoICS0OBQkAIgkCCS0OAgkAIgkCCS0OAwknAgMECC0IAAgtCgYKAAgAAwAlAAACNy0CAAAtCgoCCiICRAMKKgMHBSQCAAUAAAH0JQAABAweAgADAC8qAAIAAwAFHAoFAwIcCgMCABwKAgMCHAoDBQEcCgUCAhwKAgMBBCoEAwImKgEAAQXwQ+Wh+qIsNDwEAgEmKwIABQAAAAAAAAAAAwAAAAAAAAAALQgBBCcCBgQFAAgBBgEnAwQEAQAiBAIGLQoGBy0MRAcAIgcCBy0MRAcAIgcCBy0MRAcAIgcCBy0OBQcnAgUEACcCBgQBJwIHBAItCgUDIwAAAp8KKgMFCAAqBAYJLQsJCQAqBAcKLQsKCiQCAAgAAALIIwAAAsMtCgkCJgQiA0MIBiIIQwwKKgwDCyQCAAsAAALkJQAABB4MIghDCyQCAAsAAAL2JQAABDAAIgICDAAqDAgLLQsLCwAqCQsMLQIEAycABAQFJQAABEItCAUJACoJBgstDgwLACoIBgsOKggLDCQCAAwAAAM7JQAABJwMIgtDDCQCAAwAAANNJQAABDAAIgICDQAqDQsMLQsMDAAqCgwLLQIJAycABAQFJQAABEItCAUKACoKBwwtDgsMACIEQwktCwkJACoIBwsOKggLDCQCAAwAAAObJQAABJwMIgtDCCQCAAgAAAOtJQAABDAAIgICDAAqDAsILQsICAAqCQgLLQIKAycABAQFJQAABEItCAUIACIIQwktDgsJLQgBBCcCCQQFAAgBCQEnAwQEAQAiCAIJACIEAgo/DwAJAAoAKgMGCC0KCAMjAAACnyoBAAEFursh14IzGGQ8BAIBJioBAAEFBQQbmSCvYEw8BAIBJioBAAEF5AhQRQK1jB88BAIBJi0BAwYKAAYCByQAAAcAAASXLQABBQAAAQQBAAADBAktAAMKLQAFCyMAAASALQEKCC0ECAsAAAoCCgAACwILDAAKCQwkAAAMAAAEbicBBQQBIwAABJstAAMFJioBAAEF0Afr9MvGZ5A8BAIBJg==",
204
- "debug_symbols": "tZndTuMwEIXfpde98Hhm/MOrrBAqUFaVqoK6sNIK8e47E3ucFCkWNOGGfj0hx2P72A7kffO4v3/7fXc4PT3/2dz8et/cnw/H4+H33fH5Yfd6eD6J+r5x+iPlzQ1uN5k2N1E+5Bu47QacfAcQAG8QBYKA9xUQDLgCOQNT2BRuSq4Q0CBViOYcra2kTWSFUCE7AzLIBbwjg1RBi/egECt4U7wpWvwAWryPCqro7SwVol7iVCGYEkyJpkRTkijeK0gTKL3w2RuEAujAwBQwBUzxzoAMcgVEg1SBtImsECswGHCF4AyakitoLwgUUoVkSgYDKYykLXLOgCuAKWCKN0WLL5AqaPEFYgUtvoA2IfWQFl+ADXKFQAamDMUPIIYspVLyBqZkLsBaPEcFVeQuBrk96CVIFbwp3hQ0BU0hVWSWOUgTQVYQp1RBp7tAvRScNzAFTNHpHkBHrAAb5ApIBrWJMLSuEGWgAimoDwvokimgPjKqQZeMQhwajQqxgjfFm6LLYQBdDiEpcAVdDgVShWBKMEWXcMgKsZQRrZ6YaoUxm6KTopB0UgroNuQUcgUwRUstIM5RpiChr6ClFuAKbAo3RQ1lvpLmR0cjDTUraH4KmKL5KRAraM0RFUKBrDVHUuAKYIoGaQANUmSFVAFDBQIDU9iUoWZpNOuCHdrSmgvkCtEUrXkAXbAFdHyS7uVgEAqAc9CoadA0aNow2PHjY7uxE+Pu9bzf64ExOULkYHnZnfen183N6e143G7+7o5vwy/9edmdhs/X3VmuyrTtT4/yKYZPh+Ne6WM73u3mb/XouN7t0XMzkPPowgI6Fo5cNA9HHppJvCzDdzx0XIpDprGISF/uR0jBHGJKs/2geQsksqFACuNQfCqCVxiJ8IMjgRhj64aj2ZFIHQsn4TYPya2f60ee9wCXqFoAuLi8J2G2Jx0LTi3enHCcD77sB3SiyUDWEYbJlHiHlx7YmdRkSxTzmE2UnF44dMKZvZ6Gg0X2eeyIPH5cenTiGRxi9QiOxvHEr1cx7hZZnonmq4gdD0dWRXbZzXv0AtoscLLWfQhfn1WXbZ2xdzw7q74TLpLGqwfR1APCVflkN5dP3+lJgLbQ5CEnz1bhO/lEH8DiJYw4u4X39k+QTLRdQ87bWZM1tlC/eA/t9yWlPPZlehp8KqOXUh5jyr1C+jPjJjNDaa4QdL2I2JAGnCza/I2YhthimvNcTHGFbRQXb6O4wjaKi7dRXGEbxRW2UVy8jeIK2yj1jnnKbVp58qTw2eOL+cwQ5vJJK+STFueTVsgnLc4nrZBPWiGftDiftEI++aeP+Uk+kefyySsc87zGMc9rHPO8xjHPi495XuOY5xWOeV7jmA8/e8w7GmMa52LacZAxtG5Ajji7Znt/yTv2LRmTGfmWRWr/1HD5uioAbS8XTNdZOGwWANd1JMfRwi8di2stgNpCg+CutPCjBSyekWstYm4WKV5nMc7IxTb8LQtoFuCWduRaC4/tH2Y+0qxFjL1npkDj6TpOCcgDz6182z0czhfvxD7U63zY3R/39evT2+lhcvX134tdsXdqL+fnh/3j23mvTuOLNfnxS3Kw9Ui3+vps+Oq28k7q9kNb/w8="
167
+ "bytecode": "JwACBAEoAAABBIBGJwAABEYnAgQEAicCBQQAHwoABAAFAEMtCEMCLQhEAyUAAABELQICRScCAwRFJwIEBAE7DgAEAAMeAgAEAB4CAAQAHgIABAknAgUBASQCAAQAAABlJQAAAnYnAgQAASkCAAUA71JTTSsCAAYAAAAAAAAAAAMAAAAAAAAAAC0IAQcnAggEBQAIAQgBJwMHBAEAIgcCCC0KCAktDgUJACIJAgktDgQJACIJAgktDgIJACIJAgktDgYJLQgBBCcCCAQFAAgBCAEnAwQEAQAiBwIIACIEAgk/DwAIAAknAgcEAQAqBAcILQsICCcCBAAACioIBAknAgoBAAoqCQoLJAIACwAAARUlAAACiB4CAAkALyoACAAJAAscCgsJAhwKCQgAHAoICQIcCgkLARwKCwgCHAoICQEWCgkIJwIJAAItCAELJwIMBAUACAEMAScDCwQBACILAgwtCgwNLQ4FDQAiDQINLQ4JDQAiDQINLQ4CDQAiDQINLQ4GDS0IAQInAgkEBQAIAQkBJwMCBAEAIgsCCQAiAgIMPw8ACQAMACoCBwktCwkJCioJBAIKKgIKCyQCAAsAAAHHJQAAAogtCAECJwILBAUACAELAScDAgQBACICAgstCgsMLQ4FDAAiDAIMLQ4JDAAiDAIMLQ4DDAAiDAIMLQ4GDC0IAQMnAgUEBQAIAQUBJwMDBAEAIgICBQAiAwIGPw8ABQAGACoDBwItCwICCioCBAMKKgMKBCQCAAQAAAJFJQAAAogeAgADAC8qAAIAAwAEHAoEAwIcCgMCABwKAgMCHAoDBAEcCgQCAhwKAgMBBCoIAwImKgEAAQXwQ+Wh+qIsNDwEAgEmKgEAAQW6uyHXgjMYZDwEAgEm",
168
+ "debug_symbols": "tVjbbts6EPwXPfuBy72QzK8UReAkSmHAcALXPsBB4H8vN+LqUkCsWjov0XgkjZbkzIrRR/fSP11/PB5Or28/u4dvH93T+XA8Hn48Ht+e95fD2ymzH53TPxK7B9x1AbuHkA/5F7hdF/NPgHyMwzHJcAQHGUQFUgBwAWgMOQN2io1hY8QYIQOxAC1lAKGA6A3YI5KVkbKgdwrSALwjA8aAMWCMNwZzGR4UcAFkDOk1qCAVwMawMWJM8AZyzT5loDWj6qQsiHpKS1WAzhkwBowBY7yWQQryI8gpSAUgGogFkDFkDBvDoQABA1JAcAbYgD0i2kN1/clnkLyBMABy3oAxYAwY47UMVBALQL2GFYQCyBg1yQByPay36zx/Ap3nARgTjAnGqGUHEArQmgcgA2B17wDKI1hnfgAqSApiAVr8AIxBY9AYMkZNwrl4VpMMQK/JkWJBA8YEKSDmegQVZEb0rpRvFz2lflYgjgwYA8aAMWoSibfbrrOAP17Ofa/5niU+94H3/bk/XbqH0/V43HX/7Y/Xz4t+vu9Pn8fL/pzP5pXvTy/5mAVfD8de0W033e3Wb82J4nK3R8+jAEBYSEBFwmVLmYYjD6NIWJbhKxohmkKiqYhAm8chUUwhxLg6DlqXQCKbCiSZpuK3IvgOMyFfOBOIIYzDcLQ6E7Ei4VIC08ivEL82jrSuAS5SkQBwoX0ksjqSigTH0d4ccVoPXo4DKtbMncYGwjBbEu9wqYGVRY0WUUyTN3O3XipUzJmmnCakaUGQealRsWdy2tIHDZfcuobUQmISOEuZF1kqhMpcQEjmcIjh3zQ8jmn3gdY1Um1dZVxX7yZrQNxcRl7McTZyYtbLqNnLpTiVwav28hUNymtRNIjmGiD/FBR2a0HxFYsKjImXvJlbrcJXLIpedLKGKfWCuPouqXkUckTG9pV4/YUU7vFWi63NvD6WGNM0lvlraVkG1hopT6nlWiH1lXGzlaG4WoivWcSmVHDWw9Jf2FTCaNOU1myK1N7PkVv7OUp7P8fQ3s8xtvZzTO39vKqxsZ8TNPfzWhlb+3nVXhv7OVV3omn0F8/2Tr9rbAxKAlkLCkl7UCi0BoVie1AotQeFXWtQGNqDUtXYGBTG5qDUytgalKq9NgaF5Ys3PrOgIK8FhWP7xofTHTY+4u6w8ZF7/Dsvzf/P18eyceMj1L7x+cPKbNv4iHzpxsfRZNOwsOn3/Gv/fDgvvhbfVOt82D8d+/Lz9Xp6np29/P9uZ+xr8/v57bl/uZ57VZo+OUP+6vUN8i4VfPx+0+f9Ag=="
205
169
  },
206
170
  {
207
171
  "name": "is_reject_all",
@@ -274,26 +238,14 @@
274
238
  ],
275
239
  "return_type": null,
276
240
  "error_types": {
277
- "361444214588792908": {
278
- "error_kind": "string",
279
- "string": "attempt to multiply with overflow"
280
- },
281
241
  "13455385521185560676": {
282
242
  "error_kind": "string",
283
243
  "string": "Storage slot 0 not allowed. Storage slots must start from 1."
284
- },
285
- "14990209321349310352": {
286
- "error_kind": "string",
287
- "string": "attempt to add with overflow"
288
- },
289
- "16431471497789672479": {
290
- "error_kind": "string",
291
- "string": "Index out of bounds"
292
244
  }
293
245
  }
294
246
  },
295
- "bytecode": "JwACBAEoAAABBIBIJwAABEglAAAASicCBAQCJwIFBAAfCgAEAAUARhwAR0cBLQhGAi0IRwMlAAAAeicCAgRIJwIDBAA7DgADAAIsAABDADBkTnLhMaApuFBFtoGBWF0oM+hIeblwkUPh9ZPwAAAAJwBEBAMnAEUAACYeAgAEAB4CAAQAHgIABAEKIgRDBRYKBQYcCgYHAAQqBwQGJwIEAQAKKgUEByQCAAcAAAC3JwIIBAA8BggBJwIFAAIpAgAHAO9SU00tCAEIJwIJBAQACAEJAScDCAQBACIIAgktCgkKLQ4HCgAiCgIKLQ4FCgAiCgIKLQ4GCicCBgQJLQgACS0KCAsACAAGACUAAAGhLQIAAC0KCwUKIgVFBgoqBgQIJAIACAAAAS0lAAADey0IAQYnAggEBAAIAQgBJwMGBAEAIgYCCC0KCAktDgcJACIJAgktDgUJACIJAgktDgIJJwIFBActCAAHLQoGCQAIAAUAJQAAAaEtAgAALQoJAgoiAkUFCioFBAYkAgAGAAABlSUAAAN7HAoDBAAwCgAEAAImKwIABQAAAAAAAAAAAwAAAAAAAAAALQgBBCcCBgQFAAgBBgEnAwQEAQAiBAIGLQoGBy0MRQcAIgcCBy0MRQcAIgcCBy0MRQcAIgcCBy0OBQcnAgUEACcCBgQBJwIHAQEnAggEAi0KBQMjAAACDgoqAwUJACoEBgotCwoKACoECAstCwsLJAIACQAAAjcjAAACMi0KCgImBCIDRAkGIglEDQoqDQMMJAIADAAAAlMlAAADjQwiCUQMJAIADAAAAmUlAAADnwAiAgINACoNCQwtCwwMACoKDA0tAgQDJwAEBAUlAAADsS0IBQoAKgoGDC0ODQwAKgkGDA4qCQwNJAIADQAAAqolAAAECwwiDEQNJAIADQAAArwlAAADnwAiAgIOACoODA0tCw0NACoLDQwtAgoDJwAEBAUlAAADsS0IBQsAKgsIDS0ODA0AIgRECi0LCgoAKgkIDA4qCQwNJAIADQAAAwolAAAECwwiDEQJJAIACQAAAxwlAAADnwAiAgINACoNDAktCwkJACoKCQwtAgsDJwAEBAUlAAADsS0IBQkAIglECi0ODAotCAEEJwIKBAUACAEKAScDBAQBACIJAgoAIgQCCz8PAAoACwAqAwYJLQoJAyMAAAIOKgEAAQW6uyHXgjMYZDwEAgEmKgEAAQUFBBuZIK9gTDwEAgEmKgEAAQXkCFBFArWMHzwEAgEmLQEDBgoABgIHJAAABwAABAYtAAEFAAABBAEAAAMECS0AAwotAAULIwAAA+8tAQoILQQICwAACgIKAAALAgsMAAoJDCQAAAwAAAPdJwEFBAEjAAAECi0AAwUmKgEAAQXQB+v0y8ZnkDwEAgEm",
296
- "debug_symbols": "tZjbbuo6EIbfJddceA4+9VWWqoq2dAkJ0YoFW9qqePc9k3gcqGSLFdg38GVC/vyeGTsm38P75vX0+2W7//j8Mzz9+h5eD9vdbvv7Zff5tj5uP/cS/R6cfgDi8EQr+Y7DU5RvkmMABQmAnmE0COWUBwONeIEABhaJbJALJBqe0CmkAjlOgA4MQgGwCFgELYLeIBcgNijKyGSgtxDz6NEgFAjOwBeIFlHzE6igmMfR/AgWyWECUvPkFHwBcAYWQYtgjeQCRAapgCZ8glhAE06kEAqo+QnYIBeIFlHzIyQVVKspFsglws4ZqLEsoOYZFeTHLJezGhtBjU1gp7xFvEWCRbQTRtCsTuANcoHEBnaLTBN41MtZgGTs7BVCAVbBoOALBL27dK+PaGCRZJHsDPSqtBqCjn2CVADIwCJoEZ0fLPkJOkHURjA/gcHAIt4ZeAMZspdSBq3XBBZRqyOoVQ8KsYBaVYhqdQKLgEVABVEhT9mIo+cRUgGyiE7qEcZSjiCevSQ8ao9NoLeQzEftsQksEslAlL2MK+q8GCGDQZggOTCwyOg5KPjpXkk9j4BsYBH1PEEqoJ59UggFRs8jWCRYJFgkWmTMczyfV4Mtgy/Hw2ajq+DFuiir5df6sNkfh6f9abdbDf+sd6fxR3++1vvx+7g+yFmp2Gb/Lt8i+LHdbZTOq/lq174UZakoV6OsCFUAIF5JQEfCsYum4RihisRrG9jRiMkUMs8mIt88jpCCKcSUmuPgtgQxWyqIw5yKHyb8AzIR/s9MUKgeZLmtEv7aQmorMKDlksE3E5E7HuS5TGYCZAFtJQJcrx7ZyhHamei7YJhdZGq66HQmo5tzkedsLkrmxTh+DAM6jZlrLvNFJhlu7wji2hEhtDoCOl3pgU3Cw0VfoqNrjdixkSyTlOcJSjJZrxQ6uZThY81EnmcX+etyQKcpgiPLZnA8J4NudzEvmVk2SE0X2Fkzs+NaU5ddWwN788Mk6GLBQynwzVV12RYbj843q4rdVTPXsnoXmxq39ufFUH70Jz6gP/Hu/sQH9Cfe3Z/4gP6kB/Qn3d2f+ID+pE5/yl8G02C+1ICwpD/ZNfuTOiOJ2VkyorRG0wXFXj5dfZwJ++buglJvovia0Ysmz39lw/Fso/1s596znSjaY1GyS9gU6TSpbHSqkQh+yWYJcp2x8gqAml3a6w7nse75LraNfyWR6ibc5WUugFzd6lBaJuHmPRvAsoHkOEvgvblYKgFc99AQ3EIJnCXg7ooslYi5SqS4TGKuiFRnoUTdRUuP3DuQpRJI9Q+evBRrSvjYW/wCz8+TuSQgj/hnOVq/bQ9XLybPqnXYrl93m3L4cdq/XZw9/vtlZ+zF5tfh823zfjpsVGl+uykfvyDBCnJ+lveNoIfRryDG57Pe/T8="
247
+ "bytecode": "JwACBAEoAAABBIBGJwAABEYlAAAASicCBAQCJwIFBAAfCgAEAAUARBwARUUBLQhEAi0IRQMlAAAAcCcCAgRGJwIDBAA7DgADAAIsAABDADBkTnLhMaApuFBFtoGBWF0oM+hIeblwkUPh9ZPwAAAAJh4CAAQAHgIABAAeAgAEAQoiBEMFFgoFBhwKBgcABCoHBAYnAgQBAAoqBQQHJAIABwAAAK0nAggEADwGCAEnAgUAAikCAAcA71JTTSsCAAgAAAAAAAAAAAMAAAAAAAAAAC0IAQknAgoEBQAIAQoBJwMJBAEAIgkCCi0KCgstDgcLACILAgstDgULACILAgstDgYLACILAgstDggLLQgBBScCBgQFAAgBBgEnAwUEAQAiCQIGACIFAgo/DwAGAAonAgYEAQAqBQYJLQsJCScCBQAACioJBQoKKgoECyQCAAsAAAFYJQAAAeItCAEKJwILBAUACAELAScDCgQBACIKAgstCgsMLQ4HDAAiDAIMLQ4JDAAiDAIMLQ4CDAAiDAIMLQ4IDC0IAQInAgcEBQAIAQcBJwMCBAEAIgoCBwAiAgIIPw8ABwAIACoCBgctCwcHCioHBQIKKgIEBSQCAAUAAAHWJQAAAeIcCgMCADAKAAIAByYqAQABBbq7IdeCMxhkPAQCASY=",
248
+ "debug_symbols": "tVfbbuIwEP2XPPPgufgy/MpqVdE2rZAQoBRWWlX8+47Bk0slW2zZfSGH4+TkeHzGST671/75/P603b8dPrr1j8/uedjudtv3p93hZXPaHvbKfnYu/wBgt6aVHmO3jnpE/Q+QgRKQRwgNhDLEYCAzXoEHA8YENiAFROrWiBmkAlK8AXSFwezmBmwIjUFjyJjs5wrYGfAGpADPBuwWgQxkQVYQwUAoIBmTjBFjpDDksg2fQSwAjIF8jhaTEAwYQ8aQFMDqkLIgpwI8GTAmGBOMiWggFJA934AvQJwBu4XIDbDLgiGDWMA1B1dgDBqDxpAxlG2oeWYykM8RBR4NGBN8AVH9MGWgDIfLZdVZIJ9OQ9/nPM4Sqrk9boZ+f+rW+/Nut+p+bXbn60kfx83+ejxtBh11q67fv+pRBd+2uz6jy2q62tUvRXK+XK258qOAtsNCAhoSTotoGo4RRpG4tIENjZhMQXgyEfnueYQUTCGmVJ0H1yU0iFYK0jWbZrE04f9BJcL/rASF0QMlHCX80kKqK2grWC0ZfLUQ0vCg+yGZCfAYaoUA11oPseUI9Uq0XTBMLoSqLhrJZHRTLWSq5reKOZvHl2lAI5gClkvBKdkM9ycib3klESHUEgGNVHpgk/AwyyU6WmrEho1klSSZpkHarAuFRi1l2qyEeIo2+eVyQCMU4tiSKU5cVQObyTQJmm01GMJSobVnQpQxmSl+TwNp3PIwcl2DWusaxnVFN+1XkO62oYs5VkMEqjaa8XKSJhu+Gi8Mze1izJd3sapxb6PMVvZLo2B6vFFQHm0Uco83CsHjjUL4aKMQPd4oTY07G4X8w43SsnFvozTjdWejUOuJpGthTySea0D4TqOwqzYKNySiOKtGFJSqC25tPezGB7xiX33fYmytrB8rOus2+Ssbjicb9bcdbr19kn7JmIj2DVZFGinVV7/RSAS/fGn6qX83L9th8RF8yWLDdvO868vft/P+ZTZ6+n20EfuIPg6Hl/71PPRZaf4lrZ8sGi1xPy/5bn8A"
297
249
  },
298
250
  {
299
251
  "name": "set_authorized_private",
@@ -2116,7 +2068,7 @@
2116
2068
  }
2117
2069
  },
2118
2070
  "bytecode": "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",
2119
- "debug_symbols": "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",
2071
+ "debug_symbols": "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",
2120
2072
  "verification_key": "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"
2121
2073
  },
2122
2074
  {
@@ -2144,7 +2096,7 @@
2144
2096
  }
2145
2097
  },
2146
2098
  "bytecode": "JwACBAEoAAABBIBFJwAABEUlAAAARicCAwQBJwIEBAAfCgADAAQARBwAREQBLQhEAiUAAABsJwICBEUnAgMEADsOAAMAAiwAAEMAMGROcuExoCm4UEW2gYFYXSgz6Eh5uXCRQ+H1k/AAAAAmHgIAAwAeAgADAB4CAAMBCiIDQwQWCgQFHAoFBgAEKgYDBScCAwEACioEAwYkAgAGAAAAqScCBwQAPAYHASkCAAQA71JTTScCBgABKwIABwAAAAAAAAAAAwAAAAAAAAAALQgBCCcCCQQFAAgBCQEnAwgEAQAiCAIJLQoJCi0OBAoAIgoCCi0OBgoAIgoCCi0OBQoAIgoCCi0OBwotCAEEJwIFBAUACAEFAScDBAQBACIIAgUAIgQCBj8PAAUABicCBQQBACoEBQYtCwYGJwIEAAAKKgYEBQoqBQMEJAIABAAAAVQlAAABYBwKAgMAMAoAAwAGJioBAAEFursh14IzGGQ8BAIBJg==",
2147
- "debug_symbols": "tVbbauMwFPwXP+dB56JbfqWU4qZuMRgnuMnCUvLvKzU6kl2QaMP2JR4fxePRnJGsj+5leL68PY3z6/G92z98dM/LOE3j29N0PPTn8TiH6ken4g8o1+1p1wFQt7fxGu4BAsBQgDiCLgHCNEQ2AY4VHYFNQEvFKAFagO/2iAFYl4CjG0DFAtIQggyBVFAqKJWo5wZMAgwCdAJaCZBX6CQDTSTkCGwCFgVIxUnFScVLxUcZYV6kSIBUIP7HRmATQKmgVEgnwEEhQQShQny97jpp09N5GYbYpVXfQjdP/TLM524/X6Zp1/3pp8vnn95P/fx5PfdLGFW7bphfwjUQvo7TENF1V55W9UeRlE5PB5N1JgCwGwpoUChWVjgUI2QSu5WBDQ7rhMFzEWH52/MwzgiDda46D65TELNYQWyKFV9E6P/ghPlNJyzkjloqkdBbCa7OwIDiJYOuGuEbGkDHbeQmImwUpmYEqFY/vLTD1J1oq2AoKjxVVTSSyaiKF764eZeZq3l8mQY0gumzl37lJMMP1kbOlAWuJQIaqdTAnCg0rHKJirYctiHDiZPkywKlsFg3DA0vfdmsPDEWDr1tBzRC4RVnN5VXVQ5sJlMoaLXVoDFbhtaeCdbnZDp7H0f4GAoHWq5zUKuvJvcVVdmvwH1bRmhmdsN7qMpoxkt5V2ToarywwcGUU8685gBz10IhX1so2Iio9UrcsB59VQX6VrxU3rcC1tXPCKlWZ3V2dLXa/I9kKC4y6ps4NbZPIrKSUgrrBqskjZSSsVlI+LptvwWP4bY/jMvmxHuNZMvYP09Dun29zIfV6PnvSUbkxHxajofh5bIMkWl1bA4HzQcDO0OP1/i2fw=="
2099
+ "debug_symbols": "tVbbTuswEPyXPPfBe/Fl+ysIoVICihSlVWiPdIT678cGb5wg2QJ0eGkm62Yynh07fuue+sfry8MwPZ9eu/3dW/c4D+M4vDyMp+PhMpymWH3rTPoBE7o97ToA6vY+XeM9QAQYC5BGMGRAmIfIZ8CpYhPwGVitOKPAKpBujxiBDxkE+gBoWEEeQtAh0ApqBbWS9HwAlwGDApuBNQr0FTbLQJcIOQGfgUcFWglaCVoRrUiSEedFhhRoBdJ/fAI+A9QKaoVsBhwVEiQQK8S3267TNj1c5r5PXVr1LXbzfJj76dLtp+s47ro/h/H6/qfX82F6v14Ocxw1u66fnuI1Ej4PY5/QbVeeNvVHkYzNT0eT7UIA4DcU0KAwbLxyGEZYSPxWBjY4fFAG4SLC85fn4YJTBh9CdR5cpyBmtYLYFSs+ibD/wQn3m054WDrqqUTCbiWEOgMDqpcMtmqENDSATdvIh4i4UbiaEWBa/RBth6s70VbBUFQIVVU0ksloihdS3PyRmat5fJoGNIIpS0MFS7IZvrE2lkx54FoioJFKC8yZwsIql2hoy+EbMoI6SVKmQXGxbhgaXkrZrIQYC4fdtgMaoRDDmkwxYqoc2EymUtBqq0HntgytPRO8LMkM/mcc8WOoHOi5zkGtvrqlr2jKfgXhyzJiMxc3RKAqoxkvI6HIsNV4YYODaUk585oD3I8WCkltoWAjol6MuuEFpaoCpRUvs+xbEdvqZ4RMq7N2cXS12uRbMgwXGfVNnBrbJxF5TSnFdYNVkkZKyflFSPy6bb8F9/H2cBzmzYn3lsjm4fA49vn2+TodV6OXv2cd0RPzeT4d+6fr3Cem1bE5HjTvHOwc3d/S2/4B"
2148
2100
  },
2149
2101
  {
2150
2102
  "name": "utility_is_consumable",
@@ -2185,10 +2137,6 @@
2185
2137
  "visibility": "public"
2186
2138
  },
2187
2139
  "error_types": {
2188
- "361444214588792908": {
2189
- "error_kind": "string",
2190
- "string": "attempt to multiply with overflow"
2191
- },
2192
2140
  "13455385521185560676": {
2193
2141
  "error_kind": "string",
2194
2142
  "string": "Storage slot 0 not allowed. Storage slots must start from 1."
@@ -2203,8 +2151,8 @@
2203
2151
  }
2204
2152
  }
2205
2153
  },
2206
- "bytecode": "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",
2207
- "debug_symbols": "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"
2154
+ "bytecode": "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",
2155
+ "debug_symbols": "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"
2208
2156
  },
2209
2157
  {
2210
2158
  "name": "offchain_receive",
@@ -2341,8 +2289,8 @@
2341
2289
  }
2342
2290
  }
2343
2291
  },
2344
- "bytecode": "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",
2345
- "debug_symbols": "tZnRbho7EIbfhetceMYztievElUVTekREiIRTY50VOXdj4f1b6CSLQLtTfwR2G9nZ2dsL/xafd98e//n63b/4+Xn6vHp1+rbYbvbbf/5unt5Xr9tX/b1v79Wwf8kLqvH+FBHWz2mOsbQRmojtzG2UdqobUxtzG0sbWw+aT5pPmk+qb7so7RRlzHVzxUf6/8pOCggt3dKG20Zcz0DsQMB6jlIHCJAAApIgAwoAGtQAoAAMBeYC8wF5gJzgbnAXGA2mA1mg9lgNpgNZoPZYDaYrZlzCAAC+FHJIQNKA/LPZAcGREA9O5ODAhIgAwrAGnA9O/vhTAAGRICbi4MCEqCaY3DwqvTgvSyP4HW5AAEYEAECUEACZADMEWaB2Us0elq8RheIADd7hF6mC6QGWg8Xj1nr4RId6odFHeqHxS9ZE6CGIcejCsAapAAgAAMiwM3moIAEyIBqVr8X3h9H8AZZoJqVHRgQAQJQQAJkgJv9Ar1BjuANsgAB3OzX7g2ygADc7Mn0BlkgAwrAGniDLEAAN3sOvUEWEIAC3OyJ8gZJflO8QRawBYo3SCIHAjAgAgSggARwMzsUgDWgAHCzODAgAtysDgpwc3LIgAKwBt5W2YP3tsp+Cm+rBSJAAApIgAyo5hwdrIG3VfYwvK0WYICb/ezeVgsoIAEyoACsgbdVzg4EYEAEuLk4KCABcgP1o8whAgSgS8eVY38dwdcIT5T31wLWwPtrAQIwIAKqufhd9v5aIAEywDuXPj4eVlhNv74dNhtfTM+W17rovq4Pm/3b6nH/vts9rP5d796PH/r5ut4fx7f1ob5bT7vZf69jFf7Y7jZOHw+no8P4UAp1dW6HV07WFRToQkJjiXBqCpHcBZkvjufx8VFxBTGXUwDZPnEVVvpV1LlueBUylmit1ubQoqdcksqFQscKToxkct2ldEW6PoZUegznN+O3GGYKY2RTLaZbFEl9Jjwq6l5KhgobK+qOoRnq0nF2S8v1l9FjUJtkgiZ1GZmQzchRBrdjbigGQwx5ZIiT3qAeg1DMny+JFKLiZgSN40RM6tIIlW18qgi5ujUS+cKzxHCeyM/UFMtJoWOFZ2vY5pZQVWT55NDLiYImdUmZ+nRXdyUjBYdZMhGElfPZKl9vMOmTFelYMZkymaXPNKzDe8pxNmnyaeZXGocxu6v1Ga/PFKmchfHb5D8pzvpkhA6pz0Y2dqRJOkT7vHu6qRJuLAwbFsasPJl7MurticPasunMi/kmqclNUVDCxFnjGUYRZ+u59vU8j+si8mzWK13BZyuI0OXOJM7qU/sNOZv26iR6fRTcV3SJgcZRTKqTuMBBkWgcx8QR644Eq0jdG4/jyH/XQfWp3XqRE4dhr8VZpwQJp4lDQrzVQqctmwgPLTKp1PqVUJ9/6t0eO2ZVUvrKJOViKuVPZDYK9cxGzeNIJrNpTKd9sAwrbWqQvl1RGxvS/dmYOTjiOlj5pig4d0NJ454r91eGhvtzMXNcl4up4bpc5D+QC/kDuZC7cyF/Mxc1+NyvI4ebuv3qXNjfdVyZT7s7n7PZM5L1NXayLqX4B9bY2Z4lIwyVMNyzTDdOse9ZWMJtey8h6XfkbEv9myLle/deaRJEtIBuj8bjdTXNqjPk/tQajG50JO2OPF4RM91b4dN8XlUX0y9D+m4nKY2fv/PMkXN/+M1n6UzXGwr3bwGK5JsMp2f4km/5IkJjf05TGT/Bf2LXx3rTju3K/QXfNO99qS/Xz9vDxQ+dH646bNffdpv28sf7/vns3bf/XvEOfih9Pbw8b76/HzZuOv1aWv88lVqUxfKXh1X91vgp1R/LEvsr/9L/yYI8WEhfPjyW/wE="
2292
+ "bytecode": "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",
2293
+ "debug_symbols": "tZndbhs5DEbfxde5ECnqh3mVoCjc1C0MGE7gJgssgrz7khl9sh1AWtdub6KTxHPM4VCUZuZt9X3z7fXn1+3+x9Ov1f3D2+rbYbvbbX9+3T09rl+2T3v769sq+I/MdXUf72zU1X22MYY2Uhu5jbGN0sbUxtzG0sbaxuaT5pPmk+ZL9rliY7a/q4/cRvMTOSSAfQN5iLkAKkAblAAgAAMiQAAJAHOBucBcYK4wV5grzBXmCnOFucJcYa4wV5gVZoVZYVaYFWZt5hL8qORAAAb4Z7JDBhSAfTsHB21AAUAABkSAfTv74ZQAGVAAbi4O2oADwM3qYObowXMECCABMqAAKkAbeG0uQACYI8wRZi/Q6GnxCl2gANxcHbSBV+kCdrj4uYt9WNjBPizioA1SAFgY4sLEgAgQQAJkQAG42XOYtEEOAAK42XOYI0AAZk4eqk+QBQqgArSBT5AFCGDmRA4RIIAEcLMn0yfIAhXgZk+CT5AFCMCACBBAArjZk+ATZIEK0AY+QZInwSdI8qvjE2SBCHCzZ8MnyAIZUAAVoAtUn0QLeFcKDgyIAAF4p2OHDCgAb3bRQRv4tMriQAAGRICbq4OZi3+FT6sFCqACtIFPqwUIYOZCDhFg5uJh+LRaIAPc7N/u02oBbeDTagECMCAC3JwcEiADCsDN2UEb+LRagAB+VHEogAqwo6qfl8+vBQhg8VQ/QZ9fCwggATKgACrAzX69fH4tQAAG+JnW9/e7FRbJry+HzcbXyJNV09bS5/Vhs39Z3e9fd7u71T/r3evHh349r/cf48v6YP+1qDf77zaa8Md2t3F6vzseHcaHUrBFtx1unLUrKNCZhMYS8eb8oRApXVD47HgeHx8TziBaVnoARX/jLLT2s7D2NTwLGUtS9Vb+4UhWFkdFkjNFGis4M5LJtvnoinxxDMpIRdKYhzFMFDml0hS235Ghoo4VtqY3g7Xyk+tRLz+NHkPS05r6FANNrmlkUlQFxzTI5dygva5iqCPDpDCF+uUQivr71zMH3wMsFyOkOE7ExKEEhfLxJOTius7kC8ESA0e5qqZYjoo0VlCZzFHNqCrScnSk81lOk7qkQr1X2S5hqNBZMhGE1tNWUy43qPROQ2mo4Em/5GM6mdPwmjLPOh4f23aicRhxclXtvqt3inwaxqfOPauMSmi8dq+iY8esa0rqTfN4USVcWRg6LowyuyY9GXZ54kjBddp50bFyUrkqCsponBbPMIo46XqS+mJcxnURZ8s51a7gkxVE6HxbEWf1mfoFOWl71kQvj4L7ciwx0DiKSXUSVzgoEo3jmDhiyXBE26uO48iz+gxVe4HS2dmcz5M4KY4ofUFMOj6Xy+PgMI5DZ71HwrH5SIhjyzSWKNRjiakMLTKpkpiPW0cZ5mRquCirMumjUns7F7szGJ/HxMER58GJr4qCSzfUfFV1XFrpMqlRe/TW1xSbweNc1D+Qz3pzPuvfzOeluUh8ey5mjstyMTXcnAsLvvTzKOGqjnFxLsrfdVyYz3JzPmerY+x3RxInczXTH1gdZ7uNgjCShPF+eprNvttgCdftmoT6fjqdbIY/KXK6ddeUZ91TA2Z7VOZhZeVZdYaC3bRtf+lKR07dUcaratZbK3yaz4vqYvoYo+8xcqLxnXOZtC171YKrau9Y4uD2fWqo3B+m2DPDqwz9ttfez1zzCCHFfoeVZHzv/T87Njo+HxNO1+77Ti0yrvFSb18Vi97excvNNT41jLv4F/t1/bg9nL0EfXfVYbv+ttu0X3+87h9P/vvy7zP+g5eoz4enx83318PGTcc3qfbjodqz8qr85W5lT5MfsjXIzMV+85cBD1X1zhrSl3eP5T8="
2346
2294
  },
2347
2295
  {
2348
2296
  "name": "public_dispatch",
@@ -2362,10 +2310,6 @@
2362
2310
  ],
2363
2311
  "return_type": null,
2364
2312
  "error_types": {
2365
- "361444214588792908": {
2366
- "error_kind": "string",
2367
- "string": "attempt to multiply with overflow"
2368
- },
2369
2313
  "5525725861591553972": {
2370
2314
  "error_kind": "string",
2371
2315
  "string": "rejecting all"
@@ -2391,14 +2335,6 @@
2391
2335
  "error_kind": "string",
2392
2336
  "string": "Function _set_authorized can only be called by the same contract"
2393
2337
  },
2394
- "14990209321349310352": {
2395
- "error_kind": "string",
2396
- "string": "attempt to add with overflow"
2397
- },
2398
- "16431471497789672479": {
2399
- "error_kind": "string",
2400
- "string": "Index out of bounds"
2401
- },
2402
2338
  "17089945683942782951": {
2403
2339
  "error_kind": "string",
2404
2340
  "string": "unauthorized"
@@ -2409,8 +2345,8 @@
2409
2345
  }
2410
2346
  }
2411
2347
  },
2412
- "bytecode": "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",
2413
- "debug_symbols": "vZ3bjh03robfpa99IYk6kHmVIAicxBkYMJzAY29gI/C7j0hRZHUPSi2vqp4b17f+XtaRRVJSVfc/T398+O3bv379+PnPv/799NPP/zz99uXjp08f//Xrp79+f//141+fu/rPU+B/Yk5PP8V3T7FEvdann1K/1qhX/dz0cyvjikGv+pn0M2W9klxTAL3iuOb+/cxXGteS9aqfq36u+rm1p59av2LSa28P9StFvfbyYnj3BCFM6CXEzNCLiNghcpsSAzeKf5TyBNQfAUxgpXbIoMBDM6Aq1F4XRIY8gRTaVNpUcCqICpQmtAE5xAlVIXIVmaFMIIUEE1ABpgJNIXOBlaEqlKnwSAvIUHNdFRUaTJgKTgWnwo0fUAcUbvyAosCNH8BVZAZS4MYPaAqQJkyFGz+AC+xNLSVMmEqFCb1hpc974cYXYBimVxD0OkyvcMtLYWgDKrd8QFWIU0njvqgw7ouqdloLjqvUz1f93PRz089qp1XttE47bdNO27TTNu208WgVYuhK7bU2ttMBqD/iqR7Qldq729hOBXiGB1QFttPKJfNUDyCFNpU2FZwKj5cAD9iANgB5wAZUBZ7qFhnKBFLgqR6ACjAVnmoBnuoGDFWhTIXtVIAb3xpDV7APHaoTQp1pxKxXHLOHBBN0qimkCVOJKDNLbIh8Vc9E6plIZ5zUM5F6JlLPROyZsLeP2DUNqOKjiOdcrmXMcAwy6SjUNRxEk3jelUxLpiXTePiU2iT230p1Eg+hUq+N2K0HNgWlbIST2HqVTONuKbEtA5NY86CpRbZjpd5SIibuUe8No9xIQX4uIz0QXAVXs6vZ1SJqFmyGtRg2uaVQkFW+vaJEqInZvoBkyKGqN0qQJia2D8WYHCtjYUzsEWQyU2KV40hMUAyLqzzqE/0LzdXmKroq7VVEQzbqiW0isGFPtIqB/dhEqaIKkmHKjq6Cq+BqdrVII5tgcZTv8pBIRFS1omEDR1cxOTZDkqaTYJ2Y5Q6CIFhcJUMxOUVXEziioVgfJMFqyL5ooqvF1eJqdbVy04EtNbfkKN/lIckysYrFkFwlU0sIjtkRDSM4NkO5yRS54iypnMQuxeJIhjKxiq4WcOQqMkhemBxdFfsdKN3M0gaxX0UyJFfJ1BqyIxrKrafYDOXWU6yGwBWXKFgcyZAj5EQ0LK5KNwfKxHIa0bEaNlcbGUo3ORh3ZLVKCXJvcvjtfik5uhpdja4mV8VPVr55m3RoYOZuVhLMjmQoHWryXenQQJk3Re5Qk++KpXIs7dgM0VV0VW5IxTpRUoGJrsbgWBzJUPyOoqsc2SZKxbK0kHCgWA3lhlR0tY4oHlFuPAYa8brDSMn6EgUmTCVOJU6F7YqDeSS+e5SKxPMeMMKELFldlGRBQAY/COGkccsISaeYxsBXQRFFHQM/sNoXxsAPZJUCL6Rk4BXJUNyfIjeAI3cK4v4GijNQlMIqoxiVYjEsrhZXq6vi5RXRULy8YjOUvilKxbxsk0xiYnGkiZJWTHRV3J9iryJxjpEkx5joKk+bInezN1UwO5JhcbW4Wl3lbiq25NgMMTpWQ1kWB2kvFUeaONbHimgYXR3dFGT31/stWA3BVfZ5itJNTliSLLUTW19KZSTOSZbbAjVP0Nw5pQZGbRImI9NoJNAJQlNIuriXlEIA8oSp5KnMHQAomkgnqMmojlsngbheFOI+J6lIBpuX6x3JUPYeOInoiBOzjLCiq9HV6KoYkmI1lBFWLIZiU4pcMScnHcmQXcLEZsh9nOiqbK8ochUgeyWyyaLoKoEjN53jfirSzcwlFE7+egcEq2FyNbkKroKoRTZlpnPvWA2Lq8XVGhyLYXO1HVQyxOyIhgSOptaQHKfLT7JWn1gMU3B0FUZU6OZeFHQB36Ep8H09YCo4FZwK38RiobKOV8pja0oW8gLipWT3Snwxz09LMK23jU0nbleTMR/IY554J6NjMWRXPNHV6mo9qGTI9/BENOT+TGyGJBVLVzjMDMQQHLMjGUZX5Q4aKHeQ+AcUVzwQXJXbRpGbzklTQulmlRKKbMDJFyo4utpcba6iq7LhU9j/Im9h9IkRrBOJQ+hEV6Or0VW2p4nZkQxl51ARDbNUDILNULYSFYuhzKbiQSVD6XErgmiIrsoUKnLTceyIBsdiGF2NriZXpZuKaCjdVGyG0k1FqRgYpZuKxZEMJeoouirdVJQqCqMYraKrEk0Fo3STM5uOrPJmBEim0EdZEA2Tq8lVcBVclQ1gTlw6orrGvpqeHqojGlZXq6uWZUO0LBsiuoquWpbdcTpXSCE4FsPoasyOqO4OkuR9is0QkqOrsiRCHr40+jbQ1epqdbW52lxFV9FVcpVMhQCOrkZXo6uyOlJshuAquJpdHcFLUHJaxeJIhpLTKnrF3k1oXgV6FehVjCkcaFWMnQvF7GgVZ+9x9h5n73H2HksqMtEqllRkolecvYriFfvEZp/YsYkxsHnFzatArxi9CvKKyasgq7j4HBef4xKTo1UsCcpEq7hAcCyOXkXOjl6Fm/LYxBhYveLqVTSvuHkV6BXL/jKhIBnyQn+gJCgTq6EEFEVXxdMOHH5nIBpmV7OrxasoXlj1wiR0DGyutoNqTa/eoYpeBXnFo2991QFteE9BCe6K/gVwFVzNrkpkGChxXrE4kqFEBkWvWCLDQL7fejxj5PsNeIEHkrgMlMSlRy7BYsjtBd5PBklGJrqaXS3BUUrgk0KUQz9FNOSWTXQVXUWpgkOHJCPaSG+vJCMTXZXzP8XiyGd3vLIESUYmujo6JDg61ASb4eiQ4OjQQFebq3KWyXvlHWmOJI2+DURDclVONRm760uO0jeSw87oyBXzbkmWDGSiq3K0qSjnp5Exg6GcaypWw+pqdVX6FqU5rVgbRt8E5axW0dXRt4E4MUrfopzMjlNbQemboqvJ1eQquCrzFuH793dP85D+169fPnzgM/rDqX0/y//7/ZcPn78+/fT526dP757+7/2nb/Klf//9/rNcv77/0n/aB+zD5z/6tRf458dPH5i+v/P/Hc7/a86cdMr/7iEkWwG9l9tF9MRmFtH33x4pomdbRYvoq9hwWgSsisBsRaTiRbS83QqiORb9rkqnrSjnRVTk9Z8U0deTPhbdEp4VUZdjMftRmxcQaLcNfACjJfQEN5+2Af9XbaB42obFbHTHW6dZdddyOht8s5/2Q3zx6AgcjSK252WkRRl923Tad+fknWnP77K4ss42zSIdb7IXtrnsSsU5HL0wPO/KYlY4YZwGnqsPx8tm1DtGo73paPQExyYW3TjKi0bQym0ls69+9nU2GGnlMPiEbjaDD+POBiPF1aTQnJN6PhivNIMP8GYzCE6bsbDQnIKPhjuu8th4HnrysiML+yQbTTqMZY4/YBZgQaDnyGdmkRa2WWKeRZR4sM6+d/+8jJX7xDmWPWuyEnp2+LyExWD2/icbioP/7Oub5wFxYRY1wBzOfu7qgwH7rXD3SX1het6KhfukkG1SA4XzMmB1i1hcPni+vpm7P6uBpsspfW/ldFZh6T3JprWEdlrGtoEe+vLCQOEGA4XLBgo3GGi+bKBwg4HmGww0XzZQuMFA88JAMyBaLn8sI9aHDLQvi84MNC+60ijM0Wh0yIFfNiPjakCDhTTgZd9ZSMu0ulOKDenByumHmhGyN+M8wJdVgO+biTMy9tGFdFrIwkp7vmMNafGh5U2P6x6g6XyRVfKiGSEnXyK1x3K3ZvPS95XDmYmVejl3K+2G3K3g1dztlWbs5W41XMzdtsfzPHer6S1zt2req1tIPjOLmq+HxlquhsZar4fG2q6GxmUrNkNjpeuhsYWroXE5q5uhsaU3Do1HAwU6M9CWr4fGVm4Ija1eDY2vNGMvNDa8ITQ2uh4aVwvPmuZ2AtWDmfbN3udbZvH61h+mq/tuKyMFN1JYeFG8wYviZS+KN3hRvOxF8QYvijd4UbrsRfEGL0pv7EWfGSjAmYHSois12lZ/P18996K0cl+pRstkU4XTvIsW1gGRbLXU+dwVU7thR5Xw6o7qui+I5H057g6/2FMNKzstbqhl1ZL11ITD1GQ8b0laGckc1HoIKy8j3CuWGt1Sy+ke86oITLbhjvl0qRNDubzWiaHesNiJoV1d7bzWkL3lTgx0da96e1DPFzxxNbmXVzyAtiAHbO3cwJbHnkR+7hkO3vDlgMaFR81k6WBMDy3qAf3stA/MeV9WxlFq9b7Udn7jrw6XSp0GVtpjGxTQ0PtSzu/a1WlIP27MvtML7ZCJpRdHj+F6+hFXB0y7+UdM6WoCElcnTEneRtJbH9uDhSSwY9B0GNX/LqSsMlyzs54LecCN+AMNKeCPLGR4sDfHQio9WEi1LLdHy3hDIe3BQoCS3zh1UQjEt50cfm7JGkKLhqy8AFlOlUM89wJww1IqwuW1VIQbFlMRLq+m1u3Y9Wdww3oq5ssLqvXkbq6oYk5ve6j4zFLTeR6R77DUfN1S8x2Wmq9bar7DUvMdllquW2q+w1LLWy/+j5aaT5/PiOWG1X8sdyz/Y7lj/R/LHRsAsVzeAXilO7tbAPWGLYDX5mdzD6C+6R5ADpXMYPGhPYAcbZ2Yu/c8LaKWG7zz6kRo0zuvjqW2vXPFy955d0jr+dN/q3Op7SFt8fKQrk6mtoe0wf9sSBcPVK6OhHZPt+LqZGr7XCm2dsPBUlweT93w0AXYordHzXj60MWyiHwIvOeP6MfV6dQdD25AdJ/Mjx1bGS8fQUa4vp25OsvY387Ecnk785WGbG5nro6p9rYztwd1sZ25PKa6vJ15NA9YPGy/WvzLS92aqdL5UmZ1SrXt2Qkue/bVMdW2Z18dhmx69mU7dpcyq1Oq7aUM4eWlzHJyN5cyaXlKdcOi+2ipcL49lMINlprCZUtN4QZLTeGypa7bsWmpKdxgqSlcttT15O5aagxvu+h+Zqnnz1um1UtQu6ldisunpDefXEpxuVO18+jSaw3ZyzHT6rhqO8dMq+Oq3RxzGXmhNe9OPo28aXViBYHIZieGeN6d1YlVDLY7E2NoN3SnPpZIlDSzu1LK6ao7rU4Rtt1zypfd8/K1qF33nOpl97xsx657Xr0bte2eVy8mbbrn5eTuuufVWdUt7vloqe30ib20ekFqd080rc4ztvdE0/Itqd090QR3vGaa4PJ7pq90Z3NPNK2OrHb3RF+bn7090ZTj1T3R5csGvod/TCdebkek1QtTzR44wXhcbKYXRaySxWZO8bAx+7KI5Z2H5s8KQjy983K9IUaszqs2Y8TqTaXtGLE6r9qMEct27MaIcsMTK6lcfmJlPbm7MWJ1XnVLjDha6vkTSWl1urMdI1ZnVfsxYvna1HaMKHRHjFgdV23GiHV3dmPE6rBqO0a8Mj+bMaLmtzw3K2i/n6Egnb4rk+odrrVed631Dtdar7vWeodrbXe41nbdtdY7XOvqdapb9vEOlkpx8Ssj7rDUdt1S2x2W2q5barvDUvEOS8XrltrusFR88yTgYKnn7yMkvCMJwFuSALwlCcBbkgC6ngTgLUkA3ZEE4C1JAL1xEmC7rN1gTw/zVg9pANi9B62crzXXL1j5Y+eH34a2/YvI+E87zC1NaudPeq/sK5RkRnowjR8qAu1R8UCPtUL+pI6OBOBjRQQ/eI/xsY5Q8yLS1bF4tIhoD1V03xceLCJ5EfHyjDxaxN5bFcsifEaeBYUfKsKeg0gxXO3Io0VsvhwCcbnrf/7+wS/90/vfP3559rc1v3NZXz6+/+3TB/3457fPvx9++vX//54/mX+b8+8vf/3+4Y9vXz5wSf4HOvs/P2PfjsQCv7x7Av7Uk2hstX/i3zX6M/adBiz1l+/clv8A"
2348
+ "bytecode": "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",
2349
+ "debug_symbols": "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"
2414
2350
  },
2415
2351
  {
2416
2352
  "name": "sync_state",
@@ -2546,8 +2482,8 @@
2546
2482
  }
2547
2483
  }
2548
2484
  },
2549
- "bytecode": "H4sIAAAAAAAA/+29eYAcR3Uwvppj575ndmZ2Zm9JPjhtjGPAl3wDtiws+QNDgrS21pKwLMnalbENOF5ZkmVhHbsr2ZYNBDA+EjAQMNcXvpAfEBzAQyABTAhOICQQCIe5b/Jb2Ts1r7vqvarqqd7t9o7+am1PvXr97nr16lVweuquvxq/cctVa8cnRifGuqYm333O9k2bN2/acO7o5s2HZ///wOpNWzZsHps5NDX96cEu+t+SLulPug7NHDokBzTVdejQ7IwAtW8s/c3k/edu3TI+MTP5wHmbto9dNRGYfPClWybGNoxtv+/yF5wsB2ofv0Rr/C1vt4/v0pv/7ZPvOkbUqSSD89BlY5tHJzZdPxZ0+iUMQkgPQtfke47hsn50YvTcrdtuZJ/02F9ApAD0+y7Zev106w8BMODpr9rE4xTQpU+7dOmafNfqia3bpiyIAmA2/p17/wWbxjavnwX7xFXP33rbkbHfPPSaVxy64Y6NjYv/anX3D/75hb+9f+O3P/vxj//UPvA8NvBQ9j+f98RJ3//Nhz9/yov+bXr1J9b+17kvK3W96qPvv/Dou97x+i/YB57PBj62fuTbXzt81iVf2V9cddOzvvqJnf8aPTf/4bt/fum3X/LQ+psm7QMvYAOz73vplqte8r4XPf/w4ZuPu+zRuz73iV9/csefTW2b/tS9f/HIyj/YB14IKHjqKRIKLrmWk/GL2MQ/H3/8gc/v/+CnH5p48P47c19PHU08O/7nu3f/uPaj+j1P7r7PPvClbOJ3Xn6alHMcb16mNbzbPvzlDO0zPxJ89ca//u3WxIW3vu/1X/+XlTtS9dFPDuy9/9V/PzXwvbV77AMvZgP/+457/zzzvum3Dz6r8YvuCw/+YO3PXho+7euNN1Y/tfP333tyxj7wEjbwn179+yceyczcdMP+j73htOMLo++Zefwn33/08+/N/OxbD1/3+AvtA1fqyXjUPv5SvfFx+/hVbVrRV2iNXzJtH3+Z3vxZ+/jVOhI++88+fo3eeO77L9cbH7CP/z9aGsrj/0omeJPveuiJFfsbz//27+P7LhnddcML3vzPr/zhTZUHl/3X6x6uvydnH/gqNvA/Js6dmihfe+oPo/+4/6R31Pr+/ecPPvLdX944dtoPvvvfHx76mX3gFXocO9s+/tXNiSsnH/eibXd/sfiN44f/9ey/e89zD1d/vvT0b3z0onc8+dvP/lrAqtc0By6RTGkf+KcaGCdec/HF9vF/xkjFsYOe+LXIQA6AfeBaPRpz9nOdrue0jR/VG89J9ZWSD2/+C9sHXgUGLrl1ePyu2P4ll3xy53MeScY/+b0Vf3HOuY3P79o3kHnPX9gHrm8OPPH02JP377t5d9c3H/yfA7888eNnPyfXvyL33C/f+9Xalu2vqT5pHzim96l1+/ir9caH7OM3AFd3kj6nNipSmhu4SWtezu69TnFebuA1evTiJGSz3nguNrhWb3zEPn6L3viEffxWvfEp+/hteuPT9vHX6Y3P2Mdv1xtfsI8f1wrtBu3DJ7SGP8c+fIfW8Ofbh1+vNfwk+/DXaw0/2T78Bq3hK+zDb9Qafq59+E1aw8+zD3+Dntxw49+oNf0q+/A3aQ1fbR9+sx723Pg/15p+jX34Y7dojX8NN35Sa/yfceN3ao0f5cbfqjX+Sm78Lq3xV3Hjd2uNX8+N36M1fowbf5vW+Ku58Xu1xm/gxt+uNX4jN36f1vhN3Pg3a42/hht/h9b4zdz4/Vrjr+XGH9Aav4Ubf1Br/FZu/CGt8du48VNa47dz46e1xo9z42e0xk9w4w9rjd/BjT+iNf56bvydWuNfz42/S2v8Ddz4u7XG38iNP6o1/iZu/D1a49/Ajb9Xa/ybuPFvkSw3As0HbuRbFXOBt3Ej36aYDDz8wGVjEzu2b5l89wVbt49t2rDlWEb8yN+M3jQxdtXaHROb124Ym7h8YtPmTRM3zs4wMXbDxDe6ypMPXzJ27dbtN65Yv3772Pg4TLZjb8Lom270TQR9E0XfxNA3cfRNAn2TRN+k0Ddp9E0GfZNF3+TQN3n0TQF9U0TflNA3PegbXA4q6Jsq+qb3mGDNbtldu23z2NPC67f/WcJs6U9OPUUL5rsuP+nk0+i/yjE9dMi+GxZq7ShyW1hhvXXDs2c3YDdtGd1+4+ygS7cdYYDvm2X10xRpzgStwku3rH96R6u9XcEltslbU7Dp+W8O2KnRDVG7f3ZDbvuY5W1rRYPM1s3P1t2ajYC40zjEo8YhzhiHuMc4xF2mIU4YR/GAcYhTxiFOmoY4bhrgG30gjOb5cptxiAd98NX7jUPc5wOt3ut5HZxdWXvfx+xcjH7QD6y+2wc6aDycmE1met/eHvQBZ8xb8KOL0vTs84X02NZp4dZaUnXNyeZBV5xhQytOwWeGW9OrDwpJB0XomWBG7+FWRm/z1g2HDh2252Hmhr1s8i8vGhvdtmL79tEbIS+ehfx+nfj3ka7DXK5iNnk6ef/TP5wSvXyWOI9iH/J0JqPL+nl/a0lYrhqbZfGWDWtGN2wYW3/x1g3jhw5NI/hfhOajAtNkXgWXSC6P0q1bkKSdR+lecKmGzHjEwoxzR7eN79g8Nk0kjcUit2RaICUnIfKw5DCeWFRl/dzfV+EicbjdNKAD4q6afNfFW0fXi7NU3cdK2G38bhF2btKHn570qf9cuu0w+MF9l+zYLBzKw+2GDLN8IYFB9xwG9p8EMfkUnA5QrOJ+V9v5yzVta25u8l0v23HttqnH/g212A9dPCtRazaOboGavA5S5oFjIF56NTSmjfjdTcjfshueCGF4oq4bnihueCKGDE+U142Iq4Yn6rbhucA7hociLm94ovDRrtMR54YnQsGNKhseCEZueCLKhoc+t/LHpmo+aVrp1zUh/8yu9FFC6WOuK30MV/qoIaWP8XIZNaP0EbHSx9xW+vO8o/QUcXmlj8FHQjkjMqWPWJU+SsGNoXpKYBCTK31UovQRxeNx/zinmo0l6OIs6kTro414koEO29U+Rqh93HW1j+NqHzOk9nFeMmNm1D4qVvu422p/vnfUniIur/Zx+EioZ1Sm9lGr2scouHFUUwkM4nK1j0nUPqp4uHUn080ialydqH2sEXs3A122q32cUPuE62qfwNU+bkjtE7xkxs2ofUys9gm31f5c76g9RVxe7RPwkVDPmEztY1a1j1NwE6imEhgkELWPYfIpUB7FU/Rc/B1s6XVTa4/D6J+0GgSxeeJNQrIRexUDfqJVCf5lqUULLpmFP7phbK4+c/ycG9fccNHo+EZBktdxlHp+m3KrkkJNEmYu5bqZS+FmLmnIzKV4TUy6uqhJLaLohiIub+ZS8NFuQZLOFzVJCm5KeVEDwUgxeOD863aMbh4Xjo4LMwtLXtK2hnVNvmvN9tFj/UpEqmSkmDzioJS7U7A9fwXbNfRNHX3Th77pR98MoG8G0TdDnWLyBSgmt4Q0zdjlTMNp0WiJgV7RyYv6Pi/qoc2QTl6UAZtTsEsN626kwUBf1tnI9P1G5ss7G5nztZGpcWxrQZUl5J6y4Me2YDqaryO02Ez3jM5SHxodTTo26zFv0fCgMaLCMyavlHUM8ahxiDPGIe4xDnGXaYgTxlE8YBzilHGIk6YhjhtH8R7jEO/1/kcf8oEKmpfv3cYh7vPBV+9djOK40wfGccYH4miejnd4XxzN6+DBRRlETTtcwSujEUKW/W0e0omOoOtxJLenf0hnROeQzpJOjqeT4+nkeJwWq4cw+aTqVol/n+3+17+jat/oJux5hSKYTytWxQEY0CgK6uIiowz4o1b9+bBFf46d8jvnxjWjG5xUvbwS+fur5qHqpWMSfWcSX9UxiQuU9u7s75pWltgiih/c2d/VVRbV/d2Q9v4ujgFXImbRWN7vhhpL/rNtDaNKxGIdN9hxgx036HRl4OgYK31V0s8FiwqtvscXsED954aPxC35HQP9K8FFeypLny54+5iANvS/uK38/vktBb1+dPOm9aMTYyu2rH8qoXT+lut2jO0YW79y68TY+Owfz79+bMvE+KFDd2qr18XI3y9BIQUJE4Gq5J1uFDGyptJiOcjct3rHlfaFIFNXZFD2vU3hedqZQRFaRYtQtrHkf+fuemwkv2B3PTnC9eRddz153PXkDLmePG8dc2ZcT1bsevKLyPVQxOVdTx4+2q16DhBW5nqyVteTo+DmIcNI1wPBIK4ni8knRqAckvrJQJi8zuYagQzT2S9RaGRktModYxE0hgCKzRYUCFtQ1FPHy/VtQRG3BQVDtqDIi2vBjC3Ii21BcY2OLVijYQuAHGJvwi7aA15k843Ai5qRSqCqc4pX081kjbqZuHtuBpzivb9Nic5g0xZEEg2+28aGosVSzjFrKb8dWGyivlFDlYrS3cASYg2LFn3kRKvUCAzbvyRlTqBWGBWolHsClTInUGe7KVAn+UCgnodmVzegjUe4N4nWKg47zrvR/ibNbRwF+7HPqxH+ig+vavARjQfqXDqs1sKVJ1W9EfgZY+yZ9o/pI7RwwHWzPoBrYZ8hLRzgOdBHaOGgIbM+yE87CL/bxoYh+K7JrJfyWjgk1cIhfuIhqRYOI1o4BLHnRWu4EbhQg+7ADHVzsj9goYAtXB7ChJL7JSDyELIEGMC4bWdKDTUO9ZYO2970c8YhsAaVEYTqbN7rBDQfbAS+wEC/EgO9jKUoGCjw/cig5aIUBRhGYLW8EXgNSFGoy8QyaeKExmqZBUERXmsZXl/GqcXhVW+bXnXLR4owu0qOWR0RkWVwkSC0+Vcz4I9rqajMVNT5QQMQL7te1+GjurGUy8WAqlyILNdAI3AtoL5NiUfMOcUVRp3iiHtOcYRwissMhabLRHzGneJykVO8gXeKy6VOcTk/8XKppB+H6N5yWrGPawSu16D7YBOPK1CqkYI+SBvAZY3AzQoGEPnUAdrMzAKflJuZ5U7MzDIRx6A42MzMMosNsnn85ZgoU7HBciR8WIbGIsrhwxCMRW3vhmEsYXu3lA8u0LruAVlwcYXYLP4lA30QX2HagosrIHWwlZDEXBNY1RqBGXlwQS+1HDmRgoVsImrdJdetArkSqDnDbNDykSLM7pVjVkNEpEBr/Sw73ibX+qoTdtRU2VEV4/VO3Kfnm5NvIjIgnDaWCG3sgZGN7V0ZOlbbuwpU6GYGoYCR5HhUj0kvdHwj8D77xJaFD+5rOYSPEyAc+AddhAdpqZpF+ANyqTrBiS85nh90AsTL7kuOh48OPDkq3ie048lPaAQ+JtfpExDqL6UM7CzojzPQX59j/9zvg1AwbNc0h3Rj4eYcT/DiNwcyrMF5eQh3Isl5Qdr8RAXWH8cDXSpl/fEk65dCZRPqxqOA9XIV5DGsoRmLGvxk2zsqZTUCGcEFKuB7pKHKiNzEiRRipBH4MoFw3XHU1UT4h7oI12kTN4vw43ITt9SJiRsRySTAy27iRuCj+qq8LpXzpao5EdGqfGkj8G9yE7cUoX4/laCaBf0tBRPX16aJy+Imbkhq4pY6Sd0uIznfz5u4ZQqsH+aB9ktZP0Kyvh8qm1A3fiAwcT/UEHglEzfCp3LxoKgPMoJL9ILvaaV6udgSzyQVXN9eKeCZpKKhTFKB3PTjvrlmaHulJmI/+G6cyQXGrD/yulGXZpLqhFFEdbRP7i9E68u+RuD3/MLCmECtMCpQZfcEqmxOoM52UaCCCe8LVDCGros38GtfLH/Vg+6NV9AxVRgbSVe9hQdEPqRKx1eFRrCH+ZAn0fKATUTfqDxf9gTsGlc8AGjFlQ8AanGVL0C0ueICQMtWeYGorjw41HbhDHXGJY9KSvumJ2DU9OTdMz15M8WFyPUthUVUaEwRl6+EKVjsK14QrHt9S56CW4AMI7cJIBhkmyCKySdaLiYvNI4KqzaDJzGj9zO8Fo07shCVBvQFtSMLUbEpfqE8ZS+28hmLhIhAX8Qs42ka4paRfnCRXMFkoKTweBUbwdPhCsYmD0VeZFChLaAV30W8+E7AYIA6Vn6n+sVRYRFe8Bw5k6M8ZkUpJ0pqolcUY3UBxAqa7Q+1zPZVW7fdOGe3Dx064qBsu+CgoDuK290jZnusNxXkItIwOT96ELUS9iMtwq4f2zw2McZIO2O0In52I9Bxq4pFflCKOyoCUOPWLRZXiCq2k3NZ4yxcctLq5FXYYWGnAQ3W+akjSe4cuYsu0JE7D/VxcOfInW4krHrkLtr2kbsoJp9tHLmLCo/cBdeDI3cEIY45tTmCP/bW1ousi3qe7hytfWrClI6ep5wcp4simr7VRU3npKOqx6AaWjvWRexJZIk9iZxY3rrs8tYFcW4qzy+t+2PgN118UghghocY/UTRzQBRdDNIFN0MEUU3w0TRzYh4Ff1GnotZc9m0LGfYwRHgONo0gNfPLEiG26O2uOJ8KUPzpQhZzBK2M+d6jJTDbWfWkO3MkbTC1STH0zEPZV/URjBUZgu6N1P9YLIasXqUYGwW/sy9JmYOdqAWvIkZvj8QEylkM8xA75yI08eOcYg7jUM8ahzijHGIe4xD3GUa4oRxFA8YhzhlHOKkaYjjxgCyx4jxrz5oHOJhH0jPbu/y2r2PPuj9j97lA/nebxziIeMQ7/CB2zLvWvf5QHoOeF8J7/ABGfcahzjtfcbc5gPGTHmfjObN7U7vk9EX5nan923Zogz0/LAMNs+YO32gMeYZc7v3GTPjA8Oz1/tkvMc4RJ0bLOG1CspogPy0yYu7YmfrXdwVd3Bx19l6F3fNZcvD3+Gy5T2QHAjpenjS9RAczMKfYaXyS9reJDxDP1texbPlPYay5VWSVvhBrCpPR7bpiWfLhcc0cM7U5CbKMcSjxiHOGIe4xzjEXaYhThhH8YBxiFPGIU6ahjhuGuCNxr/5oHGI+41DPGQc4h0+UGrzhmefD6TngOd10AXhMU/Gvd4n420+IONhH/jB3R1WezKcGPeBH9zpfTL6wg/u9L6TGfeBKTvoA+HZ433G3OkDjTHPmNu9z5gZHxgeH0SO9xiHeK+zRJo6Gi4leaun6yV5aw6SvKfrJXmFldJvnecyftA8JK6Rv48RwmKpKcZAyu6iTIjJc1/zkEd6pQa28Raz6XuGvXPGwZX57m8zi+7snE8cvWRilXhLgDrlwzrkpF+hfsonC/FCN024c/4JDM+WVVE75y8S5moj9BF594GEUE+2QXpgqM01pzh2PI3/og1ijD7edocqyvrUOIEHLYjKKAl4gU8QAl+GP9NoAZTQ+86Y/m5Wwv0WQAJagRZAeEsrQeuvanPcRg2PXyUY0wG4yADOt7JrmdCVrR9UjJrQf2UOaid6Hntdc4M/9IQi1gAGwJtHINGIXMKAf5NjQRX6RDMMz8KfqYOsKLgwup1+xYKfoJ1+6LvadwjwwoF+U10kHDVKOOqN0P/gwoFf5WdtdTDH2x9heGF9uBKQ4KITxJGTGfCfULqbMqS7KfgzYr6coflyFnfXpgd2FgmniBPvaeK6g16iT3iM6BPu4BR9nknobvX4OgG/Fo+9+zk2pxXsd5pnc5pgcwL+DAMpbNyWbWkgrx/pRvcaVpYVo8qyEvgKg8qQUB/SwzUlgWVg4iY/FSLW1Yzpg/qxbg2PdSuGYt2ayKlgsa6lsyxH6rqCM6Ib3VIgS2hn2iVtr8jP1GdND86akiHWCCS9hLKmBlHrFNXZIHaK6jpFdZ7ZT7jJB9tl094Xbxd2b4/4wExM+QBHH5QIGd/T2zF/m4Sdkoxnmu+f9j6rOzV1nZq6Tk2dFsROTV2npq5TU6cDsVNT16mpcwjx+vmLv+nEnKNEq8kivZ4zkN+PIkV6Af0ivTN0ivQCXKK/1HpEE/0lkspUor+kAZJoul5SgNhDQByl9jfQDHmFgLiWg1iBj+qSxyBezUGswUf1LD6DeA0HsQ4fEYh9BMTNHMQ++IhA7CcgXstB7IePCMQBAuJKDuIAfLRvPIGdx6p444ltzq0juwg399LehxYNIBvZYM8wKyzBCP83A/4Bvt/tHHLtV4A5aOtMVIDF3asAiyPGWrMlfkxsgxOL6OqLhFZpcQI+2vUIFknLrr6IWa++iFNwE5Bh5NUXEAxy9UUMk0+MQHH51Rcxgc7GG+FPyi+Bi/MVurEW9TGWqVXoxoS1VOHPKFToyi6Bi4tB/wszUp/VEDf5JXBJ1SvRREXJyUa4QVwCl+RFBhXap5BnEelbIRAMcxF/AebIsJTqB4t4nGqE/1nO4xiPWVLKiJSa5CXFWD0+H3fAJRzc9Bab7zvgjmkKfiVPXG48ETl09Qq4mCtXwMWI6CXuevQSx6OXmKHoJU6eNMKrzuLkqkrnCriYPFhq7wq4ly/MFXCtjmI2KgahrZz71ZKfU5XDZUOVw2X4M2K+nKH5corzxQ3NF1ecL2VovpTifAlD8yXgz7QXcXNwrxAv4X7L3N/jOLazUTECdS02aJisGUYGDfGDhilaD8FHdUSq0pBiqRPsR/hBS+GH2LEfgY8OsB81in1VE/sqfLSZuqWE+1zmuvtchrvPpYbc5zIRsYws/ofFXmuZ24v/i72z+KeIyy/+l8FHe/wKJVgWvw5bF/9LKbjLIMPIxT8Egyz+hzH5xHFdZom13wYB2OmzVMG/LyXFmfLv8z+fhqlZrqfteX1Ts9x9U7OcpJWNGsdB1Dg6HgfNADLdcfx0xxGsASAL5kHGzIMsmgc5ZB5kyTzIHvMgK+ZB1syDrJsH2WceZL95kAPmQQ6aBzliHmTVPMikVtjsVmYDxB/i3js5s7mNnFrAVhUt22RLrCEym2xZ9vEL16FG94VE+hysC5G90yoRNgy7vkIZxsOGqqGwYZhMMdioMQJR49RgRMHVDZHTuZPgu1isBEMuJ/jUlSDdUgJu6x6QqbVBz4liABbUSIXhOD7liEt5SE/QrtKX8hAu5UFDUh7iiR5EpTwMUeOkPNwcdwM2WZifLEx4j7C0Ms4pQLxC3DHEncYhThmHOGMc4j4f0PEO74vjAeMQD/pAePYYgwjMvWkkp70vPbt8ID37fWDC7/CwhPvJhB/0vn0c94HwmCfjXu+TcbcP5Ht3J6DwpCkzT8YpH3gE4wEKfkGKh4yjD4Rn32J0gzt9YMru7tjvZ/qC0Eert1t9QEYfmDI/BLe3+UCrD/uA1d4PwCe8L4zmzfftPrA7PnAI0z5gjB/szh2L0O64YGzNRxNHfIDjlPdZbV6rzS/eDvkA4p75U8IA6MQ/9+MNzYdNgiqdwLFW9+0WHqznt/HnphQUNXTrwtYuaui2o9MNMUMLHiBip56CI3byple+6GNf/8RdGAu6eaZ2t5iKDIqQVRIcEaN6RLzS2r4eHHOLWN+EeCrOvQnDyefKujKf4zGL6GKmQ0UwC6ccjMYbnTGmeVUTEBWgDwjIPA8S9HJBD5cpX+aRF17mETkVFtbhnV/Qa000myll4c8wkOhVG3Nwt4k/5XT54TZBn5qsVKEEn1iHWDlqmIN8I7tWaqXwppPIOeAbMUXMMVViqqh5B1dzjif4fv9Mh5EP6xMRS0ZhQWuePkgTToz6FUgsUChw8xx+6DlPXBRTBxfFePMeJoA1IUmJRmS1ylFQDtuylJcJUW0owIps54KJdN49ka5KRbom+iIZGeoiuwhV1M7rugqveaA5VKRzPGEBPcGntC7N6nR16nR16nR1OobyQnZ1CkKYoq5OkeuYOfsShUZQRqun+oKwleBbIRDsGjWBKUjqaWNa3xQkcVOQMGQKkqRndsEUJFM6piDl5NxQHDEGW100BgtzA1yMuAEuIZa3Lru8iW5rS/5S/ba2OMTM9i4JMbO9A/1FBoiTI4P2d6AF1xBxO9wwEReMiM3LPp6Lmp2IuojrimMutl8K69sW37ZfihhaZKjc7KcNUpZAcQrwsbe4GKSG/RKkxqTLjyQZ2T50zubRq645Z+sNk4+s2jo+tmn91i0nrxrbfu2Oidlfbt0yDSkfgmYMzV7FtIK92PxEGoFFFmnEkUjD7UXHK72z6EiSSR+7HCbhI7E4iMsDacuiI0HBTaLrBAKDJLLoiGPyieP6FIla/41CCBq6mHL9stOU+7qYInURD8ZSvItKQz1BptO8czcNzaS64VWwJu12JEiKLU0sYPYwdkBN6Wnng7lVcuMkbnG2ovzp/yM6EgjyFRox74Km1mLzErXgy6MErwYWg+koxHanI8ErxUoQX5iOBDFi2xdVgjipBPJE1OeBEuANUGOsAeqn8U1rrhW0HPuoWivooAD3aCPyJdAKutMQWEVdVGLQKKYULsegF3gnBqWIy8egcfhIJHOjshg0ao1BYxTcOGQYGYPG+CiYaBseU0p8x5DEdwTC5HU21oh8i0h8AzQiat3L2X9DEIp7+YU1i2wTDLEFidU6tmC1k/g0hliDm+cz852bj8x3lMh8x/Uz3zlWkPUV9cx3DGKGpzP7ibBvgMiKDxILsSEiKz5MZMVHxPblt23Xx1GZ7yhn/C2LbyzK4fUzqpbOjbb9Nc5kspeXSVZAanszABG3vRuEkmJ7NwQlxfZuGEoK3vsswzeXbVkDfc1hpYzZjxKa4zWGXEAwJEAwJNIGgYZXqpsWS31pcxVxqdFVRMz5KiLWiFbxVUTcq5nsuHuZbHfLZ1zPZJ/v6Ux23GEm20z5DJnJVi+fSbpdPhOBMEVZi+gJauUzEXnWH8ukx/hwBrcFaT11PF/fFqRxW5AyZAsEqe2UGVuA5JrT5+nYgvNM1s+8YT5XEYX5CBCSxCoipe/qC8zV7zZTP5MmVhEZYhWRJVYROWIVkYfRpNCGrGjbp1MrhSS/VDK2ExcwuhOXdG8nLunqrnjK7VjiXO/EEhRx+VgiBR+p3WvNXfEkBTeFun8Cg5R8VzypFEsk5bFEXHivZ/QVIJZQDRQSRKBgUNGLi0zRkUVDqqCj6AWTgcL2+QwUKgtdaJvUDxQqTe0ZGVAPFFJEoFAgAoUiESiUiEChhwgUynSgkGpEN7pcTEtvB596CsR1bvyFqBnkUiHW8Q9RC6tZY7gZbAcrWFoIHKy7qmLgW5v5n+h9nejIdaPZiY7ajI50My2q0VGs7ego5kJ0hBiEP5dfP590cv18yvn187Mm+Vb51eQp4fXzEYuEiEDfyYzUHg1xi0g/uEQW6kSgpPB4lRrRfUS1WokXGVRoU2gki15iViLvn0dPMfSofrGIyT2N6CFH98+XpJzoURO9khirw/Nx/3xKPVAFVJzn++ePqQphmDRzr5YllYsX0MdduYB+ke8U4fF9kt/fTqkHv5obU+1Vg56LlETPzwX0szExccgmq0GoGFFbkKWtbroR/SuG0ENKW7lnisE83HYcTy2aUnx6Gde/kuv6V8L1L21I/0rkwYN21g8psdiXFlG9J0Vcfv1Qgo92D5jWCsUs64c0BbeE6RGFQQlZP6Qw+cRxLaH1lmkdX6ipDmuM7pSa8oVp0jlx39yjN+1qNG7lp+0h2FCG75o2/TOiFkVzqKNHfctOughVkCVnGWLPu45KI/ppTuOASBcMncwqWKgzz/NhhxXWoWmxdYyDX0IRQgjOoF+HChYyMtkquhX5+Ni5DKmvcCYGsLnYtM+i5dTXFNqhxdvsHbUG7x1VbIIMa2hdUS78pKoKYuIKpJz6qYSks8UuGA8tmIg/39ZLCAtt4s3i1NJ3FFhfdI/1aSnrk3TMpSwvFipzrAeCkcGAFpycj0yqno8siPnzE6KxZFxhaRKn3SSxNInP+3y4RW6auN/oVrExGFfoKk6BUpx4I/ZchtQfqAxMDrW7yUasS0H50u4pX9yJ8sWlypchla/AC0EGUk59iV1oU/kKFjER8Sfh3O7GaLsbSy+sy01KWZ+m98qUWW85fU+xPu/sICCGPsn6GO1yZ8Oqqpz1sQfEJp1gfKwRq7O9+oc1ZF1hm7LdZgQlJPO22mzmbbXjc9gpKdPpc9gpWt9nbfqwa80IFjT9HHMv/RxrP/3sqWYEFyxMMwK1HK+60ZV34xYQ1+KGyfPVQo/2goUNZuQeLePEoxVJOgmCmaIzyZYHMxnVYEbEn0wjdqbco2VIT8uZO0ARvNA8SdSWxeWBfZkgVUAjdilTwp2Gj6IVeOyihQ3XeqTCXRYlOxxkSMqk2a5AQjkIHFHhLqtmSET8KTdiq+XCXXYo3GXihEUPb4UApq1soXvHmBxECs/IY0yLqNAuTYbGpG0j9qCkpSJJ60ZZioKbxiJfchcM2ShLYvKJlobJO4KL685iG4kjjQCNoHxTESurSepsmmdcP6mQcX/TPOPapjliCzLun1RIeeGkQnGhjzSm9U8qFE2fVMhAzPBjiwPEscVB4tjiEBG9ik8qxG6Z3yONnVjCd7HEeZ1YwnuxBIpr2urLLUXiGrqYcV0XM+7rYobURdz8Zsidv7yz6dxKhKeRsGJhGpKmnCyn06rL6ZR49+NeIhEuOBrTcUmEGmQgatQGWFIj7+6eGjAfhbQOWhAlSDrpyptS7cqLLAb/Uqkrb5Il6I/TOCDjsKcwGwQBiXay3of30+rcDOG7myG83U9rkd4MgfWBRQtCAExRK/zYJ4jkk07vsQTaTyvu4olvB/20npH9cNzvp5VYNP204mbbZDjqp0UlnzzWT2s2Znm87U77VPLJTfvR6af19ISLKJbo9NNy2DFCEkskG7HvOuoYEXe2puJXJXGxdfofpx0jYtLF2h+by7DYjzTEzWAdKZJJ+SmRSdE7pogFdUQhhoDBAHVHdUYS0cs0Yr+WMznOY5Z2Vv/Ei15ajNXvF7ZjRMJJKwR3OkYcUxV5X2FHqwsXO0YkXOkYschzIfNRsuveNXosoPFYyW7rnq4iRqfovHfYj2edddhf0Fv0vH83D9L3LbGItpATWh32E/DRnQ77CSrPp95hP+F2h31Lo3tRFj8+qNZhPypf8WBb2J17ozcZ2x2Y99s28BhyHqyB0Mk8q20HQqWfEh1h9a+wes9xubOVpeu4VLeyYm1vZcUw+dTdypI4rkQj/hJ5+inhpGFp0nnD0mQjfpY8M5EUpp8s98sJQV/WjPnj52iIW7TNGoYolBRRWix+AZF+0ivYw4vg0HQb1bA06izhJhG9dCN+saOGpfKzxWk10ROnAeOr5iP9lPRDw9JjqkIYpnZC2WdUw9JFsPC+z+H19Z5qWHrewjQsxdNPUZZ+Qs99zv818fH1nWvihaFO55r4NqP4zjXxG1y6Jj4+0bkmfp49YueaeMcFaZ1r4jf57Jr4+H6Xr4nv3BLe9i3hjz2psbwPmlpEB8WL6LfgMWSG8BtZ12PILO43Mob8RlbUh8iI30COu2XdjiEv8k4MSRGXjyGz8NEeF8HTXrK4KG2NITMU3CxkGBlDQjBIDJnG5BOtvUJiSMvBXVHdVfw9RAypU/+WUW99nyVsgWaUcLm+LcjhtiBryBbk6IZv5m1Bbo2OLVjjJIbMoG/C87qJOetmvsJSlR+2i1bU3MnWnNGTrVFDopUmNikCbbvWrIYBzhIanoPvmsz6//icYa6J+kYNVcoBVRIPyiPWMGfRR0608o34J3R2sDUFaoVRgUq4J1AJcwJ1tpsC9QUfCNRj9i9hdyBuUL/gIt76KunVF4kV/KEkXISLrtvEIi7CeUMiLGgBmidEuGTIJgruQyrB78avVy4yEf6m6KYDmQgLr7iRiXAZEeEeiL2odWP83zToDnS4m4vLixYK2GLNHkwoqUueepD4uYhxG23uto63ONibAqdz8f9BZQShOpv3MuE9psm/ZKB/hPcGba7vGSjw/cigKrl5X6SwqjbiP5Vv3QtkoiLNOtBYVSwIivD6pby5aEVk9tulV87ykSLMfivHLIeISAVG2DzwXCP+B9DzVkdFZaYiJ7rMB+Bl1+scfFQ3lnK5KKrKhchyFRuJEN4gpMecU1xh1Cn2uOcUewinWDEU11VEfMadYlXgFBOCZlRVqVOs8hNXpZJeQ3SvSit2rZFIadCdXbaM3nFTIQW9RBvASiNRUjCAyKcWaTMzC7wiNzNVJ2amIuIYFAebmalYbJDN41cxUaZigyoSPlTQWEQ5fCjzgfkQKjKyIOEKoXlL7mKgl8qPmDJQ4CuxtZnE7BJYZRuJ4+VBQpboOOvQGaQtkidyBs+W60iajOizzjArWT5ShNnz5ZhlUREhtXeWHS+Qa++CsONPFNghrPXN0p+cbiRezEA/ia6+N/GZQ/aYJ3Z0C/zaHAQ/+G4v1Yi+DNbu/AdFGonz2s49Ufuw/M2elsoTtESNE5oIiC/sDhyWo6AgkdYCzJIKifNDRr2XUTtBUa1MlNKHZBW1leEPv0mkq6wIOb1SA9uo4k4YtsAVRMB513dk83gEnDMUAefJTB/eNjpP3kub1dnN0qTjcUbpmHWPjlnHdJwb99gt2GwF8j4ZAuJO4xCPGoc4YxziHuMQd5mGOGEcxQPGIU4ZhzhpGuK4aYBv9AEVD3pfvF1QwWkfQNznA63e63kdfOwOH6iMD8h4pw/k27zzv937jJnxQZznA/m+xzTEHcZRvNfZ+kEdDVimAUvoHm6V0G3eukFwRHBu2MvEtXP55Widq/D3hSWHBbV2p3G1dvDlcnGtG3aScL7TGPM9n8YNa20WsCmsoLPu37BGJVgDbdfAZrRKnXA25C0iMZdT+1uelXnpXlyeLMjBNB5JcectFoBLmxUaiY+jWd7W5ssndTPrDMZ14lzdNxjov59UP8Ur76ARdd5BI9pIfFa++RIVJievg1+OHVScy88eqywGij0HYYPwDFHiC23rNJW7znruDNEG4gxRmjxDZHs31Hrk2noPtx65nksjrUfuLrqlrcdAG2eWsh8lzizNqUXyUg1rGJGqBVYlw3zOZcIamcQ35dtfebKkWt225imXaqmRcev29Sx+QTWzv2GNiEtutIuiaBGwlbp9PcebbSpGAFi1jDpm+Je0bRcc7GlE8UgiYiiSiBK6EyC2LaM8J2KEfaGOUWg2XThRn44x949RxEidx7d4Yzwd4/I9jTh5ppyAuNM4xKPGIc4Yh7jHOMRdpiFOGEfxgHGIU8YhTpqGOG4a4JuMf/ObjUPcZxziIR9A3OcDjdnrefl2wTbu94HwmPcxd3uf1XcYh3hwMWrMbT5wrAe9r9XjPlDqu7z/0feYhrjDOIr3Ols0qaMRaXMj56VIR8cT9DZy4g42ck7Q3MhhuTD3FtgOEhULvsBupwVGBOvnuXja4cS0ioBj8LGdNoERazucKAU3BhlGnseBYJDzOBFMPhX3ONjfUxYjJNhASa6VN0YX3A0kz18r3g0UEW6iJK9S6JktLJ5PWSREBPp6ZqSu1hA3eTvuOHk+JAUlRXS1SvJ1RGN0vWtoViB9iYhLsgQMBqgjwxKqXxwR9uRPbpMzOeLkSsiE8yshZ7GamI/G6DEHbYci890Y/ZiqEIZJ3pAWE8SIm43Ro640Rl/k8YvmBgHkNKbYTsKl9hqjXyQOpCIL1hg91expiXYcqcuPQYrOa9cbyX32eS0tQvBT6T18eQB7ZOf2kvfpIlxqPYbFCO+Xb1z3OSmsq/OD+iBe9uixDh/Vd4FLUrfU186Z975G8rD8AGkfQn12OPsKMei7GOivo3v1PW3u1a/A9+qr0r36PifNDvpJzpd5w9WvwPoaD7QsZX2dZH0ZKptQN94JY0OpCpKnm/Eyg7r9nUUk8eZOVb4VAPgeaTOAitzEiZtAJN9HIJwjEM4TCBcYff9BF+EcbeJmEf7AgjSWyNGNJRCYJaIe2WFfo5zFWgq6ByU/JjdxVYT6Baouahb0xxVMXL5NE5fDTVyP1MQJOC9vclYjOV/gTVxNgfVloiIeZT3d0aVgsZYi3XhUYOL+QUPglUxchWizWCLKg3uIU79l0BTNHqWzSL4lRqeegotR7eNjXzzrG9//Bl//2ZSDBy4bm9ixfUu7E91+cih34IpLLnJ9oi9G/ufnn//MhkOuT/Sf0VXnBz50x4DrE33whc9+cepVy2+RTzRndef+3N2yN8Lln6UXhH1MoKUzzZ83kj+y2rFwCxPV9SWzcsIBMfuAYGuAZeZ46weWvydaqDU1+vs2qkRbMJqmyj44KsYubscujhnLJkD7gIRkQFJYN86miXE8STaS38HEK6y7TG9S7McIl4OG5PkX4YOPn/+1Nz/uuuLc/fOVL7y1MvJj+US8fwg0UqxbWvLXkxrXdQX06B7Tz80E3L+uK8C7uxiamwlC1Dj/z3QYPcsS5CcLEtuoHYCLDKBN3ELNN9w5kDA6pht9E0HfRNE3zCKva5qI9AXYZ6eIz+Y3ElPwEYGYJiCOchDT8BGBmCEgruUgZuCj+gEUBvFquoeS+mkQBnGro36peQLiNRzEPHwkGh7m6K1YEMYXka3YHPy1ylZsQdYLCyVBUThylcLIknDkqMLIHuHItQojy8KRVyuMrAhHXqMwsiocuVlhZK9w5LVwJHYsThBV1F2PKup4VFEzFFUI8oQ1NKrog6hx7qFP6m/6RLlY3N90AC4ygKJzzqnz7VIYaJkZvPNkTX5nROrP+PG4thdc1/aC+9eeCE47JlBtr0HUqBxiXiMxWSMkoSYVrQ7AZxRATLGvQZV3FVBeUYPd1JVEApdq25ggpD/JJn2DYtTGf9JWMbpj8s2gOrlIU9+brkOsyEtK1IPzQIsvjjY9A5BPok3P1Gb5ZlAAoT0TmpXiZNJWhc2gRJubQTF8M6jQyuapZ3wKUs7XRVwCNOH0sa7AeoGKJ6WsD5CsT1osgog/N/GbQbMKKLo4JnULb0qAYOFRQoHoT812rVNHdbU+L9H6W+VaXzKk9SWIlROtDxANElDWl0jWW0yykJ/75FqPXU5Wo7Q+30jtV9D6gntan5BqfZ6M0dTFJQ9pwml9SYH1ScKxo6zPk6y3eFUhf+4WaP1RwU97Gqm3mfL1RZGv/4hinkXN188K9TvkWt/jROtLopoBwteX4KNJX9/Tjq+f5edD7vn6dz8jfX2Prq/vUWB90VVfXxTz58MCrf+I8GK+1Mdd8PVsXzH1FV2tz0u0/hMLovV5R1rvyNf3tOPrZ7X+M859fVHi6z/7jPT1PaSvLzrTeoGvL7bp64tSX/9lgdZ/RVgZlvq6q77+Z6Z9/RMdX0/7+v90z9d/t+PrPe3rfyrQ+p8J63VTv3bT16dzpn397zq+nvT16YBrvj4d7vh6L/v6dJbX+rSos3FvI93jpq9PP8+wr09Xn+m+PtiOrw820oOu+fr0yDPS1wd1fX3Qo74+/VyB1j8Pp5Xt2taVrXc5Z8KZo+RnVjRfIO8+EHSiMglVlQkK+w+kFe4JDZCuIegMM4kLn8XsJXLMgg+IP5owo7OsOBO/v5SVl27iy0vZY4ovMGWPaaLpcoYvMmWP2Ulnd6IWQREqHsGG+O8EyONfEyUwjhOV4GGCehGCQjFDxf+pv//opd/69bbl8uJ/RLC6CTe6DRsUIQU+CCksumk1fblc4COyywW60S8SXS7A6p9Flwt0N9JXNDEaeT9abi2oYOpu74INhQqmbryCKWyogkkgAmFQbNJmB3K0HFt47y+urFH4rmkK1ovuh5EV10SddJ+LIdGU5TpiUV+k9JWo6WVlc2kU125k2lBLR4XyfC0DfQ1hLcP6xiGk4A9p8xCSmofrtM0DhNi0FELQE/KFRZQITgIawmwVWPxi7AgaZYfbjLIzeJTdLY2yBWTolmsJSYYQeXeATkubUCtaxP19hPDN3UD12nTBRz79nIt+/Iof9isfXBUJQUDLSuKVgAH4M/uRCxgjYz10cF+nafdD+r4ugvu6oCFfFyGzBrjLiZAXkQWcuRoKZMg8yDBaHCrgtqapuVKf2yGc2wFD3A6Rphy3DgJDxSIi/HKOMB1H4RB3God41DjEGeMQ9xiHuMs0xAnjKB4wDnHKOMRJ0xDHTQO8wQfi7QeF2W8c4iEf0HGfD7R6r+d10IWPPugDHHd5X63Ns3q3D3Rw2gesNi/gR3zgZcxHKHd7X2V8YMvMf/Q9piHuMI7ivd6n4iEfCKMfotsDPvhq837QfDLhjk4sulhUZrrjWD350X4IRf1gbqd8YG53eZ+OPogcr1+MkeNtPjATU94n47QPLJkPGOOCbdzr/RjKD+J4hw/EcTE6rdfPn9MKOalyCpPVE46uYH2Z+O6o0Cjy+7Xi34eD+lewjupcwRrkqndANU23RkF5gOBbN/yZRrGGZnXMCfrFGkH3izWCOsUaljJEjo6sPOzPNcQ/RDCGvXvsduMQ9xmHOG0a4rhxFHcZh3jQOMQDxiHOGIc4ZRziTh/wesb7Ar7bBwK+ZzFangM+YIwP5Puw92XHvHybJ+MhH3gE8wHKER94rZnFKI6L0jjOpx8MgsOJcz/e0HzYJDzEm/lc28X5J7p4pPFE/bUkdQ43jK8zuxXP44SS337te797N+qgBIfa5AebIvRCvs3Lw49Hj4DZDocJTjPPvQnDyeeOfYlEJ6KLmQ4VwSyC3MYcphudMaZ5ugqICtAHoRBG7EIYbFHLQrxo6weWv8dadJ87Lpb5J+z6wSj7ZPvgbjF2UTt26CHUJkD7gJhkQFx4hppNE+Eu2os3Ml+gLovL/IrR4XEdm6KZIsrq25SA+8ekA3QOts2cXEYjLWa5iQ7v2BVgzPoPXh0TUnVM8BPLmyslkXO5CYg9L1rJRuab6MVk7QvUCqMCFXVPoKLmBOpsNwXqxz4QqB+q36jHjPg69XvzYuiYeGvMHL2yV2OfR91ydxl9y539dG8WviRvZwNX22WR29nS8NcWYNg1IgItzbhu9jO4liYNaang1sAkoaVZQ2ZfcLVgFn43ft92hkmdIArLSbVUcANhTqqlWIfBHMRe1MMuix9KXof2A+TepFpvmt+O3iuZkbWkE3WOyDSyMww0enlj3t5s6zqoUMigAtksI01hVWhki/JmWwITI+9KWVBtaZUW41VR6Eopcgft0ith+UgRZnU5ZglZr9KbhX28sgPy5iKUvQ9oOM40xMruJhLwUd2syaUirSoVGQGB0o3sckB7mwpnCT+Sdj3aS+N+JGvIj6RFBh33I3lD0V5exGfw3XjrzzQzeCfxfqQg9SOCe/HkXRqx238KtFoXG9nnadA908TjCpRqpKBnaPM369X+xHlT3jRlZGZBv1huZApOjExexC8oDDo3BRcwQaYCzQISi+bRwFY5dMjxAcK5qMDIAoQrxMZtCwN9Ab7iswUIV8CvdGh0aaxe5ihAkHfjzKt240Q0ZKWjbpwZhQBBWXcDYswuk2MmFZGbxcy43KUAIU4GCHxb4zh8dFCO5TBAkPRonSXQnypIxQPinpME5QON7No2O6EmiT2LFNHnM+GwE2oOpA6eQd1OEZ7ibcJJt19qZCfss1oSF3hwkyX6mrdov18X4QwlhrPovn5B+ppnHPU1pwInh7cZSAKnnkb2ZrkB6EFzDYQnnAU9qdDXPNtmx8UV7fQ173ESMZdJzuf4yL2swPoikQNyeEFlDqqaUDfu4PuaEwpIeifcYpbs7ywiya1JASPwhFtRHlPm5QYOiZOOEggnCISTBMIphvAHdBFOSFYnb1mQ1UmCXp2op0ASbSbGEhZbKUo/3Sc3cAWE9ilJLvABBQOXbNPAZXEDl5UauAKZAlG3RQVIE87AFRVYL0hyp9pc8qQstlKkG38tMHAf0BB4JQNHXeGU4Tdv8IAoJQqIUtSWVEgjkkiTZVTgZ2orMLa6f6gVmQoXGP/IPuVvdXayQu3t6ihkIEPu72SF9HayNOsmUFYJz66B78YDeFZ1k/0sLyVpaQaSFjvN7aE0LVqzG0SPovvAG9CdrI0KO1k/4HQuo6BzGSJ6p3UuM+/ztb9xjLmiLuLaqxAaoa8Sq2+XXX27LER72ranX2H1veA3XYT5RT1ViqUMofxJPFVG5KnYIJkgf0ueMgwLze82KMcYaqLbOcItTRFi9J2299m7+O7sUFpEruK/GUtXamzMgc705LYcZis2Ab0n9OKdl58m/eYXtE010b1z8Uaui+H4pE4VYFxv8pS+E427XwUY16sCTOgSXKd2Cnw3blnijFm/481wUupEk2TQgBkt9Oo56AI50Uo1sr9RL9pKc66y+PnJh59G6KmNpEu3HYbx9CU7NiO6iA4qWAfl4SB+x/bp7Sspj3P4fMVjxh46JDA1N19BT7S4zEcJdZJluJiyvas0R71a30kW2CVLH1R3knmIF8EpC+XYrtjr8CEllLkFQozm3JeAjBuV5YjdDHqlcKGYqzUFOpdvuzDAGdsL+szNM+Z+Q525OTg7Hj43ybF0gchR9BI5NgFyoBLXY5W4HHzkaFjWCiuu4wFUFE1fQBxPPMq+6AT8i+Kc5hWlzqsqCjbjVLBZbeSe0+Tc0jzKA0F0U9UTxDP1o5sqHt3EDUU3Vd7bx1ve3kaNXogaF1r0NsehPTh6+cl6iSUje4f34HAMcY9piOM++Oh9xiEeMA5xxvuMuafDam+yGm9+5R3h2W0c4kHvG0f8eLR3GHPAB4zxgXHc7QNp3O8DVh/wvg66YMCnjEPc6YOv9kEwOuODmMcHrPZDMHrXYgzL9nVCnk7I4xW7M+5hYWSPZeNIHvaBR5hywfmjGdAylwEFlb4FQTKz3Mh9uu1E5Qo+7YcnQWuun9Ss2dGpQczQBGlNsXnUPdfc93dfrQQvwvha4/laa/EVGVQns6ocEfv0iHgGWuxZR5tH1dDmUX1U86i6LmY6VASzcPoB3lacsYYCmTMPsugMJNfkypJj53ZG58ZtQDe1WAeS/EVUPYbKts9atFyq/c2Qk4xuhhTc2wwB5zE6myELGMDsMg7xDh9EG+ZXJfu9LzwGU4jA8i3KiHpqMS7HOttzne25Th5oYWVnUeaB/JAj90Go1/GsXuWMea2+zfsffddijHjc2APSKPQEac6isII0fz5V1KqUBTjFvqCvEumNXl3Y2umNXjK/gKY+ehXTnO+7ofe6db+rDDvjq3pqq0CkOTWTic9H05w1NM3Zi6Y561Sas6aLmQ4VwSyUj6qYd3s58yCLzkByac4q1FsszbmJT3OCb2slOkVnKvIr2Q9epn5OF3TLxZKfrQzrFcSpEXYeqjns1fAr7lu5FYofbGBwrHKdKPI/duiFIQIg2lvogbMMeXmXveLcT4hzSpbTBWVoqlWPJOQhvsTJmVk5EpKmhzgggR+rSAB2CT3JNewHr0EF0WtnG/PunW3MEwY8aehso/CIIfhuvDEFO9uYv5o3U6mWZiATp/iJU1Ivl0O7swDsedHKNfLr0TYAG/huZHNv1rGzjY9a79f9WOt+3Q1jE6s3jm4fW7967KrtYxNT9ptzWypju9P2CPrLGPomh74pIDf2bkBHBI5Y8VH5H9izOsn2C2wTTKCuOdf7eeRwdS0ZUldBE5sSoa4FQ/08hI19wXfjx+haTvr1or5kMnUVtDorS9W1gqir5bAjr66VRn4Hd4A/B1VcnSk5IpZKWqgzz/NhDpQZnfykrhWMW0ypwAoOs8Ot+V2UjKpsSXfptPDRWw8u+aC+ypfdb+FTFrlKXOUret+MNqOq8NNWiIjdEs03uX2IF8YqZLz6JnxVqvS9iHRWIf68dPY28gc4JVTpl0hbJu67S/Bn7QpqV7ts7xpot35jVnBwUyLtxJ2/V5eNEiPT2xj6FgP+Nv7jSiqnlf/4qw8dh/Y+aD8lFHaSEkLNS8WQeekV6TmTY6rwjqqFKpkvr+oxBlIWdDgF+NhbdOLRBZWe0rxIjzp9QRD70DmbR6+65pytN0w+smrr+Nim9Vu3nLxqbPu1OyZmf7l1yzTU+hBkQ0jDlbH5+JZNFfjo2JAc72IJrQNRqKnlj9sRhRqZ/rNRow5R4zSqrmBIBAW2dUJJ6wqGRBukzJA4BahnSBZUekrzIj3q9HVmSGrQkNRDGtaOMCS9FmeJc202q6G/7KEEQnOXZUhfIOruC0RdL9OhWUA/CKTjwTVbLxtdv+mGI8hKR2RD+iz2yzBvK17lbcU93lbmjbe9WrzFerW2H9ANGQ3oUu4FdCmCNTVd1jg6HdJLhA+9bNn3XdLrF5w5aWRQH7JMtcQ1/DK1r5H/r7YFZ1AhifcDlNDo+noOxmUCtGuNob9loH/ssBfYbFB8Ar+eNGbpwkYtXc09S1dDg+I+iBony33QWGJiyU/XRwScfQpBsTZIWVDsFCAfFFe8Kj2VeZEedfpWHAXFdRgU94U0THcFD4prZOCkakhO5B0CLgp9rotCHy4KdUOi0Ed6KRs1+iFqnEb1KxiSfn66fkJJ+xUMiTZImSFxCpA3JD2E9FRcl54KLj09hqSn4ijG4Qf1ODIkFTVDUiHm003T1dtbgfWYMydDRs1Jj3vmpIcI8/uNrsBqwhVYn9Cc1I3ztuZV3tbc421t3nhb0eKtRlKr7Dpryu4ntcp6Sa2KLmvM7OXX4bu5ZV/hNG+trivC1XXhVPnauHA6yh0na+NyY+heBvosyk2ltNiDBzIp+DP3IpmcXyKZHnP5qayz/FSF0KAKE45L/JCfKrycL+bzqEiV3ROpsk9E6tW+EKlXKRjl1+oWc5JGudIYupmBHqWSEKYKVUrwZxqbBjXXNajm/qZBTW/ToG5Ig4RijLPBsq/TFI6tZFa04CyJiSUsEFG25H15Ye5vFK7VSX0uqEhV3BOpik9E6o2+EKmbFIzyLaZ3kUYZ6Fspo2yq1K/Hwh58vrKh+cqK883396UMzZdSnM9Uv76KR78vaWi+JGFaSl618C5WfJV8YuHv84WFf4eChX/QtIVfzUD/lYub/Q4kesE3+9tNNme1xAp8N745WGfM+hC5p1dwtgWHDBpARMuya8kL10Cj8EEFif4Yyh0nEl1vDJ3PQH98Hvfp1QmeQreBBwmFG3Jd4YZwhRs0pHDDPDUGAQnh2emPtM5Orx+7avuN2yZWjI2fdPJpM+hJ5YHJv7xobHTbiu3bR28ERB3OoiOGZoQnlu9/GsSU4OVpWe6Pxz7nsHjqehY5bn2Z+Pd9WfHf+7OHHSAlGSIBKFLnzzHNelS9P0eJV/kfcrFaHQqEoyQYZw4H4c80TcxQE+6o0MQUvss+5Yse/RRGc/hNok/5qvwG9Tqhtauo769zDUz6sAiCN3gDhvbS+oWEWQknEkZjT7ArRokjLas3bkbiw5WKaVlGR5JRs0nZb8kZ1Ucwik+q9sFHO6P6sbAHTfu+89LtaJTej2ZY2UW5he+jv9mAJtPW4aMt50/xnkQVYJREvWYKP2U/+HFbCP5aT3FfAbG19R6CSnTMXyGAU8d6+Vhu1e2D5LFzPK7N8WPw7aEZwLr15aJb5IusL0zhtzpLab0U+JIZ/Tgo5f5SOuVmWcGSaWdlBSmiRUCKtbgJz2OLgD5nLQL6GsWgenxS53S1+Cw+qYALZL/rAtmPC2SfIYHsp2u82/PNuEAO8NMOEF5jEL5rMqtExkuoQA7SSxHxoCFEIAfpaGKoUSygzqMldlXdlFKq5S1EIczQCxjoul509AqoYBjvRPe297fUTLSCKA7xsqS5tuxijQl5RRkk2pBVCOvWx+i0VNcUkSzoawwtZ6CPU++FV4JYKpQVzBosUexSPIP94Dk6+5Fx1y1a3P39yLjefmTJkEUriTw7+G6u/AtGZHPMOo3cOEItWg9ZaaVZQtdjiUwERXTFU9XD4Spv6y7U4FvJSWpO3nWsn6SXhr4MuK4vA+7rywCd3WwvNZcS57UGGrOKhI2p6ifnjoHTSM/FqenrZlN0GGptJelayiRcYV3BfvBSnRWWZh80B21Sk+6vsJJ6KyzNwqqkxsLO0nMUb3qbZMxaw5t/0OMYmZhuMYgMKiDGP2cx6pxoFRrFy9TXVz288f8UlYsydVa2An/W/iEK1Gyet+l6dHXaj68+uNzJgMKwvmPNpNHZ8BToXKiOEG+dcPVQHGf8ukqnxHhBzUfZPfNBlRjnDJkPoRbj5qMgMh9beFUoSM2HsF+szHxglb6WTrOiWt/iZvXYUZCe+YT9N0OEOI64Lo4juDgOGRLHEZ49Q4Q4LjUkjkv5aZfC77axYRl812TWzbw4LpOK4zJ+4mVScVyOiOMyiD0vjssbxTdy/mhEwR8JmDKi5o9GcJCUN+mlOK3Si3clD2CZFoBv8QCWawF4Ow/gOC0AJ/AAjtcC8FEewAlaAATX2JyoBeDDPIBnaQGY5AE8WwvAq3gAz9ECcDwP4LlaAP6bB/A8LQCCq5KfrwXgYzyAk7QATPEATtYC8AsewAu0AMzwAE7RAvAkD+CFWgAE/vZUlY4g4pbIf6I1dwDdpFlHVNBxMdQADFbw/QauznSYj0vehkaT8pLQEYFnSjYGdzDg76BOqg5p7fjhPmpIwe1VhIuJYfpTZmO+j7BPeZBfBuPxW8X1+I04sZgzFL9VyNV5uzezJ7U2XcF349eXtbYWPkDcEIfGb86uJkO0xHKrmqiGufh+9I6BDfySiVPbv0FHU5cUDRGLsWEcNpUNKhOmyHJKFF0IKRa9lIltiDrI0nBX4YCJuHuXwETcRTlgotZVObZfheBEtndhOJHtXRpO1IT+ec5axiE09b2HOGEtwwQ94oRJS+ipd0DfpCVwkxY3ZNISJK04jQKoUadquilqqUQFzxZYiFCjtIVJxtc4yQjAL0C+NsB/bYCQjDj8mY0WAUIygnrMuUBfMoK4ZAQMSUaQpBWu9UGejqHmuMfQk40hfrYQwZkWxJ3GIR41DnHGOMQ9xiHuMg1xwjiKB4xDnDIOcdI0xHHTAG80/s0HjUM8bBziHcYh7vY8p11QmIPet43j3ue0H8y3C7bxbuMQDy1GcdzvA3Gc9gFE85HjXu9zZtwHlmefD+zE7T5QwinvW0cXvvquxegTbvOB8Bz0vicc94HG3OX9j77HNMQdxlG81xhE9pjwPmP2+SDk8cOidcoHnDkwf7ymU8XqaICdB8tJhYdbJxU2b91w6NBhpB/HS8VF/cHzkd+vEv8+tOSwqFCfrOI/X+1YwNNVFUua2xiDS8T7HNe1XZvaRZyv42+/B1YsbEhswvBn8z0fBlJY85BuQl0nZsZkk1ulm1DAsq4daTHoN8mbQQiOIoRb8msnbAo+4vvhzQ/apb7jzkp7N4LRomKX0j72gz38NhEGntVRrOa3pNmbJty3Tz78NLGe0qZLtx1u/brEOCFA/c8ECJcapSkGeL+DCoTV/D45h/BbuDYNPRC9lmafegr3yxIY9LT54H5ShL+2AEPp1HPsCIJQbkqCYzXNYrClX/2/kV/91cHQB7725NbX/+LEmc9duP9v3336dOM5Z96y+tt3/ugSgi/HTkogn0/QpkTTJiWnTQEltFw93kJsc1KHgApEWUURSPH9bXbrj4mtyofYFPehsinYtQ61V67UBEzsWofwXeuioV1rgdcoAq9hnzasNy0a4odFVhp8N17sEmLMei/v1NIto4tMnOYnTktDrxxSopW2+BhOtHKN0nscOIzV6qaTbzJW+qVnggfCEY9SSKIQywTEtRzEMnxUL1BkEK+mr/JSrz1kEK/hIFbho3pRIYO4mb7MG6s4JCBeS9+EiECsExBX0q3S1E89hqHdJ7t6YecBCSwv5SD2w0f0GCQOcQsHcQA+oickqe/OcjAH4aOG8wq77rzC7juvMOm8uNNyADWqBBy1P0P0cTQCZNk8yIp5kFXzIHvNg6yZB1k3D7LPPMh+8yAHzINET2OX+EPc6dbCHAsi3tuMvEAmgg2CgESB/Q+b6YLkF/QyEVtgiIUZH1EjKLBg5zEKN0o/5S1x2lyiKq1e0g9WgjmipD+vFlcWDcWVRcvPBMmSnv0Mod89gyqaz+tUNHcqmvUgdiqaOxXNnYpmDYidiuZORbNnOO2LiuaDi5GOnfrjTv3xM1ocD/nAs5pntR/qhTrVwp1q4U618MJqTKdauFMt3KkWXljD06kW9lW18LnuVwufa65aeHYP4VDbtVxdxCaMQjXtqae0/oqX/YRbwFV3BxiD0b2BsKG9gSRR+RDgigpBq5vCXN0hVp8lqwxG9+NyRDEAX/ibg48IxLzsyjoUlwKBC1/7VICPWO2TEJdRBVwqBC5r6RonokObSlOiFwt3ZfvYpVo973SoKms4tCNQDBGgEZ4QEcIyhy0/E3xIjV000POQww+5XAi48u8M8LvRfUwgD0LQ/4dTQhBMzRUoExaHY3236927ut23Wt2k1bJRIwJR48QjAglL+BMVRXkuRW4VAM8TyFGgUf4Sk6OPCn4QbJQb7Af/l9pNDxvaTQ/Dn92Pb1urfDJ3FUOQEN6Invzs0hfeCC68QUPCK7BfQVR4oxA1jhFRFnWi2/FRfrYowdqoPHfnGOJR4xBnjEPcYxziLtMQJ4yjeMA4xCnjECdNQxw3BhBYvkUoji7guM84xCM++Ord3pVw94TnsHGI0z7wMgeNQ9zvfeHZ7wMdnPYBRPOB2V7vc8a8ON7pA7dl3vLc7n3GmP/ou41DPLQYNWbfYgx57jENcYdxFO/1PhVv9UHgOON9Mh7wfiQ67n2X5UIEdcD7phEv7/NQ/D21GL3gtPc/epf3DY8LOnibD4Rnrw8865QPLI85e8seE4vRmO1djEGPCxK+zwd03GteZ0Ke15k3+cCY+SCZYD6qn/EBxEMeDh7ZY9U8yG4vgzQfArjnaHb5QYCMG/FOMYrnxMdFZh/wASHNM/tOH1gf82Hum/3gGHyQ53IBoh/EZ9oH4vN6DKCg6hYUgiKDqHasZg8EBWZ3bVw/ETQ7h7EjQcFG+YtUOfIxwG0dCQqA6X1WZn0J1dtMBcBL+bJ6RiAOdFSP5vbaziZgRi6eFVG8TjtiqE5boO/gnImNGjGIGsfJGDNYaJ12jJ8tRshGTB4aO4Z41DjEGeMQ9xiHuMs0xAnjKB4wDnHKOMRJ0xDHjQEEptP74jjtA4jmTc9e73Nm3AfW8W7jEA8tJsY81AqRDON4k/el8R7TEHcYR/Fe71Nxn/fNtx8++sBitN63L0YnOOX9j3YhgtrjAzoe8cFX716MAr7T++Z2cQb0txqHeNj7bqsTQ3lUBQ8uRtnxQzixywes3usDATdvJ44uqpCHPSYWo0/wg4Qf9IF99MHi3yCv2WPI8zrzJh8YMx8E9bd7P4xyAaL5vP+0eR2smgfZ7WWQ5kMA9xzNLj8IkHEj3qnK8Jz4uMjsAz4gpHlm37kow9w3+8Ex+GFbYWpRis+0L0KVDAYyQNZEIoMEFx+4VrJ8i17JctBJyfItTkuWbTWjmSZyggrasl4R6/E22jcBM8qzmcAMaAVtxlAFbZlnfKbFeBs1qhA1TjirTIPQCtoqP1uVEPeqPFZzDPGocYgzxiHuMQ5xl2mIE8ZRPGAc4pRxiJOmIY6bBvhGH1DxoPfF2wUVnPYBxH0+0Oq9ntdBPDPnISU0z+ojPvD+PvDV495H0QVW7/GB5ZnxPqv3+8DJ7OUOaJbh6lN9wVImpgvDnzlaA6l/drsr5peJF8Dl45DfrxP/vtqlv2A+Tme93MUxDlC5iBEsTBKMY1zR8jPuIHG+UX1Nc9lePYO/kgdftmtecJXQX7aH8WV71NCyXUDMKLpsT0LUOEInm+M2YpMJLiBMEpzrAOwA9BhA7P6yDfY3oZZtxc7Sc9BSrTFNg3QvdyNgBuJlsbH2XwJbmpm7O5C4XjBsA7bghjndqF51DOHNm6ca6ZXzjpA6SHYz59UUkmENYWQQr+EgJuEjAjFNQNzMQUzDRwRihoB4LQcxAx8RiHkCIs/sPHxUD74AQ3uoGLGsEZsxLC/lIFbhIwKxl4C4hYPYCx81QpOi66FJ0f3QpKgTmtQgapxmg7cFbLoaP12NMBYAZMU8yLB5kEnzINPmQWbMg8ybB1k2D7JqHmQvBjJ13+odV1pBlpogV6Ge773N24ub1yO/QHy/Nu/Kw43qTNOVJ7+ATiC8LvtSGB9hLnTuxuZ3Xn6SwNNvEN4oX72bN5tpc+2j0miouIm4szgHAz88logaCniidAQWbPS+mCH0dqoLVlyjhoDqghWHP7ORKUD4O83rei/S93dB3N8FDPm7IEkrbn0BUOPoyFYf+A66oLdciOBMSJ5DdwzxqHGIM8Yh7jEOcZdpiBPGUTxgHOKUcYiTpiGOmwZ4o/FvPmgc4mHjEO8wDnG35zntgsIc9L5tHPc+p/1gvl1gtQ/oaF54DvnAae0zDvGID+I8H0Rl4z6wPEd8gOOBxei29vuAMdM+gGje8uxdjJbnNh84woPeV8JxH/jBu7z/0feYhrjDOIr3GoPIHhPeZ8w+H1hbP6yr/bBKODB/vKaz2epoxMEgg6cHgxe6f9/JhSavO+k9g9/2SJjbr0pw2zvB1mNUg8lBQmyi8Gf2WiQwX2iuXMm25xFv4c2RIqRHipT+DlAI3wGKG9oBosXfRo0ERI0jNXgbwaZL8NMlCO4lIK9MgZx7t7EDsAPwmQnQbldDCnZV0x2r3NAYspu20dY7tLAiQdR8jFpw4zxWotE7xmo+voxOYK35YH/PKnyRsOqDEV5c9dG7iZWU7rQbVFYpsa7pinuv0cU7DIkqIkrtTAacL/dLQLtvRhDjCmuRBCFtaDlQUiQaDwmXQEJG7ADCYQ8FQJFrYi4UePhpLJ76z6XbDkPkL9mxGQ6dQ/y1/OEFPHrQLPwJ6UcPaTx6SBqKHtJkVTvXjwKgxklNRmoPBRXBGUIM3QRo+7I0wWfNZhdhfT5ncD6nDfFZQKk0yuccRI2jYk7Klhw/WY5gix8AAsvEhdSMoaqMVwqXk4Qtan+iJJQDXBnanyjdcpB4d5v2p8m0XDinwLmn3QGtPHcmPym4AjOvp35l+zeyw6FdRDcbTqR6CSmoEYyrQ3rY3vVBaRbSu8tO7y5IhznHu7QyB5j/TRcXmuQUQhNNTYzDn8ljsXej08pjMVGAmmvUljPg76XCdLQmPSyKQENUBBpu9H6QF824uTxOvO3UiJcEX1u4Q0y4L9cQbku0StRdJ7mXcTKMolM09GnatIWnqI3cRH1MUqNOHET85Ck2jZycZnoyoB9tJdzPySXUU9KPtFLSG8Ymzh3dNr5j8yzTbHlmQHFhpjmxZFqQTD4JSxsfRuEHkAz3JWjmG4MUO2ydVPw/a5bb+hMHxF1FLY8T3JoRaGJItmYMWdeMcQpuAjOkFAYJ+XnbuG1TgFMeFun806t//8QjmZmbbtj/sTecdnxh9D0zj//k+49+/r2Zn33r4esePxX/zKdOlgq/JE4ZMjQrFSdVgcpKzf986iCjuMDFFSAmCIijtAirr+MZxLWmju8yiFc7Or6bJSDyh5az8FE9eGQQN1PhaA6DmCcgXuvoiHGBgMgfWi7ARwSi8Iwre+QPLRfhIwKzRGDJH1ouwUe7vQK4pMR7cinC//foueCcvv/vwf1/ypD/7+GpmUKzLWWIGmegytA3I9NpdiUCIIPmQUbMg4ybB5kwDzJtHmTGPMiseZA58yDz5kEWzIMsmgdZMg8yah5k2DzIbo1ykZR8LTXO1lKCKh9gUbE3SaQCKOt0vSNeiWXVljxBJ5ttYdXNtqAw51SrEZttcLTYxwcJHx92fY1PNEELutcELYj6+G6IGqcG3ZCw6rv7QdfUgC36kbI2s0qwxParVk0bEW/HNSL4vFpCOS9O+D4LNJRynk3OioE/lynZ4xofBJNJyiujPMSLXBt1tkHa2gZRZ0m4ZcS5vQyAp3Q3I0HU6YS1ijH48eJSjNo50Dvg/cbQ4EOznV4U/gwDiWohW8gKP+UiuQ5S6ZWAxiemKR1UatOGfGOCtjTpRm0l+EqL7AahXWmq/tw77QrZ5hxPoJvKYWclCupKlYFUobbykxrpOSVNTfAbHeBTWvVhtl9lzaVDnmc0HZJ1Lx2SRUOlKkSNY1/nmhfTEDvXvBiB2LnmxZtU7Fzz4lWInWtejKB4yAd+cMoHfnCfD+h4h/fF8YAPLPiivH+ncx2UV7V6UYqjP+8I6mk9hjVWuz3EdGH4M0cLaPXPdumOoJ7nun9H0HO9fUcQBhJJ17HO2WvFe28/bmaLap/xxK0atc8v4K0aovuXal/0FELlRu0rC4hQuzusVT4Jh23YWO5M4DZemFRrb62E2dbKw8TWCldIBvBC08p43/q1WnvnbBAEJNLe/3Tat34lQBvdAdDuWz+rvt/jRSRr7vxIVr1vPSgcyBGb5AWi332Fv9SEPSabdrOe0Ck61FSXmNGChJR7BQl40WHnVrYOQG/debaRNwfYG/w2tCj6JtOKSVsmgvDTKUN+OkUHDsFG/aMMoewz6LqMS/VtZOe6DGmOoXNdhhbEznUZRiB2rsswAbFzXYZHFaZzXcZiMd+d6zLMoHjIBxHPlPe12oVmvTu972Q6LqFjJzrX6iywVi9KcezcteJVcezcteJR69i5a8UIxM5dKyZQ7Ny14lVr27lrxat09O1dKyvdv2tlpcm7Vup/03ZdQRdRYxFGu50uabs3qIMGC3F8ry5saK8url6/qNlEMSgWobjbTRRf7p0mihRxJT3t7L1AwKZ5UNZEMWhtohim4MYhw8gmihAM0kQxiMknjutTJGJ29K0QwHzXDTio+JF0ZEUgJgiIzhoTJgmIa50dgScgXu2o1WGWgGisMSGDaKwxIYNorDEhgyhpTGjXLiCsGXE7oAzhrYp6DiOt762KuLfKGPJWgqaM4CoKGzVKEDVO9UswjkOmE/RrLBHWBIDsNg8yYh5k1DzIsHmQCfMgk+ZBps2DzJoHmTMPMm8eZME8yJTGYisjD4Db7XwXR9ZXKbNNv1JqcSrV9sxh5zt4Z6Swfr8vQHS+k984GSJc3YJ2vgu5V2geQl2dcue7oEaiIuSaGrCVmjgpMW+d72xU7CFkqlePrcfpy1QvLlM9hmSql2dyDypTNYgaJ1M1tmZDC3Nr/Gw1wljX5DtfjiEeNQ5xxjjEPcYh7jINccI4igeMQ5wyDnHSNMRx0wDf6AMqHvS+eLuggtM+gLjPB1q91/M6iJdheUgJzbP6iA+8vw989bgPdPBghzEmUNzvA5fA92TphStM9eVFLzFdGP7M0YpF/bNd6snSu1yvJ0vNQU+W5cZ6skQM7ZpF4M+82QOG7X2xH4i7SPTtbaYD+q7V2U1Z0F4GGfdSTPhuiqWpNsci1kN6o8aGYprgeQfgIgNooJcB3hkhhb7Jtix20xC83xPNoPr2e6wZVN+0x5pB9d3l42ZQvfw9HHMzdxE3bRT5mzaYpxN6GOPNoDIQL7TSY76bQfU9YKAZFLrd6qQZVN+7277gpYsoVMybaQYFKoEKRNuvipptzBhStAyt+cFG/yUMoQ89g7q5XKgfJXa6uUjTRp1uLloQO91cjEDsdHMxAbHTzWXRHBzqdHPxpvnudHMxg2KnS4NX47xF2aWh083Fo4zptM/wqp3otM/wqNvqtM8wArHTPsMEip32GV61tp32GV6lo2/bZ1zgfvuMC0y2z+hf5XL7DPtmDDjIldFgcpAQmwz8WbtNOZxtw0b4bVj2GLW/64eya3s30HpM2t8N4qRrokhs7sbZ3vhu9c3dIPxa/Ab2Po7NEQgDYXOEZ3OEYHMQ/gwD+YDo6CHbWlwn0IFIYyDWVJL+sXn/EPtBR1hKJz7oGG3pWbvCHtTfXyQ60ETd60ATbZHTRo0ERI0jdUJBZgTNNxIE9xKE9kbMseYio6yJuMeaiGPWNJ39LcY4I13qO4Z41DjEGeMQ9xiHuMs0xAnjKB4wDnHKOMRJ0xDHTQO8yfg37zMOcdr74o2v/xxDPOIDMzHlAxx3e14H8VyWU4g7jKN4r/epeMAHSu0H3z/tfVbf5gNLZl549nufMTu9j+IhH8jOPh9EEzsXo3Ec975S+8EjuADRvDjuXYzieJsP/OCU98nohwXmAR8Y8Ckf2Ild3qejD5as18/fkpXOZaujAfYmTHaSiF+I/H5U/PtEQH8r+UKdreRAc5ds4Fc6+x5R17ekou7ve0R19j3iEDVOMsHbbg3RjBPCTp1GNLhbuPWZv1vYNBqdLanOllRnS2pBY4vOlpRXDY95adztA16b1+q9ntfBTpa0kyX1kjh29vY66etO+nphncziTF93NoY9ahzv6tT1GEDRB3U9nS2pzpZUZ0tqgXnd2ZLylrVlj9XO4m2RLIz8kEowb3hu72QIO1rdScksqMaYtzzT3v/qxbmQOewDO+GDEz0+8DF+yPHcvhjt9zymyugSGnU0YPmcwaYq8S3uV8JtcVoJZ+8XEW09BjWqyaIEB4PwZ/Z+EWC+rLhfBOPKOob2H1BJsF6JAGCwR1ED/nhjkNFksKvVcuaBy8YmdmzfwhEJFKxlDNXAZeDPiPmChuYLwp9pU3MO7hViWibY3RWP49hesmMzAhW9UUNwF0/QiZ6nKVon4KM6IozW6PXyOSfYZ/lBOfghduyz8NEB9qNGsY9rYh+HjzYzkGvOtqTte0gC+oWgebwQNGeoEDQvIpbYIYEL6zewC+un0Uvm02I/k18yLXAlJ2GduA6j8AOIf7sYbSaGQYodtl1tL/yf1cdZf+KAuKs4OczDR7vHghI8N+nDT0/61H8u3XYYqtqsmRMO5eHmIcMsX0hgkJ/DwP6TNCafOK5PkYgFW2+DAOz0ySn4vxwpzpT/m//51EFmcKHJKUAsEBBHOYgF+IhALBIQ13IQi/ARgVgiIF7NQSzBRwRiDwHxGg5iD3xEIJYJiJs5iGX4iECsEBCv5SBW4CMCsUpA5K93q8JHrIWfwPXV9LxPXt/11XDX12vI9QnutwX37OJtC2u8XtehW0Kmq/PT1QlTAUCGzINMmgeZMg8yYR5kzjzIgnmQRfMgS+ZB9pgHWTYPsmIeZNU8yKh5kFnzIOPmQeoc5+uVr0zG2cpEkDEDRhp7k0eyaTmnqwfxuiantoCIi9IIsiV/QnQFKBgPuMknUhKNwY0skfJlLsKHRwHFibM4ETakXV8xp/GwIW4obEiTKS/uXmSAGqcGWQVXlyCnM6wGbAktThEvMasESxwrQaSlBFzeFpCplbm1B75nKPiHM/h5zyBsWgX+DAXJJSD7oHlDhp1133mbrrdjIh92prCv81lwbt4AnNkYfBO70fg7vA6fpadGgzyEFe2dbWdwzub5cxacxSYZZ7bMhbZZORs3K2caMiuCrzmTkLaz4UergzxbFSTHtbMNce0s0XeCWWxcsyLFozz3OTuM0UC6Ue6cqkuNIzllHsllppG83jyOy82DPM48yONNU/KN5nE8wTzIE82DfJYvQD7buHpPmkfyOeZBoslx5yCfax7k84xz527zSD7fOJKHzCN5kmkkb/SyF2OPJ5sH+QLzIE8xD7LgC5AvtEeOyVYFD7apv9H+pgZRtL07rfXYb3/3otbjgP3di1uPg/Z3L2k9Dtnfnd56HGbFQf+EhtVI1Uyy9dgrWO2d1Rj8FQP+FdlC8lg9mIhWL+TyRGAhdqZsu/ps63b1WRZGidan3+BZDShqe3cGpGjzS3+Mbr5Kv5THKNcY/Ca/XjrT3H1gZ6LYIkwHopMVI/xtluP7uvVeqyAkZfOj5t6F9D4pxeZ4AtXNsMYueFJa+VMjK39O5+1HDZoS9TTQ6fKyKzIHezoUTyF/fgRzsFKh5THsQxNkfZA2+B1rpxF3rL2IuGPtxfZ3Q5CBtnfDkA5zn1l8G5esA1a+YshxVBQYf7Yo/wc+Bhm2gmT9GRb8ONavaAz+EbAemwLRe0CoqhD40BJ2n91KfeBz5HyFGHRIXn95Dk/RilSpV/CDzoFY2aVlBXxUdTrATJzKOTMw3QqZMzv3qXomEUfOQeVM4nMKAnqf3RhK27XpLDh6TpuGhnjPdL6hTN55ZCbvfA0hOA+qlZ2f5yiQ8DwmsxYiroBDeSKe1xjqY4RC98fPF8OGQiGAfX5jiKuoOU/EoBrxqz/Bf3U2HND81QDxqxfivzrLok5McNTNYhL1NkkImgvDW1pDBOJngeCXp3NfY+h4YHiwWKbaXiyzZAaPZfqksUw/4Z9RszfADwLuOcW7tAFoMdQxSaG8S8GZbe+q8FOannupk2kvQwmA+KF+2skNNIb+RO6JBp2ElwKWDEK87JZrAD5iktnnnmT2SyVzUCRkMjIMkWQQSOYQpIM6bZUkc4CIb/uZZKIFO338tCUpAeoifWaP/OGOOnzE5KDW5mor5zELFSctVF2DtnFUDuI8YUUehFmowsc0pnW03KxTclCDj5gclNyTg7pUDvpEXyQjQ79EHTg56Id0UKetkhxwgVIJfkpTDh7UkIPSwshBqiMHMjlAQ4c+JHQAhO8Vx5Jb5aFDvxMR6SNtZY0TkT74iIlIxT0RqTlxGTVXXUafBm2VTEUfEVZw7qRi4dacGblFQ2pTUuJURBQlzIjlOAgmIz0LKSN1JzLSJ7GmnIz0QTqo01ZuRuqIGanQZqTeGLpDbkb6nIgIHXlWnEWeZfdEpOLE01Rc9TTuR549RDRStnBrzoy8FkOpfN/qHVfaS+ABDqiwc8PK0h2LuihtzQZBQCKBfzuTgS+gH+NMm8qNofvk2iRgXo9UjMqkpanQJ/rcit+HfBW3leW0ZVZWLrj9hvxFP8XFPoWQooLIapmW1Upj6BGFZGTdPREpSUWk4iR87RdZaehACBHp01A/JYNbZobzdDz+cmQ46/ywmtRw9qkZzpp4wfEpueGsIcJYp4Wx1hj6jKMwxNGCtw/itSAL3iFfJcAUFrwahnPAUBQ1QHGxHz5qhsw1acj8uILh7HNPRFJOFjMpJyJCnyQfUCCy89zYnOHM/4BibklDYPqJGouS5Wccz3sbQ9+RVyP0IgLFPnibGPT3XErk9Ep03k7XXvhoLywAI3ubJ+Xsu/UDT7+Yle3/pf/hNQmDNg8lRGBAQMfBxtBP2Fmw7wlwgx18FErcsP0pwVHRQd1jZlZ+NQETZ7oG8TNd/YbOdNHba9w3D+lNO2sqztk8etU152y9YfLBNVsvG12/6YYjQskrw68G0wFGYrmddfwihD0mydqyZiHBH3RVu2ZxYgLlHg43gQ93aeipko3sJSoY6kQFA9tjyt+rFS44sDeWKIK0N5o764B94p314YRC2Wibq5slH8Sd9ICTDe2BNje0+8gN7V4NxvVJ1xKDZO1gHx1EDTaGe+S1g4PEGnsVsYk6SBgCahO+FxgConlVUqO4leqwlYQ/0yybJmOKXGN4SB5TFJzsIws+sUDFFHo9v+Zm/1MIEVuRE0vZP4XIidJ0w8cTfSOAByqI+0YUiGCgoucYw/rBQAUPBgqGgoGKiMtMNPD6qgov5FVIWGQ6QSOwKqE3AGSPMZDsmI1hgI+9hc+re1R6yvMiPer0LbcGtaLHR1ZtHR/btH7rlpNXjW2/dsfE7C+3bpmGic0QZENIw/qBjQey0SC6eHlqD0Ro+4hBLQsvwOQ1nHUCmORkBd45a+F4AU7g1p5ABg+JCtKQqOxEcioiTgIHQh2o0OlsqRST54iangKLuyfRFt4CmxB1vRNRFLcJEUM2QdARHWsmr9m7t1vcACjqWu9e9iao3b035Fb3Xoq8q6gW9ny/edCVqFtmYLqtBiZCwY1ClpHdeyEYpHtvNyahGIEiSBwdhjD5UDHSGH4tM2g/Q4HzezHd0vVTVG0vRoRVtDF8pXwvJipsqRSGlEMZG7MeDWKNzF8nxuYGluS4WkNCw1Iaxck1ZhgKl6jP/vDriDA/zksZSo6olRwxy4oHhxuWwU0QcDGSiGQNkAQZllSlpEjeko3h7XJ5C/OYyXv+d6tpgaj9X3dj+HqIFfQhH2r5kKu2bruR9Zc74sDMR9E3CfRNGHcBR1RcgLpDaCreDZwgQk2XG3JMEMNWwn6kRdj1Y5vHJsYYaWcckLYbJ9OMBplswVQ3EUxFXA+mIngw1W0omIrwtrQbXZ5HIWpcLBxVsB1hcjq3upsGxXFdeInT6EqpsWPzQhve3AQaw/cwbbtNJ4AP6LF9hb7MBdwP4ANkAM99c1BvWvRge5CfNgi/G1+JsfuKhqd5sY9L8z30bUHIoASarYWhlKCR7fAh+5eEmpNtsL8Jo2+6W1/FGQFsjyzWGjNHrxG0MjkjYga6ysjARwRiloA4St/dc3+b18yci+GUJ0UuR9+FgudiHrBvaGcA5fEkT55eKwEiF5C1Uh7+2hpJiHYOfsf05kGdvHfJdSNXcj/vXSLzT9w39xgycj2iimDw3Xhhdokx6wO8kStLjVyZTLo6LzjtERacDr/f/iUZ1CzlWlbA9qbYGtP89o+i/ERQZfOK7mcrNYa/ykD/DW4Lm6sdBgpoHIYPuQrLS7D6hHwNJrBdGekajMYqY0FQhNen5Du5GdHOaLv0slx6JMTsUTlmOZmIvEFsJj8n32B1dCNciqRUhvM+KfiIwEw7kYqgqlSkBQQKNoa/BGhvU+FAc/JNRPyWtb9LQKOMV74UWRyT1rVgElGftWDfINL7OeJwTYGw4Qzh4V/oIpyjhHQW3X+XC2nViZBWRJuhRIikchtUiSieQIW0qmogSgICVRvD35EbiCpC+yJlrWdBf0+h/qjQ5mbbCnyzrUe62VYVRR0OaryqkCZcENKrwHpBGFKUsr5Csr5oiWhEuvFzvm0doYCkBeWiGvDJeBleiQ+vASO4qAd8Tyvu4UwkHqAHXQ/Qg3iAnjAUoAvSAQkiQM8YCtAzIvaD78ZvUgkyb9QtulNFFqAL1sdZeY0WYrGydLyUa4yEUE+9gffUWK4Bb2abQsekW45M6r2DD4jvCiJcYbAx0jr5+ySaatnEp1oAJbhkC6AFlw0E4onnY5N8MgbQqpWO4ZgCUOe+BSCIYxy1vwvCj8apECG+NEblTkdOYd8zhCa02s+dZo3mTsPu5U7D5nKnGRdzpyPP9n7udORE9dxpN2qbIvLc6UY0d7qa0WtSY13H4uzL6FUdkfNL0dlBcIFaBskOpuCvLcA0You061qadj+2SLsaW2ScxRZpIrZIM6k7zwexxTlobLEOjS3WEbFF89tfhvITQZXNe50A0XRjZC8DfQlu0G3Jv+ugQmH4kAuWlASrV8iTfwITE5Auo2isAhYERXhdLl9BB0TuoF16WbyVELMr5JjFZSKyXVhXNPKn8rxK3EleJUJSKsC5iQh8VEdELhUpVakQFeakGiNXKUiF7GTLdnEgebWc9gEntI+K6ASwIosodSS/PdpL5H6W9te6J/fb5LRPOaF9XHRenZD7OHxUj34Nyn1QTPvXEwWHKYh0K3Y49RTul9DqImFbDP7aAgwTReGqOShRtje1uWpOEGvQJAiafbbC1QyOJF50Njg6wCdEgLDg+cUEER626Pug49OF28XoTsntQN6JHRDsmOUpG6xyujDtxAbnVW2waPMr3xi5W26D8+gtSEQgOAv6XoV9hUSb+wpZfF8hI91XoPagAxrHsfKQJtz6pqDA+ixxwtXhdThJqGpC3XiA31cgFJB0UrhVzBHJmzSxcZohNk6zYEllX2yzBTl0NbgY7Tr3U8/5j+9+8Cb+oqimHDQtaZsT7d1U/+kHz37hfvlE7VcCEwezVFqKLNEpU47pIfe/+gmVmPtlyjGybvj+Ni+9/yPdUiQo9uBCjYmihjRmfROyOKO5ZjM/aDuD+8e2pfMPaHS2Ds22v47p+6fRNRHio0J0IBxtjHyWAX+UMGNhZgbwkzeWE2Zh+IiKHXcOJQJRd3TWKASBCddGX5AnaLBlV4wm5yzwL8kDrgRdpa+88EpAvMiFF7EmicsOnMStfLUsZ4jjUsfOVzPxhbZM8SBbHH4nOihsRS4KZ1LPHoRQRx6CsFtK2K4XiKN51C7C7QfQXdqrxF6ly+5VuiwS87ScjnzQajnBb7rIHVGCkxhTosqcVBOzEDpToO0Nyhq/LMUMteVYH7ZbxQ6AjfxA14hb9gKFRvwnDPiPqRW6ZFUctyfLxyAOqDVzcJgw6fwwYbIx8ktgwLEtwFXEjn03o9ZvdB1AFJolkQNY2ioH+D3hLLkzBrGWtbxv5VbEWEePnYtXOB5LnOiOyew9rr0R5eOxcUWLb5kppGTxE+hBdgK9JPpNCeWjxHEl29eNRkFRDYcURKU4CAHizipG5M26yRqYlpFyEBGgTjfJfyOuqYp1N3GgxW0uTm/7j//92h1vqP7I9VXwy19y9Kadn/zOGvlExAZSWNZH4JiV4B3QBqHrWNrXdjTTRdwyHaM+JKTXEIF9yVrxl5zaFIilQ9QeEL9JEVNwc5hDIJGadQfLFToQR9tMAobwJGBcmgRMOCkBSpKrkQjZQa8b7TBAtkbRac4hEjZxe46lJ4EkIIe1ZVuRe2vJPnBvLbsf3FtwNLQptGvazi1E0Wioiywhw7OQQWI5EuKXI6iJUliQRFia5nJiQUJYkwCl9EFK6UPU6jmMqm3EPbVNSNU2SdRArZLoHyXnCVLOo6Scx0RyDv21jcrdFPMiEAEK424S44gIY5xOYUF8sXQN5pS7FXyZrZ8RW0OShinSWHoFm34zTRv1sFK50RSuKjr5qRg+nSU7pbqqiFKyFJ0PjQ2342iT5PYmpbEJUv5jpPzH9T0TlARUBJ2L/iqp6G9j895qXPRH51f0RzuiLxH9UY+L/q0GRX9UKvq3sXnvMS76a+dX9Nd2RF8i+ms9Lvr3UKIfpOSzW6NuFjYnsqNl6R7pXidWB92ZF6YTq3yfMEYSWKM7czQEbUFIL3iPQrkjDEvYdGQPMKBkXFYf2E3kZNFbhSJkKiIotf1/LS9FE7uVLQqK162dG+xuLP0Q2yR8v85RQM2ylJi+9nW7fxSwmzwKiKfQBUILTqyZMYsdgIsMIF4z1PTVj6FyjFYGMXsm1P0vMdD/qFIXpK5FIYUwNqJa4oOY0q9om1LexW4Rg/6avMAnStSK6pwosjTiJk8UYaFvuM3QN4aHvt3S0NdU/GIJJjgtiUE6qNNWqeYnQm6jtlSvzV3BcKh2dPB96y52ffvx4cQ/nfP//iL6WvlEFoGKtCRL6Kmjdk8dbIkbMsBWaBJtyUWTqr9sSjwTM4aN9UV3C0hTOOx4d9vfRDHhbY60f1EEE1yFLxIOiAkjuQgY3jQ+zQGNpU/Ocef/B2LVIuhuHwYA",
2550
- "debug_symbols": "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"
2485
+ "bytecode": "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",
2486
+ "debug_symbols": "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"
2551
2487
  }
2552
2488
  ],
2553
2489
  "outputs": {
@@ -4427,95 +4363,95 @@
4427
4363
  },
4428
4364
  {
4429
4365
  "name": "<impl BuildHasher for BuildHasherDefault<H>>::build_hasher",
4430
- "start": 6693
4366
+ "start": 6947
4431
4367
  },
4432
4368
  {
4433
4369
  "name": "<impl Default for BuildHasherDefault<H>>::default",
4434
- "start": 6825
4370
+ "start": 7079
4435
4371
  },
4436
4372
  {
4437
4373
  "name": "<impl Hash for Field>::hash",
4438
- "start": 6957
4374
+ "start": 7211
4439
4375
  },
4440
4376
  {
4441
4377
  "name": "<impl Hash for u1>::hash",
4442
- "start": 7087
4378
+ "start": 7341
4443
4379
  },
4444
4380
  {
4445
4381
  "name": "<impl Hash for u8>::hash",
4446
- "start": 7226
4382
+ "start": 7480
4447
4383
  },
4448
4384
  {
4449
4385
  "name": "<impl Hash for u16>::hash",
4450
- "start": 7366
4386
+ "start": 7620
4451
4387
  },
4452
4388
  {
4453
4389
  "name": "<impl Hash for u32>::hash",
4454
- "start": 7506
4390
+ "start": 7760
4455
4391
  },
4456
4392
  {
4457
4393
  "name": "<impl Hash for u64>::hash",
4458
- "start": 7646
4394
+ "start": 7900
4459
4395
  },
4460
4396
  {
4461
4397
  "name": "<impl Hash for u128>::hash",
4462
- "start": 7787
4398
+ "start": 8041
4463
4399
  },
4464
4400
  {
4465
4401
  "name": "<impl Hash for i8>::hash",
4466
- "start": 7926
4402
+ "start": 8180
4467
4403
  },
4468
4404
  {
4469
4405
  "name": "<impl Hash for i16>::hash",
4470
- "start": 8072
4406
+ "start": 8326
4471
4407
  },
4472
4408
  {
4473
4409
  "name": "<impl Hash for i32>::hash",
4474
- "start": 8219
4410
+ "start": 8473
4475
4411
  },
4476
4412
  {
4477
4413
  "name": "<impl Hash for i64>::hash",
4478
- "start": 8366
4414
+ "start": 8620
4479
4415
  },
4480
4416
  {
4481
4417
  "name": "<impl Hash for bool>::hash",
4482
- "start": 8514
4418
+ "start": 8768
4483
4419
  },
4484
4420
  {
4485
4421
  "name": "<impl Hash for ()>::hash",
4486
- "start": 8661
4422
+ "start": 8915
4487
4423
  },
4488
4424
  {
4489
4425
  "name": "<impl Hash for [T; N]>::hash",
4490
- "start": 8793
4426
+ "start": 9047
4491
4427
  },
4492
4428
  {
4493
4429
  "name": "<impl Hash for [T]>::hash",
4494
- "start": 8982
4430
+ "start": 9236
4495
4431
  },
4496
4432
  {
4497
4433
  "name": "<impl Hash for (A, B)>::hash",
4498
- "start": 9222
4434
+ "start": 9476
4499
4435
  },
4500
4436
  {
4501
4437
  "name": "<impl Hash for (A, B, C)>::hash",
4502
- "start": 9438
4438
+ "start": 9692
4503
4439
  },
4504
4440
  {
4505
4441
  "name": "<impl Hash for (A, B, C, D)>::hash",
4506
- "start": 9701
4442
+ "start": 9955
4507
4443
  },
4508
4444
  {
4509
4445
  "name": "<impl Hash for (A, B, C, D, E)>::hash",
4510
- "start": 10011
4446
+ "start": 10265
4511
4447
  },
4512
4448
  {
4513
4449
  "name": "assert_pedersen",
4514
- "start": 10407
4450
+ "start": 10661
4515
4451
  }
4516
4452
  ],
4517
4453
  "path": "std/hash/mod.nr",
4518
- "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\nuse crate::static_assert;\n\n/// The size of the state accepted by the backend in `poseidon2_permutation`.\nglobal POSEIDON2_CONFIG_STATE_SIZE: u32 = poseidon2_config_state_size();\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3<let N: u32>(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment<let N: u32>(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator<let N: u32>(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash<let N: u32>(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator<let N: u32>(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n crate::assert_constant(separator);\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n crate::assert_constant(starting_index);\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Decompose the input 'bn254 scalar' into two 128 bits limbs.\n// It is called 'unsafe' because it does not assert the limbs are 128 bits\n// Assuming the limbs are 128 bits:\n// Assert the decomposition does not overflow the field size.\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n // Check that the decomposition does not overflow the field size\n let (a, b) = if xhi == crate::field::bn254::PHI {\n (xlo, crate::field::bn254::PLO)\n } else {\n (xhi, crate::field::bn254::PHI)\n };\n crate::field::bn254::assert_lt(a, b);\n\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn poseidon2_permutation<let N: u32>(input: [Field; N], state_len: u32) -> [Field; N] {\n assert_eq(input.len(), state_len);\n\n static_assert(\n N == POSEIDON2_CONFIG_STATE_SIZE,\n f\"the input length must equal the state size in the Poseidon2 config; expected {POSEIDON2_CONFIG_STATE_SIZE}, got {N}\",\n );\n poseidon2_permutation_internal(input)\n}\n\n#[foreign(poseidon2_permutation)]\nfn poseidon2_permutation_internal<let N: u32>(input: [Field; N]) -> [Field; N] {}\n\n#[foreign(poseidon2_config_state_size)]\ncomptime fn poseidon2_config_state_size() -> u32 {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash<H>(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault<H>;\n\nimpl<H> BuildHasher for BuildHasherDefault<H>\nwhere\n H: Hasher + Default,\n{\n type H = H;\n\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl<H> Default for BuildHasherDefault<H>\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u8 as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u16 as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u32 as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u64 as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash<H>(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl<T, let N: u32> Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<T> Hash for [T]\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<A, B> Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl<A, B, C> Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl<A, B, C, D> Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl<A, B, C, D, E> Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n"
4454
+ "source": "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\nuse crate::static_assert;\n\n/// The size of the state accepted by the backend in `poseidon2_permutation`.\nglobal POSEIDON2_CONFIG_STATE_SIZE: u32 = poseidon2_config_state_size();\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3<let N: u32>(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment<let N: u32>(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator<let N: u32>(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash<let N: u32>(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator<let N: u32>(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n crate::assert_constant(separator);\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n crate::assert_constant(starting_index);\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Decompose the input 'bn254 scalar' into two 128 bits limbs.\n// It is called 'unsafe' because it does not assert the limbs are 128 bits\n// Assuming the limbs are 128 bits:\n// Assert the decomposition does not overflow the field size.\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n // Check that the decomposition does not overflow the field size\n let (a, b) = if xhi == crate::field::bn254::PHI {\n (xlo, crate::field::bn254::PLO)\n } else {\n (xhi, crate::field::bn254::PHI)\n };\n crate::field::bn254::assert_lt(a, b);\n\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn poseidon2_permutation<let N: u32>(input: [Field; N], state_len: u32) -> [Field; N] {\n assert_eq(input.len(), state_len);\n\n static_assert(\n N == POSEIDON2_CONFIG_STATE_SIZE,\n f\"the input length must equal the state size in the Poseidon2 config; expected {POSEIDON2_CONFIG_STATE_SIZE}, got {N}\",\n );\n poseidon2_permutation_internal(input)\n}\n\n#[foreign(poseidon2_permutation)]\nfn poseidon2_permutation_internal<let N: u32>(input: [Field; N]) -> [Field; N] {}\n\n#[foreign(poseidon2_config_state_size)]\ncomptime fn poseidon2_config_state_size() -> u32 {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash<H>(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n /// Returns the hash value without consuming the hasher.\n /// Override this for more efficient implementations that avoid copying.\n /// TODO: deprecate finish() and replace it\n fn finish_ref(&self) -> Field {\n (*self).finish()\n }\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault<H>;\n\nimpl<H> BuildHasher for BuildHasherDefault<H>\nwhere\n H: Hasher + Default,\n{\n type H = H;\n\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl<H> Default for BuildHasherDefault<H>\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u8 as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u16 as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u32 as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u64 as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash<H>(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl<T, let N: u32> Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<T> Hash for [T]\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<A, B> Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl<A, B, C> Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl<A, B, C, D> Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl<A, B, C, D, E> Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n"
4519
4455
  },
4520
4456
  "180": {
4521
4457
  "function_locations": [
@@ -5125,131 +5061,131 @@
5125
5061
  },
5126
5062
  {
5127
5063
  "name": "[T; N]::map",
5128
- "start": 1442
5064
+ "start": 1443
5129
5065
  },
5130
5066
  {
5131
5067
  "name": "[T; N]::mapi",
5132
- "start": 2002
5068
+ "start": 2004
5133
5069
  },
5134
5070
  {
5135
5071
  "name": "[T; N]::for_each",
5136
- "start": 2549
5072
+ "start": 2552
5137
5073
  },
5138
5074
  {
5139
5075
  "name": "[T; N]::for_eachi",
5140
- "start": 2966
5076
+ "start": 2970
5141
5077
  },
5142
5078
  {
5143
5079
  "name": "[T; N]::fold",
5144
- "start": 3832
5080
+ "start": 3837
5145
5081
  },
5146
5082
  {
5147
5083
  "name": "[T; N]::reduce",
5148
- "start": 4349
5084
+ "start": 4355
5149
5085
  },
5150
5086
  {
5151
5087
  "name": "[T; N]::all",
5152
- "start": 4858
5088
+ "start": 4865
5153
5089
  },
5154
5090
  {
5155
5091
  "name": "[T; N]::any",
5156
- "start": 5330
5092
+ "start": 5338
5157
5093
  },
5158
5094
  {
5159
5095
  "name": "[T; N]::concat",
5160
- "start": 5872
5096
+ "start": 5881
5161
5097
  },
5162
5098
  {
5163
5099
  "name": "[T; N]::sort",
5164
- "start": 6768
5100
+ "start": 6777
5165
5101
  },
5166
5102
  {
5167
5103
  "name": "[T; N]::sort_via",
5168
- "start": 7783
5104
+ "start": 7792
5169
5105
  },
5170
5106
  {
5171
5107
  "name": "[u8; N]::as_str_unchecked",
5172
- "start": 8811
5108
+ "start": 8820
5173
5109
  },
5174
5110
  {
5175
5111
  "name": "<impl From<str<N>> for [u8; N]>::from",
5176
- "start": 8938
5112
+ "start": 8947
5177
5113
  },
5178
5114
  {
5179
5115
  "name": "test::map_empty",
5180
- "start": 9012
5116
+ "start": 9021
5181
5117
  },
5182
5118
  {
5183
5119
  "name": "test::sort_u32",
5184
- "start": 10122
5120
+ "start": 10131
5185
5121
  },
5186
5122
  {
5187
5123
  "name": "test::test_sort",
5188
- "start": 10177
5124
+ "start": 10186
5189
5125
  },
5190
5126
  {
5191
5127
  "name": "test::test_sort_100_values",
5192
- "start": 10408
5128
+ "start": 10417
5193
5129
  },
5194
5130
  {
5195
5131
  "name": "test::test_sort_100_values_comptime",
5196
- "start": 11576
5132
+ "start": 11585
5197
5133
  },
5198
5134
  {
5199
5135
  "name": "test::test_sort_via",
5200
- "start": 11721
5136
+ "start": 11730
5201
5137
  },
5202
5138
  {
5203
5139
  "name": "test::test_sort_via_100_values",
5204
- "start": 11968
5140
+ "start": 11977
5205
5141
  },
5206
5142
  {
5207
5143
  "name": "test::mapi_empty",
5208
- "start": 13129
5144
+ "start": 13138
5209
5145
  },
5210
5146
  {
5211
5147
  "name": "test::for_each_empty",
5212
- "start": 13224
5148
+ "start": 13233
5213
5149
  },
5214
5150
  {
5215
5151
  "name": "test::for_eachi_empty",
5216
- "start": 13362
5152
+ "start": 13371
5217
5153
  },
5218
5154
  {
5219
5155
  "name": "test::map_example",
5220
- "start": 13501
5156
+ "start": 13510
5221
5157
  },
5222
5158
  {
5223
5159
  "name": "test::mapi_example",
5224
- "start": 13638
5160
+ "start": 13647
5225
5161
  },
5226
5162
  {
5227
5163
  "name": "test::for_each_example",
5228
- "start": 13787
5164
+ "start": 13796
5229
5165
  },
5230
5166
  {
5231
5167
  "name": "test::for_eachi_example",
5232
- "start": 14127
5168
+ "start": 14136
5233
5169
  },
5234
5170
  {
5235
5171
  "name": "test::concat",
5236
- "start": 14338
5172
+ "start": 14347
5237
5173
  },
5238
5174
  {
5239
5175
  "name": "test::concat_zero_length_with_something",
5240
- "start": 14597
5176
+ "start": 14606
5241
5177
  },
5242
5178
  {
5243
5179
  "name": "test::concat_something_with_zero_length",
5244
- "start": 14800
5180
+ "start": 14809
5245
5181
  },
5246
5182
  {
5247
5183
  "name": "test::concat_zero_lengths",
5248
- "start": 14989
5184
+ "start": 14998
5249
5185
  }
5250
5186
  ],
5251
5187
  "path": "std/array/mod.nr",
5252
- "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl<T, let N: u32> [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a vector.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let vector = array.as_vector();\n /// assert_eq(vector, [1, 2].as_vector());\n /// ```\n #[builtin(as_vector)]\n pub fn as_vector(self) -> [T] {}\n\n /// Returns this array as a vector.\n /// This method is deprecated in favor of `as_vector`.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let vector = array.as_slice();\n /// assert_eq(vector, [1, 2].as_vector());\n /// ```\n #[builtin(as_vector)]\n #[deprecated(\"This method has been renamed to `as_vector`\")]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi<U, Env>(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each<Env>(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi<Env>(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold<U, Env>(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce<Env>(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat<let M: u32>(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl<T, let N: u32> [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the [`Self::sort_via`] function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl<T, let N: u32> [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via<Env>(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n let sorted = unsafe { quicksort::quicksort(self, ordering) };\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n}\n\nimpl<let N: u32> [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str<N> {}\n}\n\nimpl<let N: u32> From<str<N>> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str<N>) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n global arr_with_100_values: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2, 54,\n 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41, 19, 98,\n 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21, 43, 86, 35,\n 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15, 127, 81, 30, 8,\n 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n global expected_with_100_values: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30, 32,\n 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58, 61, 62,\n 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82, 84, 84, 86,\n 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114, 114, 116, 118,\n 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n fn sort_u32(a: u32, b: u32) -> bool {\n a <= b\n }\n\n #[test]\n fn test_sort() {\n let arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort();\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values() {\n let arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort();\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values_comptime() {\n let sorted = arr_with_100_values.sort();\n assert(sorted == expected_with_100_values);\n }\n\n #[test]\n fn test_sort_via() {\n let arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_via_100_values() {\n let arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n"
5188
+ "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl<T, let N: u32> [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a vector.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let vector = array.as_vector();\n /// assert_eq(vector, [1, 2].as_vector());\n /// ```\n #[builtin(as_vector)]\n pub fn as_vector(self) -> [T] {}\n\n /// Returns this array as a vector.\n /// This method is deprecated in favor of `as_vector`.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let vector = array.as_slice();\n /// assert_eq(vector, [1, 2].as_vector());\n /// ```\n #[builtin(as_vector)]\n #[deprecated(\"This method has been renamed to `as_vector`\")]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map<U, Env>(&self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi<U, Env>(&self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each<Env>(&self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi<Env>(&self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold<U, Env>(&self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce<Env>(&self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all<Env>(&self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any<Env>(&self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat<let M: u32>(&self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl<T, let N: u32> [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the [`Self::sort_via`] function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl<T, let N: u32> [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via<Env>(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n let sorted = unsafe { quicksort::quicksort(self, ordering) };\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n}\n\nimpl<let N: u32> [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str<N> {}\n}\n\nimpl<let N: u32> From<str<N>> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str<N>) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n global arr_with_100_values: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2, 54,\n 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41, 19, 98,\n 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21, 43, 86, 35,\n 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15, 127, 81, 30, 8,\n 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n global expected_with_100_values: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30, 32,\n 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58, 61, 62,\n 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82, 84, 84, 86,\n 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114, 114, 116, 118,\n 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n fn sort_u32(a: u32, b: u32) -> bool {\n a <= b\n }\n\n #[test]\n fn test_sort() {\n let arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort();\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values() {\n let arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort();\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_100_values_comptime() {\n let sorted = arr_with_100_values.sort();\n assert(sorted == expected_with_100_values);\n }\n\n #[test]\n fn test_sort_via() {\n let arr: [u32; 7] = [3, 6, 8, 10, 1, 2, 1];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 7] = [1, 1, 2, 3, 6, 8, 10];\n assert(sorted == expected);\n }\n\n #[test]\n fn test_sort_via_100_values() {\n let arr: [u32; 100] = [\n 42, 123, 87, 93, 48, 80, 50, 5, 104, 84, 70, 47, 119, 66, 71, 121, 3, 29, 42, 118, 2,\n 54, 89, 44, 81, 0, 26, 106, 68, 96, 84, 48, 95, 54, 45, 32, 89, 100, 109, 19, 37, 41,\n 19, 98, 53, 114, 107, 66, 6, 74, 13, 19, 105, 64, 123, 28, 44, 50, 89, 58, 123, 126, 21,\n 43, 86, 35, 21, 62, 82, 0, 108, 120, 72, 72, 62, 80, 12, 71, 70, 86, 116, 73, 38, 15,\n 127, 81, 30, 8, 125, 28, 26, 69, 114, 63, 27, 28, 61, 42, 13, 32,\n ];\n\n let sorted = arr.sort_via(sort_u32);\n\n let expected: [u32; 100] = [\n 0, 0, 2, 3, 5, 6, 8, 12, 13, 13, 15, 19, 19, 19, 21, 21, 26, 26, 27, 28, 28, 28, 29, 30,\n 32, 32, 35, 37, 38, 41, 42, 42, 42, 43, 44, 44, 45, 47, 48, 48, 50, 50, 53, 54, 54, 58,\n 61, 62, 62, 63, 64, 66, 66, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 80, 80, 81, 81, 82,\n 84, 84, 86, 86, 87, 89, 89, 89, 93, 95, 96, 98, 100, 104, 105, 106, 107, 108, 109, 114,\n 114, 116, 118, 119, 120, 121, 123, 123, 123, 125, 126, 127,\n ];\n assert(sorted == expected);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n"
5253
5189
  },
5254
5190
  "355": {
5255
5191
  "function_locations": [
@@ -5843,91 +5779,91 @@
5843
5779
  },
5844
5780
  {
5845
5781
  "name": "Option<T>::is_none",
5846
- "start": 671
5782
+ "start": 672
5847
5783
  },
5848
5784
  {
5849
5785
  "name": "Option<T>::is_some",
5850
- "start": 772
5786
+ "start": 774
5851
5787
  },
5852
5788
  {
5853
5789
  "name": "Option<T>::unwrap",
5854
- "start": 896
5790
+ "start": 898
5855
5791
  },
5856
5792
  {
5857
5793
  "name": "Option<T>::unwrap_unchecked",
5858
- "start": 1194
5794
+ "start": 1196
5859
5795
  },
5860
5796
  {
5861
5797
  "name": "Option<T>::unwrap_or",
5862
- "start": 1366
5798
+ "start": 1368
5863
5799
  },
5864
5800
  {
5865
5801
  "name": "Option<T>::unwrap_or_else",
5866
- "start": 1666
5802
+ "start": 1668
5867
5803
  },
5868
5804
  {
5869
5805
  "name": "Option<T>::expect",
5870
- "start": 1967
5806
+ "start": 1969
5871
5807
  },
5872
5808
  {
5873
5809
  "name": "Option<T>::map",
5874
- "start": 2188
5810
+ "start": 2190
5875
5811
  },
5876
5812
  {
5877
5813
  "name": "Option<T>::map_or",
5878
- "start": 2488
5814
+ "start": 2490
5879
5815
  },
5880
5816
  {
5881
5817
  "name": "Option<T>::map_or_else",
5882
- "start": 2782
5818
+ "start": 2784
5883
5819
  },
5884
5820
  {
5885
5821
  "name": "Option<T>::and",
5886
- "start": 3007
5822
+ "start": 3009
5887
5823
  },
5888
5824
  {
5889
5825
  "name": "Option<T>::and_then",
5890
- "start": 3444
5826
+ "start": 3446
5891
5827
  },
5892
5828
  {
5893
5829
  "name": "Option<T>::or",
5894
- "start": 3667
5830
+ "start": 3669
5895
5831
  },
5896
5832
  {
5897
5833
  "name": "Option<T>::or_else",
5898
- "start": 3900
5834
+ "start": 3902
5899
5835
  },
5900
5836
  {
5901
5837
  "name": "Option<T>::xor",
5902
- "start": 4190
5838
+ "start": 4192
5903
5839
  },
5904
5840
  {
5905
5841
  "name": "Option<T>::filter",
5906
- "start": 4634
5842
+ "start": 4636
5907
5843
  },
5908
5844
  {
5909
5845
  "name": "Option<T>::flatten",
5910
- "start": 5063
5846
+ "start": 5065
5911
5847
  },
5912
5848
  {
5913
5849
  "name": "<impl Default for Option<T>>::default",
5914
- "start": 5240
5850
+ "start": 5242
5915
5851
  },
5916
5852
  {
5917
5853
  "name": "<impl Eq for Option<T>>::eq",
5918
- "start": 5355
5854
+ "start": 5357
5919
5855
  },
5920
5856
  {
5921
5857
  "name": "<impl Hash for Option<T>>::hash",
5922
- "start": 5704
5858
+ "start": 5706
5923
5859
  },
5924
5860
  {
5925
5861
  "name": "<impl Ord for Option<T>>::cmp",
5926
- "start": 5973
5862
+ "start": 5975
5927
5863
  }
5928
5864
  ],
5929
5865
  "path": "std/option.nr",
5930
- "source": "use crate::cmp::{Eq, Ord, Ordering};\nuse crate::default::Default;\nuse crate::hash::{Hash, Hasher};\n\n/// Represents a value of type T or its absence.\n/// Use `Option::some(value)` to construct a value or `Option::none()` to record the absence of one.\npub struct Option<T> {\n _is_some: bool,\n _value: T,\n}\n\nimpl<T> Option<T> {\n /// Constructs a None value\n pub fn none() -> Self {\n Self { _is_some: false, _value: crate::mem::zeroed() }\n }\n\n /// Constructs a Some wrapper around the given value\n pub fn some(_value: T) -> Self {\n Self { _is_some: true, _value }\n }\n\n /// True if this Option is None\n pub fn is_none(self) -> bool {\n !self._is_some\n }\n\n /// True if this Option is Some\n pub fn is_some(self) -> bool {\n self._is_some\n }\n\n /// Asserts `self.is_some()` and returns the wrapped value.\n pub fn unwrap(self) -> T {\n assert(self._is_some);\n self._value\n }\n\n /// Returns the inner value without asserting `self.is_some()`\n /// Note that if `self` is `None`, there is no guarantee what value will be returned,\n /// only that it will be of type `T`.\n pub fn unwrap_unchecked(self) -> T {\n self._value\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, returns the given default value.\n pub fn unwrap_or(self, default: T) -> T {\n if self._is_some {\n self._value\n } else {\n default\n }\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, calls the given function to return\n /// a default value.\n pub fn unwrap_or_else<Env>(self, default: fn[Env]() -> T) -> T {\n if self._is_some {\n self._value\n } else {\n default()\n }\n }\n\n /// Asserts `self.is_some()` with a provided custom message and returns the contained `Some` value\n pub fn expect<let N: u32, MessageTypes>(self, message: fmtstr<N, MessageTypes>) -> T {\n assert(self.is_some(), message);\n self._value\n }\n\n /// If self is `Some(x)`, this returns `Some(f(x))`. Otherwise, this returns `None`.\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> Option<U> {\n if self._is_some {\n Option::some(f(self._value))\n } else {\n Option::none()\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns the given default value.\n pub fn map_or<U, Env>(self, default: U, f: fn[Env](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns `default()`.\n pub fn map_or_else<U, Env1, Env2>(self, default: fn[Env1]() -> U, f: fn[Env2](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default()\n }\n }\n\n /// Returns None if self is None. Otherwise, this returns `other`.\n pub fn and(self, other: Self) -> Self {\n if self.is_none() {\n Option::none()\n } else {\n other\n }\n }\n\n /// If self is None, this returns None. Otherwise, this calls the given function\n /// with the Some value contained within self, and returns the result of that call.\n ///\n /// In some languages this function is called `flat_map` or `bind`.\n pub fn and_then<U, Env>(self, f: fn[Env](T) -> Option<U>) -> Option<U> {\n if self._is_some {\n f(self._value)\n } else {\n Option::none()\n }\n }\n\n /// If self is Some, return self. Otherwise, return `other`.\n pub fn or(self, other: Self) -> Self {\n if self._is_some {\n self\n } else {\n other\n }\n }\n\n /// If self is Some, return self. Otherwise, return `default()`.\n pub fn or_else<Env>(self, default: fn[Env]() -> Self) -> Self {\n if self._is_some {\n self\n } else {\n default()\n }\n }\n\n // If only one of the two Options is Some, return that option.\n // Otherwise, if both options are Some or both are None, None is returned.\n pub fn xor(self, other: Self) -> Self {\n if self._is_some {\n if other._is_some {\n Option::none()\n } else {\n self\n }\n } else if other._is_some {\n other\n } else {\n Option::none()\n }\n }\n\n /// Returns `Some(x)` if self is `Some(x)` and `predicate(x)` is true.\n /// Otherwise, this returns `None`\n pub fn filter<Env>(self, predicate: fn[Env](T) -> bool) -> Self {\n if self._is_some {\n if predicate(self._value) {\n self\n } else {\n Option::none()\n }\n } else {\n Option::none()\n }\n }\n\n /// Flattens an Option<Option<T>> into a Option<T>.\n /// This returns None if the outer Option is None. Otherwise, this returns the inner Option.\n pub fn flatten(option: Option<Option<T>>) -> Option<T> {\n if option._is_some {\n option._value\n } else {\n Option::none()\n }\n }\n}\n\nimpl<T> Default for Option<T> {\n fn default() -> Self {\n Option::none()\n }\n}\n\nimpl<T> Eq for Option<T>\nwhere\n T: Eq,\n{\n fn eq(self, other: Self) -> bool {\n if self._is_some == other._is_some {\n if self._is_some {\n self._value == other._value\n } else {\n true\n }\n } else {\n false\n }\n }\n}\n\nimpl<T> Hash for Option<T>\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self._is_some.hash(state);\n if self._is_some {\n self._value.hash(state);\n }\n }\n}\n\n// For this impl we're declaring Option::none < Option::some\nimpl<T> Ord for Option<T>\nwhere\n T: Ord,\n{\n fn cmp(self, other: Self) -> Ordering {\n if self._is_some {\n if other._is_some {\n self._value.cmp(other._value)\n } else {\n Ordering::greater()\n }\n } else if other._is_some {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n"
5866
+ "source": "use crate::cmp::{Eq, Ord, Ordering};\nuse crate::default::Default;\nuse crate::hash::{Hash, Hasher};\n\n/// Represents a value of type T or its absence.\n/// Use `Option::some(value)` to construct a value or `Option::none()` to record the absence of one.\npub struct Option<T> {\n _is_some: bool,\n _value: T,\n}\n\nimpl<T> Option<T> {\n /// Constructs a None value\n pub fn none() -> Self {\n Self { _is_some: false, _value: crate::mem::zeroed() }\n }\n\n /// Constructs a Some wrapper around the given value\n pub fn some(_value: T) -> Self {\n Self { _is_some: true, _value }\n }\n\n /// True if this Option is None\n pub fn is_none(&self) -> bool {\n !self._is_some\n }\n\n /// True if this Option is Some\n pub fn is_some(&self) -> bool {\n self._is_some\n }\n\n /// Asserts `self.is_some()` and returns the wrapped value.\n pub fn unwrap(self) -> T {\n assert(self._is_some);\n self._value\n }\n\n /// Returns the inner value without asserting `self.is_some()`\n /// Note that if `self` is `None`, there is no guarantee what value will be returned,\n /// only that it will be of type `T`.\n pub fn unwrap_unchecked(self) -> T {\n self._value\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, returns the given default value.\n pub fn unwrap_or(self, default: T) -> T {\n if self._is_some {\n self._value\n } else {\n default\n }\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, calls the given function to return\n /// a default value.\n pub fn unwrap_or_else<Env>(self, default: fn[Env]() -> T) -> T {\n if self._is_some {\n self._value\n } else {\n default()\n }\n }\n\n /// Asserts `self.is_some()` with a provided custom message and returns the contained `Some` value\n pub fn expect<let N: u32, MessageTypes>(self, message: fmtstr<N, MessageTypes>) -> T {\n assert(self.is_some(), message);\n self._value\n }\n\n /// If self is `Some(x)`, this returns `Some(f(x))`. Otherwise, this returns `None`.\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> Option<U> {\n if self._is_some {\n Option::some(f(self._value))\n } else {\n Option::none()\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns the given default value.\n pub fn map_or<U, Env>(self, default: U, f: fn[Env](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns `default()`.\n pub fn map_or_else<U, Env1, Env2>(self, default: fn[Env1]() -> U, f: fn[Env2](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default()\n }\n }\n\n /// Returns None if self is None. Otherwise, this returns `other`.\n pub fn and(self, other: Self) -> Self {\n if self.is_none() {\n Option::none()\n } else {\n other\n }\n }\n\n /// If self is None, this returns None. Otherwise, this calls the given function\n /// with the Some value contained within self, and returns the result of that call.\n ///\n /// In some languages this function is called `flat_map` or `bind`.\n pub fn and_then<U, Env>(self, f: fn[Env](T) -> Option<U>) -> Option<U> {\n if self._is_some {\n f(self._value)\n } else {\n Option::none()\n }\n }\n\n /// If self is Some, return self. Otherwise, return `other`.\n pub fn or(self, other: Self) -> Self {\n if self._is_some {\n self\n } else {\n other\n }\n }\n\n /// If self is Some, return self. Otherwise, return `default()`.\n pub fn or_else<Env>(self, default: fn[Env]() -> Self) -> Self {\n if self._is_some {\n self\n } else {\n default()\n }\n }\n\n // If only one of the two Options is Some, return that option.\n // Otherwise, if both options are Some or both are None, None is returned.\n pub fn xor(self, other: Self) -> Self {\n if self._is_some {\n if other._is_some {\n Option::none()\n } else {\n self\n }\n } else if other._is_some {\n other\n } else {\n Option::none()\n }\n }\n\n /// Returns `Some(x)` if self is `Some(x)` and `predicate(x)` is true.\n /// Otherwise, this returns `None`\n pub fn filter<Env>(self, predicate: fn[Env](T) -> bool) -> Self {\n if self._is_some {\n if predicate(self._value) {\n self\n } else {\n Option::none()\n }\n } else {\n Option::none()\n }\n }\n\n /// Flattens an Option<Option<T>> into a Option<T>.\n /// This returns None if the outer Option is None. Otherwise, this returns the inner Option.\n pub fn flatten(option: Option<Option<T>>) -> Option<T> {\n if option._is_some {\n option._value\n } else {\n Option::none()\n }\n }\n}\n\nimpl<T> Default for Option<T> {\n fn default() -> Self {\n Option::none()\n }\n}\n\nimpl<T> Eq for Option<T>\nwhere\n T: Eq,\n{\n fn eq(self, other: Self) -> bool {\n if self._is_some == other._is_some {\n if self._is_some {\n self._value == other._value\n } else {\n true\n }\n } else {\n false\n }\n }\n}\n\nimpl<T> Hash for Option<T>\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self._is_some.hash(state);\n if self._is_some {\n self._value.hash(state);\n }\n }\n}\n\n// For this impl we're declaring Option::none < Option::some\nimpl<T> Ord for Option<T>\nwhere\n T: Ord,\n{\n fn cmp(self, other: Self) -> Ordering {\n if self._is_some {\n if other._is_some {\n self._value.cmp(other._value)\n } else {\n Ordering::greater()\n }\n } else if other._is_some {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n"
5931
5867
  },
5932
5868
  "410": {
5933
5869
  "function_locations": [
@@ -6785,355 +6721,355 @@
6785
6721
  },
6786
6722
  {
6787
6723
  "name": "BoundedVec<T, MaxLen>::get",
6788
- "start": 3201
6724
+ "start": 3202
6789
6725
  },
6790
6726
  {
6791
6727
  "name": "BoundedVec<T, MaxLen>::get_unchecked",
6792
- "start": 4108
6728
+ "start": 4110
6793
6729
  },
6794
6730
  {
6795
6731
  "name": "BoundedVec<T, MaxLen>::set",
6796
- "start": 4691
6732
+ "start": 4693
6797
6733
  },
6798
6734
  {
6799
6735
  "name": "BoundedVec<T, MaxLen>::set_unchecked",
6800
- "start": 6219
6736
+ "start": 6221
6801
6737
  },
6802
6738
  {
6803
6739
  "name": "BoundedVec<T, MaxLen>::push",
6804
- "start": 6757
6740
+ "start": 6759
6805
6741
  },
6806
6742
  {
6807
6743
  "name": "BoundedVec<T, MaxLen>::len",
6808
- "start": 7364
6744
+ "start": 7367
6809
6745
  },
6810
6746
  {
6811
6747
  "name": "BoundedVec<T, MaxLen>::max_len",
6812
- "start": 7804
6748
+ "start": 7808
6813
6749
  },
6814
6750
  {
6815
6751
  "name": "BoundedVec<T, MaxLen>::storage",
6816
- "start": 8402
6752
+ "start": 8407
6817
6753
  },
6818
6754
  {
6819
6755
  "name": "BoundedVec<T, MaxLen>::extend_from_array",
6820
- "start": 8958
6756
+ "start": 8963
6821
6757
  },
6822
6758
  {
6823
6759
  "name": "BoundedVec<T, MaxLen>::extend_from_vector",
6824
- "start": 9729
6760
+ "start": 9734
6825
6761
  },
6826
6762
  {
6827
6763
  "name": "BoundedVec<T, MaxLen>::extend_from_bounded_vec",
6828
- "start": 10674
6764
+ "start": 10679
6829
6765
  },
6830
6766
  {
6831
6767
  "name": "BoundedVec<T, MaxLen>::from_array",
6832
- "start": 11589
6768
+ "start": 11594
6833
6769
  },
6834
6770
  {
6835
6771
  "name": "BoundedVec<T, MaxLen>::pop",
6836
- "start": 12332
6772
+ "start": 12337
6837
6773
  },
6838
6774
  {
6839
6775
  "name": "BoundedVec<T, MaxLen>::any",
6840
- "start": 12955
6776
+ "start": 12960
6841
6777
  },
6842
6778
  {
6843
6779
  "name": "BoundedVec<T, MaxLen>::map",
6844
- "start": 13870
6780
+ "start": 13876
6845
6781
  },
6846
6782
  {
6847
6783
  "name": "BoundedVec<T, MaxLen>::mapi",
6848
- "start": 14804
6784
+ "start": 14811
6849
6785
  },
6850
6786
  {
6851
6787
  "name": "BoundedVec<T, MaxLen>::for_each",
6852
- "start": 15696
6788
+ "start": 15704
6853
6789
  },
6854
6790
  {
6855
6791
  "name": "BoundedVec<T, MaxLen>::for_eachi",
6856
- "start": 16500
6792
+ "start": 16509
6857
6793
  },
6858
6794
  {
6859
6795
  "name": "BoundedVec<T, MaxLen>::from_parts",
6860
- "start": 17499
6796
+ "start": 17508
6861
6797
  },
6862
6798
  {
6863
6799
  "name": "BoundedVec<T, MaxLen>::from_parts_unchecked",
6864
- "start": 19148
6800
+ "start": 19157
6865
6801
  },
6866
6802
  {
6867
6803
  "name": "<impl Eq for BoundedVec<T, MaxLen>>::eq",
6868
- "start": 19360
6804
+ "start": 19369
6869
6805
  },
6870
6806
  {
6871
6807
  "name": "<impl From<[T; Len]> for BoundedVec<T, MaxLen>>::from",
6872
- "start": 19931
6808
+ "start": 19940
6873
6809
  },
6874
6810
  {
6875
6811
  "name": "bounded_vec_tests::get::panics_when_reading_elements_past_end_of_vec",
6876
- "start": 20214
6812
+ "start": 20223
6877
6813
  },
6878
6814
  {
6879
6815
  "name": "bounded_vec_tests::get::panics_when_reading_beyond_length",
6880
- "start": 20449
6816
+ "start": 20458
6881
6817
  },
6882
6818
  {
6883
6819
  "name": "bounded_vec_tests::get::get_works_within_bounds",
6884
- "start": 20624
6820
+ "start": 20633
6885
6821
  },
6886
6822
  {
6887
6823
  "name": "bounded_vec_tests::get::get_unchecked_works",
6888
- "start": 20883
6824
+ "start": 20892
6889
6825
  },
6890
6826
  {
6891
6827
  "name": "bounded_vec_tests::get::get_unchecked_works_past_len",
6892
- "start": 21127
6828
+ "start": 21136
6893
6829
  },
6894
6830
  {
6895
6831
  "name": "bounded_vec_tests::set::set_updates_values_properly",
6896
- "start": 21400
6832
+ "start": 21409
6897
6833
  },
6898
6834
  {
6899
6835
  "name": "bounded_vec_tests::set::panics_when_writing_elements_past_end_of_vec",
6900
- "start": 22038
6836
+ "start": 22047
6901
6837
  },
6902
6838
  {
6903
6839
  "name": "bounded_vec_tests::set::panics_when_setting_beyond_length",
6904
- "start": 22273
6840
+ "start": 22282
6905
6841
  },
6906
6842
  {
6907
6843
  "name": "bounded_vec_tests::set::set_unchecked_operations",
6908
- "start": 22448
6844
+ "start": 22457
6909
6845
  },
6910
6846
  {
6911
6847
  "name": "bounded_vec_tests::set::set_unchecked_operations_past_len",
6912
- "start": 22780
6848
+ "start": 22789
6913
6849
  },
6914
6850
  {
6915
6851
  "name": "bounded_vec_tests::set::set_preserves_other_elements",
6916
- "start": 23044
6852
+ "start": 23053
6917
6853
  },
6918
6854
  {
6919
6855
  "name": "bounded_vec_tests::any::returns_false_if_predicate_not_satisfied",
6920
- "start": 23512
6856
+ "start": 23521
6921
6857
  },
6922
6858
  {
6923
6859
  "name": "bounded_vec_tests::any::returns_true_if_predicate_satisfied",
6924
- "start": 23766
6860
+ "start": 23775
6925
6861
  },
6926
6862
  {
6927
6863
  "name": "bounded_vec_tests::any::returns_false_on_empty_boundedvec",
6928
- "start": 24015
6864
+ "start": 24024
6929
6865
  },
6930
6866
  {
6931
6867
  "name": "bounded_vec_tests::any::any_with_complex_predicates",
6932
- "start": 24226
6868
+ "start": 24235
6933
6869
  },
6934
6870
  {
6935
6871
  "name": "bounded_vec_tests::any::any_with_partial_vector",
6936
- "start": 24589
6872
+ "start": 24598
6937
6873
  },
6938
6874
  {
6939
6875
  "name": "bounded_vec_tests::map::applies_function_correctly",
6940
- "start": 24976
6876
+ "start": 24985
6941
6877
  },
6942
6878
  {
6943
6879
  "name": "bounded_vec_tests::map::applies_function_that_changes_return_type",
6944
- "start": 25398
6880
+ "start": 25407
6945
6881
  },
6946
6882
  {
6947
6883
  "name": "bounded_vec_tests::map::does_not_apply_function_past_len",
6948
- "start": 25746
6884
+ "start": 25755
6949
6885
  },
6950
6886
  {
6951
6887
  "name": "bounded_vec_tests::map::map_with_conditional_logic",
6952
- "start": 26119
6888
+ "start": 26128
6953
6889
  },
6954
6890
  {
6955
6891
  "name": "bounded_vec_tests::map::map_preserves_length",
6956
- "start": 26443
6892
+ "start": 26452
6957
6893
  },
6958
6894
  {
6959
6895
  "name": "bounded_vec_tests::map::map_on_empty_vector",
6960
- "start": 26735
6896
+ "start": 26744
6961
6897
  },
6962
6898
  {
6963
6899
  "name": "bounded_vec_tests::mapi::applies_function_correctly",
6964
- "start": 27109
6900
+ "start": 27118
6965
6901
  },
6966
6902
  {
6967
6903
  "name": "bounded_vec_tests::mapi::applies_function_that_changes_return_type",
6968
- "start": 27542
6904
+ "start": 27551
6969
6905
  },
6970
6906
  {
6971
6907
  "name": "bounded_vec_tests::mapi::does_not_apply_function_past_len",
6972
- "start": 27899
6908
+ "start": 27908
6973
6909
  },
6974
6910
  {
6975
6911
  "name": "bounded_vec_tests::mapi::mapi_with_index_branching_logic",
6976
- "start": 28281
6912
+ "start": 28290
6977
6913
  },
6978
6914
  {
6979
6915
  "name": "bounded_vec_tests::for_each::for_each_map",
6980
- "start": 28840
6916
+ "start": 28849
6981
6917
  },
6982
6918
  {
6983
6919
  "name": "bounded_vec_tests::for_each::smoke_test",
6984
- "start": 29070
6920
+ "start": 29079
6985
6921
  },
6986
6922
  {
6987
6923
  "name": "bounded_vec_tests::for_each::applies_function_correctly",
6988
- "start": 29478
6924
+ "start": 29487
6989
6925
  },
6990
6926
  {
6991
6927
  "name": "bounded_vec_tests::for_each::applies_function_that_changes_return_type",
6992
- "start": 29812
6928
+ "start": 29821
6993
6929
  },
6994
6930
  {
6995
6931
  "name": "bounded_vec_tests::for_each::does_not_apply_function_past_len",
6996
- "start": 30170
6932
+ "start": 30179
6997
6933
  },
6998
6934
  {
6999
6935
  "name": "bounded_vec_tests::for_each::for_each_on_empty_vector",
7000
- "start": 30551
6936
+ "start": 30560
7001
6937
  },
7002
6938
  {
7003
6939
  "name": "bounded_vec_tests::for_each::for_each_with_side_effects",
7004
- "start": 30837
6940
+ "start": 30846
7005
6941
  },
7006
6942
  {
7007
6943
  "name": "bounded_vec_tests::for_eachi::for_eachi_mapi",
7008
- "start": 31394
6944
+ "start": 31403
7009
6945
  },
7010
6946
  {
7011
6947
  "name": "bounded_vec_tests::for_eachi::smoke_test",
7012
- "start": 31631
6948
+ "start": 31640
7013
6949
  },
7014
6950
  {
7015
6951
  "name": "bounded_vec_tests::for_eachi::applies_function_correctly",
7016
- "start": 32087
6952
+ "start": 32096
7017
6953
  },
7018
6954
  {
7019
6955
  "name": "bounded_vec_tests::for_eachi::applies_function_that_changes_return_type",
7020
- "start": 32431
6956
+ "start": 32440
7021
6957
  },
7022
6958
  {
7023
6959
  "name": "bounded_vec_tests::for_eachi::does_not_apply_function_past_len",
7024
- "start": 32799
6960
+ "start": 32808
7025
6961
  },
7026
6962
  {
7027
6963
  "name": "bounded_vec_tests::for_eachi::for_eachi_on_empty_vector",
7028
- "start": 33186
6964
+ "start": 33195
7029
6965
  },
7030
6966
  {
7031
6967
  "name": "bounded_vec_tests::for_eachi::for_eachi_with_index_tracking",
7032
- "start": 33479
6968
+ "start": 33488
7033
6969
  },
7034
6970
  {
7035
6971
  "name": "bounded_vec_tests::from_array::empty",
7036
- "start": 33956
6972
+ "start": 33965
7037
6973
  },
7038
6974
  {
7039
6975
  "name": "bounded_vec_tests::from_array::equal_len",
7040
- "start": 34266
6976
+ "start": 34275
7041
6977
  },
7042
6978
  {
7043
6979
  "name": "bounded_vec_tests::from_array::max_len_greater_then_array_len",
7044
- "start": 34583
6980
+ "start": 34592
7045
6981
  },
7046
6982
  {
7047
6983
  "name": "bounded_vec_tests::from_array::max_len_lower_then_array_len",
7048
- "start": 35054
6984
+ "start": 35063
7049
6985
  },
7050
6986
  {
7051
6987
  "name": "bounded_vec_tests::from_array::from_array_preserves_order",
7052
- "start": 35197
6988
+ "start": 35206
7053
6989
  },
7054
6990
  {
7055
6991
  "name": "bounded_vec_tests::from_array::from_array_with_different_types",
7056
- "start": 35486
6992
+ "start": 35495
7057
6993
  },
7058
6994
  {
7059
6995
  "name": "bounded_vec_tests::trait_from::simple",
7060
- "start": 35923
6996
+ "start": 35932
7061
6997
  },
7062
6998
  {
7063
6999
  "name": "bounded_vec_tests::trait_eq::empty_equality",
7064
- "start": 36361
7000
+ "start": 36370
7065
7001
  },
7066
7002
  {
7067
7003
  "name": "bounded_vec_tests::trait_eq::inequality",
7068
- "start": 36610
7004
+ "start": 36619
7069
7005
  },
7070
7006
  {
7071
7007
  "name": "bounded_vec_tests::from_parts::from_parts",
7072
- "start": 37019
7008
+ "start": 37028
7073
7009
  },
7074
7010
  {
7075
7011
  "name": "bounded_vec_tests::from_parts::from_parts_unchecked",
7076
- "start": 37609
7012
+ "start": 37618
7077
7013
  },
7078
7014
  {
7079
7015
  "name": "bounded_vec_tests::push_pop::push_and_pop_operations",
7080
- "start": 38391
7016
+ "start": 38400
7081
7017
  },
7082
7018
  {
7083
7019
  "name": "bounded_vec_tests::push_pop::push_to_full_vector",
7084
- "start": 39017
7020
+ "start": 39026
7085
7021
  },
7086
7022
  {
7087
7023
  "name": "bounded_vec_tests::push_pop::pop_from_empty_vector",
7088
- "start": 39291
7024
+ "start": 39300
7089
7025
  },
7090
7026
  {
7091
7027
  "name": "bounded_vec_tests::push_pop::push_pop_cycle",
7092
- "start": 39460
7028
+ "start": 39469
7093
7029
  },
7094
7030
  {
7095
7031
  "name": "bounded_vec_tests::extend::extend_from_array",
7096
- "start": 40106
7032
+ "start": 40115
7097
7033
  },
7098
7034
  {
7099
7035
  "name": "bounded_vec_tests::extend::extend_from_vector",
7100
- "start": 40452
7036
+ "start": 40461
7101
7037
  },
7102
7038
  {
7103
7039
  "name": "bounded_vec_tests::extend::extend_from_bounded_vec",
7104
- "start": 40816
7040
+ "start": 40825
7105
7041
  },
7106
7042
  {
7107
7043
  "name": "bounded_vec_tests::extend::extend_array_beyond_max_len",
7108
- "start": 41356
7044
+ "start": 41365
7109
7045
  },
7110
7046
  {
7111
7047
  "name": "bounded_vec_tests::extend::extend_vector_beyond_max_len",
7112
- "start": 41634
7048
+ "start": 41643
7113
7049
  },
7114
7050
  {
7115
7051
  "name": "bounded_vec_tests::extend::extend_bounded_vec_beyond_max_len",
7116
- "start": 41937
7052
+ "start": 41946
7117
7053
  },
7118
7054
  {
7119
7055
  "name": "bounded_vec_tests::extend::extend_with_empty_collections",
7120
- "start": 42223
7056
+ "start": 42232
7121
7057
  },
7122
7058
  {
7123
7059
  "name": "bounded_vec_tests::storage::storage_consistency",
7124
- "start": 42823
7060
+ "start": 42832
7125
7061
  },
7126
7062
  {
7127
7063
  "name": "bounded_vec_tests::storage::storage_after_pop",
7128
- "start": 43325
7064
+ "start": 43334
7129
7065
  },
7130
7066
  {
7131
7067
  "name": "bounded_vec_tests::storage::vector_immutable",
7132
- "start": 43643
7068
+ "start": 43652
7133
7069
  }
7134
7070
  ],
7135
7071
  "path": "std/collections/bounded_vec.nr",
7136
- "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec<T, MaxLen>` is a growable storage similar to a built-in vector except that it\n/// is bounded with a maximum possible length. `BoundedVec` is also not\n/// subject to the same restrictions vectors are (notably, nested vectors are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec<T, N>` should generally be preferred over vectors when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec<Field, 10> = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec<T, let MaxLen: u32> {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl<T, let MaxLen: u32> BoundedVec<T, MaxLen> {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec<Field, 10> = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec<Field, 10> {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec<Field, 3> = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo<let N: u32>(v: BoundedVec<u32, N>) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three<let N: u32>(v: BoundedVec<u32, N>) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo<let N: u32>(v: BoundedVec<u32, N>) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec<Field, 2> = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec<Field, 4> = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec<Field, 5> = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec<T, MaxLen>) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec<Field, 5> = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec<Field, 3> = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array<let Len: u32>(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given vector to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec<Field, 3> = BoundedVec::new();\n /// vec.extend_from_vector([2, 4].as_vector());\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_vector(&mut self, vector: [T]) {\n let new_len = self.len + vector.len();\n assert(new_len <= MaxLen, \"extend_from_vector out of bounds\");\n for i in 0..vector.len() {\n self.storage[self.len + i] = vector[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec<Field, 5> = BoundedVec::new();\n /// let mut v2: BoundedVec<Field, 7> = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec<let Len: u32>(&mut self, vec: BoundedVec<T, Len>) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n for i in 0..Len {\n if i < append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec<Field, 10> = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array<let Len: u32>(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec<T, MaxLen> = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec<Field, 2> = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0, \"cannot pop from an empty vector\");\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec<u32, 3> = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> BoundedVec<U, MaxLen> {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi<U, Env>(self, f: fn[Env](u32, T) -> U) -> BoundedVec<U, MaxLen> {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::<u32, 4>::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each<Env>(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::<u32, 4>::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi<Env>(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use [`from_parts_unchecked`][Self::from_parts_unchecked] to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec<u32, 4> = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec<u32, 4> = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec<u32, 4> = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec<u32, 4> = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl<T, let MaxLen: u32> Eq for BoundedVec<T, MaxLen>\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec<T, MaxLen>) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl<T, let MaxLen: u32, let Len: u32> From<[T; Len]> for BoundedVec<T, MaxLen> {\n fn from(array: [T; Len]) -> BoundedVec<T, MaxLen> {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec<Field, 5> = BoundedVec::new();\n\n let _ = vec.get(0);\n }\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_beyond_length() {\n let vec: BoundedVec<u32, 5> = BoundedVec::from_array([1, 2, 3]);\n let _ = vec.get(3);\n }\n\n #[test]\n fn get_works_within_bounds() {\n let vec: BoundedVec<u32, 5> = BoundedVec::from_array([1, 2, 3, 4, 5]);\n assert_eq(vec.get(0), 1);\n assert_eq(vec.get(2), 3);\n assert_eq(vec.get(4), 5);\n }\n\n #[test]\n fn get_unchecked_works() {\n let vec: BoundedVec<u32, 5> = BoundedVec::from_array([1, 2, 3]);\n assert_eq(vec.get_unchecked(0), 1);\n assert_eq(vec.get_unchecked(2), 3);\n }\n\n #[test]\n fn get_unchecked_works_past_len() {\n let vec: BoundedVec<u32, 5> = BoundedVec::from_array([1, 2, 3]);\n assert_eq(vec.get_unchecked(4), 0);\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec<Field, 5> = BoundedVec::new();\n vec.set(0, 42);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_setting_beyond_length() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::from_array([1, 2, 3]);\n vec.set(3, 4);\n }\n\n #[test]\n fn set_unchecked_operations() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n vec.push(1);\n vec.push(2);\n\n vec.set_unchecked(0, 10);\n assert_eq(vec.get(0), 10);\n }\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn set_unchecked_operations_past_len() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n vec.push(1);\n vec.push(2);\n\n vec.set_unchecked(3, 40);\n assert_eq(vec.get(3), 40);\n }\n\n #[test]\n fn set_preserves_other_elements() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::from_array([1, 2, 3, 4, 5]);\n\n vec.set(2, 30);\n assert_eq(vec.get(0), 1);\n assert_eq(vec.get(1), 2);\n assert_eq(vec.get(2), 30);\n assert_eq(vec.get(3), 4);\n assert_eq(vec.get(4), 5);\n }\n }\n\n mod any {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn returns_false_if_predicate_not_satisfied() {\n let vec: BoundedVec<bool, 4> = BoundedVec::from_array([false, false, false, false]);\n let result = vec.any(|value| value);\n\n assert(!result);\n }\n\n #[test]\n fn returns_true_if_predicate_satisfied() {\n let vec: BoundedVec<bool, 4> = BoundedVec::from_array([false, false, true, true]);\n let result = vec.any(|value| value);\n\n assert(result);\n }\n\n #[test]\n fn returns_false_on_empty_boundedvec() {\n let vec: BoundedVec<bool, 0> = BoundedVec::new();\n let result = vec.any(|value| value);\n\n assert(!result);\n }\n\n #[test]\n fn any_with_complex_predicates() {\n let vec: BoundedVec<u32, 5> = BoundedVec::from_array([1, 2, 3, 4, 5]);\n\n assert(vec.any(|x| x > 3));\n assert(!vec.any(|x| x > 10));\n assert(vec.any(|x| x % 2 == 0)); // has a even number\n assert(vec.any(|x| x == 3)); // has a specific value\n }\n\n #[test]\n fn any_with_partial_vector() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n vec.push(1);\n vec.push(2);\n\n assert(vec.any(|x| x == 1));\n assert(vec.any(|x| x == 2));\n assert(!vec.any(|x| x == 3));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec<Field, 4> = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n\n #[test]\n fn map_with_conditional_logic() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n\n let result = vec.map(|x| if x % 2 == 0 { x * 2 } else { x });\n let expected = BoundedVec::from_array([1, 4, 3, 8]);\n assert_eq(result, expected);\n }\n\n #[test]\n fn map_preserves_length() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|x| x * 2);\n\n assert_eq(result.len(), vec.len());\n assert_eq(result.max_len(), vec.max_len());\n }\n\n #[test]\n fn map_on_empty_vector() {\n let vec: BoundedVec<u32, 5> = BoundedVec::new();\n let result = vec.map(|x| x * 2);\n assert_eq(result, vec);\n assert_eq(result.len(), 0);\n assert_eq(result.max_len(), 5);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec<Field, 4> = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n\n #[test]\n fn mapi_with_index_branching_logic() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n\n let result = vec.mapi(|i, x| if i % 2 == 0 { x * 2 } else { x });\n let expected = BoundedVec::from_array([2, 2, 6, 4]);\n assert_eq(result, expected);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map<T, U, Env, let MaxLen: u32>(\n input: BoundedVec<T, MaxLen>,\n f: fn[Env](T) -> U,\n ) -> BoundedVec<U, MaxLen> {\n let mut output = BoundedVec::<U, MaxLen>::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec<Field, 4> = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n\n #[test]\n fn for_each_on_empty_vector() {\n let vec: BoundedVec<u32, 5> = BoundedVec::new();\n let mut count = 0;\n let count_ref = &mut count;\n vec.for_each(|_| { *count_ref += 1; });\n assert_eq(count, 0);\n }\n\n #[test]\n fn for_each_with_side_effects() {\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([1, 2, 3]);\n let mut seen = BoundedVec::<u32, 3>::new();\n let seen_ref = &mut seen;\n vec.for_each(|x| seen_ref.push(x));\n assert_eq(seen, vec);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi<T, U, Env, let MaxLen: u32>(\n input: BoundedVec<T, MaxLen>,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec<U, MaxLen> {\n let mut output = BoundedVec::<U, MaxLen>::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec<Field, 4> = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n\n #[test]\n fn for_eachi_on_empty_vector() {\n let vec: BoundedVec<u32, 5> = BoundedVec::new();\n let mut count = 0;\n let count_ref = &mut count;\n vec.for_eachi(|_, _| { *count_ref += 1; });\n assert_eq(count, 0);\n }\n\n #[test]\n fn for_eachi_with_index_tracking() {\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([10, 20, 30]);\n let mut indices = BoundedVec::<u32, 3>::new();\n let indices_ref = &mut indices;\n vec.for_eachi(|i, _| indices_ref.push(i));\n\n let expected = BoundedVec::from_array([0, 1, 2]);\n assert_eq(indices, expected);\n }\n\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec<Field, 10> = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec<Field, 2> = BoundedVec::from_array([0; 3]);\n }\n\n #[test]\n fn from_array_preserves_order() {\n let array = [5, 3, 1, 4, 2];\n let vec: BoundedVec<u32, 5> = BoundedVec::from_array(array);\n for i in 0..array.len() {\n assert_eq(vec.get(i), array[i]);\n }\n }\n\n #[test]\n fn from_array_with_different_types() {\n let bool_array = [true, false, true];\n let bool_vec: BoundedVec<bool, 3> = BoundedVec::from_array(bool_array);\n assert_eq(bool_vec.len(), 3);\n assert_eq(bool_vec.get(0), true);\n assert_eq(bool_vec.get(1), false);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec<Field, 10> = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let bounded_vec1: BoundedVec<Field, 3> = BoundedVec::new();\n let bounded_vec2: BoundedVec<Field, 3> = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec<Field, 3> = BoundedVec::new();\n let mut bounded_vec2: BoundedVec<Field, 3> = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec<u32, 4> = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec<u32, 4> = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec<u32, 4> = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec<u32, 4> = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec<u32, 4> = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec<u32, 4> = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n\n mod push_pop {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn push_and_pop_operations() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n\n assert_eq(vec.len(), 0);\n\n vec.push(1);\n assert_eq(vec.len(), 1);\n assert_eq(vec.get(0), 1);\n\n vec.push(2);\n assert_eq(vec.len(), 2);\n assert_eq(vec.get(1), 2);\n\n let popped = vec.pop();\n assert_eq(popped, 2);\n assert_eq(vec.len(), 1);\n\n let popped2 = vec.pop();\n assert_eq(popped2, 1);\n assert_eq(vec.len(), 0);\n }\n\n #[test(should_fail_with = \"push out of bounds\")]\n fn push_to_full_vector() {\n let mut vec: BoundedVec<u32, 2> = BoundedVec::new();\n vec.push(1);\n vec.push(2);\n vec.push(3); // should panic\n }\n\n #[test(should_fail_with = \"cannot pop from an empty vector\")]\n fn pop_from_empty_vector() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n let _ = vec.pop(); // should panic\n }\n\n #[test]\n fn push_pop_cycle() {\n let mut vec: BoundedVec<u32, 3> = BoundedVec::new();\n\n // push to full\n vec.push(1);\n vec.push(2);\n vec.push(3);\n assert_eq(vec.len(), 3);\n\n // pop all\n assert_eq(vec.pop(), 3);\n assert_eq(vec.pop(), 2);\n assert_eq(vec.pop(), 1);\n assert_eq(vec.len(), 0);\n\n // push again\n vec.push(4);\n assert_eq(vec.len(), 1);\n assert_eq(vec.get(0), 4);\n }\n }\n\n mod extend {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn extend_from_array() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n vec.push(1);\n vec.extend_from_array([2, 3]);\n\n assert_eq(vec.len(), 3);\n assert_eq(vec.get(0), 1);\n assert_eq(vec.get(1), 2);\n assert_eq(vec.get(2), 3);\n }\n\n #[test]\n fn extend_from_vector() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n vec.push(1);\n vec.extend_from_vector([2, 3].as_vector());\n\n assert_eq(vec.len(), 3);\n assert_eq(vec.get(0), 1);\n assert_eq(vec.get(1), 2);\n assert_eq(vec.get(2), 3);\n }\n\n #[test]\n fn extend_from_bounded_vec() {\n let mut vec1: BoundedVec<u32, 5> = BoundedVec::new();\n let mut vec2: BoundedVec<u32, 3> = BoundedVec::new();\n\n vec1.push(1);\n vec2.push(2);\n vec2.push(3);\n\n vec1.extend_from_bounded_vec(vec2);\n\n assert_eq(vec1.len(), 3);\n assert_eq(vec1.get(0), 1);\n assert_eq(vec1.get(1), 2);\n assert_eq(vec1.get(2), 3);\n }\n\n #[test(should_fail_with = \"extend_from_array out of bounds\")]\n fn extend_array_beyond_max_len() {\n let mut vec: BoundedVec<u32, 3> = BoundedVec::new();\n vec.push(1);\n vec.extend_from_array([2, 3, 4]); // should panic\n }\n\n #[test(should_fail_with = \"extend_from_vector out of bounds\")]\n fn extend_vector_beyond_max_len() {\n let mut vec: BoundedVec<u32, 3> = BoundedVec::new();\n vec.push(1);\n vec.extend_from_vector([2, 3, 4].as_vector()); // S]should panic\n }\n\n #[test(should_fail_with = \"extend_from_bounded_vec out of bounds\")]\n fn extend_bounded_vec_beyond_max_len() {\n let mut vec: BoundedVec<u32, 3> = BoundedVec::new();\n let other: BoundedVec<u32, 5> = BoundedVec::from_array([1, 2, 3, 4, 5]);\n vec.extend_from_bounded_vec(other); // should panic\n }\n\n #[test]\n fn extend_with_empty_collections() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n let original_len = vec.len();\n\n vec.extend_from_array([]);\n assert_eq(vec.len(), original_len);\n\n vec.extend_from_vector([].as_vector());\n assert_eq(vec.len(), original_len);\n\n let empty: BoundedVec<u32, 3> = BoundedVec::new();\n vec.extend_from_bounded_vec(empty);\n assert_eq(vec.len(), original_len);\n }\n }\n\n mod storage {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn storage_consistency() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n\n // test initial storage state\n assert_eq(vec.storage(), [0, 0, 0, 0, 0]);\n\n vec.push(1);\n vec.push(2);\n\n // test storage after modifications\n assert_eq(vec.storage(), [1, 2, 0, 0, 0]);\n\n // storage doesn't change length\n assert_eq(vec.len(), 2);\n assert_eq(vec.max_len(), 5);\n }\n\n #[test]\n fn storage_after_pop() {\n let mut vec: BoundedVec<u32, 3> = BoundedVec::from_array([1, 2, 3]);\n\n let _ = vec.pop();\n // after pop, the last element should be zeroed\n assert_eq(vec.storage(), [1, 2, 0]);\n assert_eq(vec.len(), 2);\n }\n\n #[test]\n fn vector_immutable() {\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([1, 2, 3]);\n let storage = vec.storage();\n\n assert_eq(storage, [1, 2, 3]);\n\n // Verify that the original vector is unchanged\n assert_eq(vec.len(), 3);\n assert_eq(vec.get(0), 1);\n assert_eq(vec.get(1), 2);\n assert_eq(vec.get(2), 3);\n }\n }\n}\n"
7072
+ "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec<T, MaxLen>` is a growable storage similar to a built-in vector except that it\n/// is bounded with a maximum possible length. `BoundedVec` is also not\n/// subject to the same restrictions vectors are (notably, nested vectors are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec<T, N>` should generally be preferred over vectors when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec<Field, 10> = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec<T, let MaxLen: u32> {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl<T, let MaxLen: u32> BoundedVec<T, MaxLen> {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec<Field, 10> = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec<Field, 10> {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec<Field, 3> = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo<let N: u32>(v: BoundedVec<u32, N>) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(&self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three<let N: u32>(v: BoundedVec<u32, N>) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(&self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo<let N: u32>(v: BoundedVec<u32, N>) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec<Field, 2> = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec<Field, 4> = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(&self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec<Field, 5> = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: &BoundedVec<T, MaxLen>) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec<Field, 5> = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(&self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec<Field, 3> = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array<let Len: u32>(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given vector to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec<Field, 3> = BoundedVec::new();\n /// vec.extend_from_vector([2, 4].as_vector());\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_vector(&mut self, vector: [T]) {\n let new_len = self.len + vector.len();\n assert(new_len <= MaxLen, \"extend_from_vector out of bounds\");\n for i in 0..vector.len() {\n self.storage[self.len + i] = vector[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec<Field, 5> = BoundedVec::new();\n /// let mut v2: BoundedVec<Field, 7> = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec<let Len: u32>(&mut self, vec: BoundedVec<T, Len>) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n for i in 0..Len {\n if i < append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec<Field, 10> = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array<let Len: u32>(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec<T, MaxLen> = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec<Field, 2> = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0, \"cannot pop from an empty vector\");\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec<u32, 3> = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map<U, Env>(&self, f: fn[Env](T) -> U) -> BoundedVec<U, MaxLen> {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi<U, Env>(&self, f: fn[Env](u32, T) -> U) -> BoundedVec<U, MaxLen> {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::<u32, 4>::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each<Env>(&self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::<u32, 4>::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi<Env>(&self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use [`from_parts_unchecked`][Self::from_parts_unchecked] to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec<u32, 4> = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec<u32, 4> = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec<u32, 4> = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec<u32, 4> = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl<T, let MaxLen: u32> Eq for BoundedVec<T, MaxLen>\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec<T, MaxLen>) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl<T, let MaxLen: u32, let Len: u32> From<[T; Len]> for BoundedVec<T, MaxLen> {\n fn from(array: [T; Len]) -> BoundedVec<T, MaxLen> {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec<Field, 5> = BoundedVec::new();\n\n let _ = vec.get(0);\n }\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_beyond_length() {\n let vec: BoundedVec<u32, 5> = BoundedVec::from_array([1, 2, 3]);\n let _ = vec.get(3);\n }\n\n #[test]\n fn get_works_within_bounds() {\n let vec: BoundedVec<u32, 5> = BoundedVec::from_array([1, 2, 3, 4, 5]);\n assert_eq(vec.get(0), 1);\n assert_eq(vec.get(2), 3);\n assert_eq(vec.get(4), 5);\n }\n\n #[test]\n fn get_unchecked_works() {\n let vec: BoundedVec<u32, 5> = BoundedVec::from_array([1, 2, 3]);\n assert_eq(vec.get_unchecked(0), 1);\n assert_eq(vec.get_unchecked(2), 3);\n }\n\n #[test]\n fn get_unchecked_works_past_len() {\n let vec: BoundedVec<u32, 5> = BoundedVec::from_array([1, 2, 3]);\n assert_eq(vec.get_unchecked(4), 0);\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec<Field, 5> = BoundedVec::new();\n vec.set(0, 42);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_setting_beyond_length() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::from_array([1, 2, 3]);\n vec.set(3, 4);\n }\n\n #[test]\n fn set_unchecked_operations() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n vec.push(1);\n vec.push(2);\n\n vec.set_unchecked(0, 10);\n assert_eq(vec.get(0), 10);\n }\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn set_unchecked_operations_past_len() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n vec.push(1);\n vec.push(2);\n\n vec.set_unchecked(3, 40);\n assert_eq(vec.get(3), 40);\n }\n\n #[test]\n fn set_preserves_other_elements() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::from_array([1, 2, 3, 4, 5]);\n\n vec.set(2, 30);\n assert_eq(vec.get(0), 1);\n assert_eq(vec.get(1), 2);\n assert_eq(vec.get(2), 30);\n assert_eq(vec.get(3), 4);\n assert_eq(vec.get(4), 5);\n }\n }\n\n mod any {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn returns_false_if_predicate_not_satisfied() {\n let vec: BoundedVec<bool, 4> = BoundedVec::from_array([false, false, false, false]);\n let result = vec.any(|value| value);\n\n assert(!result);\n }\n\n #[test]\n fn returns_true_if_predicate_satisfied() {\n let vec: BoundedVec<bool, 4> = BoundedVec::from_array([false, false, true, true]);\n let result = vec.any(|value| value);\n\n assert(result);\n }\n\n #[test]\n fn returns_false_on_empty_boundedvec() {\n let vec: BoundedVec<bool, 0> = BoundedVec::new();\n let result = vec.any(|value| value);\n\n assert(!result);\n }\n\n #[test]\n fn any_with_complex_predicates() {\n let vec: BoundedVec<u32, 5> = BoundedVec::from_array([1, 2, 3, 4, 5]);\n\n assert(vec.any(|x| x > 3));\n assert(!vec.any(|x| x > 10));\n assert(vec.any(|x| x % 2 == 0)); // has a even number\n assert(vec.any(|x| x == 3)); // has a specific value\n }\n\n #[test]\n fn any_with_partial_vector() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n vec.push(1);\n vec.push(2);\n\n assert(vec.any(|x| x == 1));\n assert(vec.any(|x| x == 2));\n assert(!vec.any(|x| x == 3));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec<Field, 4> = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n\n #[test]\n fn map_with_conditional_logic() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n\n let result = vec.map(|x| if x % 2 == 0 { x * 2 } else { x });\n let expected = BoundedVec::from_array([1, 4, 3, 8]);\n assert_eq(result, expected);\n }\n\n #[test]\n fn map_preserves_length() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|x| x * 2);\n\n assert_eq(result.len(), vec.len());\n assert_eq(result.max_len(), vec.max_len());\n }\n\n #[test]\n fn map_on_empty_vector() {\n let vec: BoundedVec<u32, 5> = BoundedVec::new();\n let result = vec.map(|x| x * 2);\n assert_eq(result, vec);\n assert_eq(result.len(), 0);\n assert_eq(result.max_len(), 5);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec<Field, 4> = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n\n #[test]\n fn mapi_with_index_branching_logic() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n\n let result = vec.mapi(|i, x| if i % 2 == 0 { x * 2 } else { x });\n let expected = BoundedVec::from_array([2, 2, 6, 4]);\n assert_eq(result, expected);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map<T, U, Env, let MaxLen: u32>(\n input: BoundedVec<T, MaxLen>,\n f: fn[Env](T) -> U,\n ) -> BoundedVec<U, MaxLen> {\n let mut output = BoundedVec::<U, MaxLen>::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec<Field, 4> = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n\n #[test]\n fn for_each_on_empty_vector() {\n let vec: BoundedVec<u32, 5> = BoundedVec::new();\n let mut count = 0;\n let count_ref = &mut count;\n vec.for_each(|_| { *count_ref += 1; });\n assert_eq(count, 0);\n }\n\n #[test]\n fn for_each_with_side_effects() {\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([1, 2, 3]);\n let mut seen = BoundedVec::<u32, 3>::new();\n let seen_ref = &mut seen;\n vec.for_each(|x| seen_ref.push(x));\n assert_eq(seen, vec);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi<T, U, Env, let MaxLen: u32>(\n input: BoundedVec<T, MaxLen>,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec<U, MaxLen> {\n let mut output = BoundedVec::<U, MaxLen>::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec<u32, 4> = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec<Field, 4> = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n\n #[test]\n fn for_eachi_on_empty_vector() {\n let vec: BoundedVec<u32, 5> = BoundedVec::new();\n let mut count = 0;\n let count_ref = &mut count;\n vec.for_eachi(|_, _| { *count_ref += 1; });\n assert_eq(count, 0);\n }\n\n #[test]\n fn for_eachi_with_index_tracking() {\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([10, 20, 30]);\n let mut indices = BoundedVec::<u32, 3>::new();\n let indices_ref = &mut indices;\n vec.for_eachi(|i, _| indices_ref.push(i));\n\n let expected = BoundedVec::from_array([0, 1, 2]);\n assert_eq(indices, expected);\n }\n\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec<Field, 10> = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec<Field, 2> = BoundedVec::from_array([0; 3]);\n }\n\n #[test]\n fn from_array_preserves_order() {\n let array = [5, 3, 1, 4, 2];\n let vec: BoundedVec<u32, 5> = BoundedVec::from_array(array);\n for i in 0..array.len() {\n assert_eq(vec.get(i), array[i]);\n }\n }\n\n #[test]\n fn from_array_with_different_types() {\n let bool_array = [true, false, true];\n let bool_vec: BoundedVec<bool, 3> = BoundedVec::from_array(bool_array);\n assert_eq(bool_vec.len(), 3);\n assert_eq(bool_vec.get(0), true);\n assert_eq(bool_vec.get(1), false);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec<Field, 10> = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let bounded_vec1: BoundedVec<Field, 3> = BoundedVec::new();\n let bounded_vec2: BoundedVec<Field, 3> = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec<Field, 3> = BoundedVec::new();\n let mut bounded_vec2: BoundedVec<Field, 3> = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec<u32, 4> = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec<u32, 4> = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec<u32, 4> = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec<u32, 4> = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec<u32, 4> = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec<u32, 4> = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n\n mod push_pop {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn push_and_pop_operations() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n\n assert_eq(vec.len(), 0);\n\n vec.push(1);\n assert_eq(vec.len(), 1);\n assert_eq(vec.get(0), 1);\n\n vec.push(2);\n assert_eq(vec.len(), 2);\n assert_eq(vec.get(1), 2);\n\n let popped = vec.pop();\n assert_eq(popped, 2);\n assert_eq(vec.len(), 1);\n\n let popped2 = vec.pop();\n assert_eq(popped2, 1);\n assert_eq(vec.len(), 0);\n }\n\n #[test(should_fail_with = \"push out of bounds\")]\n fn push_to_full_vector() {\n let mut vec: BoundedVec<u32, 2> = BoundedVec::new();\n vec.push(1);\n vec.push(2);\n vec.push(3); // should panic\n }\n\n #[test(should_fail_with = \"cannot pop from an empty vector\")]\n fn pop_from_empty_vector() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n let _ = vec.pop(); // should panic\n }\n\n #[test]\n fn push_pop_cycle() {\n let mut vec: BoundedVec<u32, 3> = BoundedVec::new();\n\n // push to full\n vec.push(1);\n vec.push(2);\n vec.push(3);\n assert_eq(vec.len(), 3);\n\n // pop all\n assert_eq(vec.pop(), 3);\n assert_eq(vec.pop(), 2);\n assert_eq(vec.pop(), 1);\n assert_eq(vec.len(), 0);\n\n // push again\n vec.push(4);\n assert_eq(vec.len(), 1);\n assert_eq(vec.get(0), 4);\n }\n }\n\n mod extend {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn extend_from_array() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n vec.push(1);\n vec.extend_from_array([2, 3]);\n\n assert_eq(vec.len(), 3);\n assert_eq(vec.get(0), 1);\n assert_eq(vec.get(1), 2);\n assert_eq(vec.get(2), 3);\n }\n\n #[test]\n fn extend_from_vector() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n vec.push(1);\n vec.extend_from_vector([2, 3].as_vector());\n\n assert_eq(vec.len(), 3);\n assert_eq(vec.get(0), 1);\n assert_eq(vec.get(1), 2);\n assert_eq(vec.get(2), 3);\n }\n\n #[test]\n fn extend_from_bounded_vec() {\n let mut vec1: BoundedVec<u32, 5> = BoundedVec::new();\n let mut vec2: BoundedVec<u32, 3> = BoundedVec::new();\n\n vec1.push(1);\n vec2.push(2);\n vec2.push(3);\n\n vec1.extend_from_bounded_vec(vec2);\n\n assert_eq(vec1.len(), 3);\n assert_eq(vec1.get(0), 1);\n assert_eq(vec1.get(1), 2);\n assert_eq(vec1.get(2), 3);\n }\n\n #[test(should_fail_with = \"extend_from_array out of bounds\")]\n fn extend_array_beyond_max_len() {\n let mut vec: BoundedVec<u32, 3> = BoundedVec::new();\n vec.push(1);\n vec.extend_from_array([2, 3, 4]); // should panic\n }\n\n #[test(should_fail_with = \"extend_from_vector out of bounds\")]\n fn extend_vector_beyond_max_len() {\n let mut vec: BoundedVec<u32, 3> = BoundedVec::new();\n vec.push(1);\n vec.extend_from_vector([2, 3, 4].as_vector()); // S]should panic\n }\n\n #[test(should_fail_with = \"extend_from_bounded_vec out of bounds\")]\n fn extend_bounded_vec_beyond_max_len() {\n let mut vec: BoundedVec<u32, 3> = BoundedVec::new();\n let other: BoundedVec<u32, 5> = BoundedVec::from_array([1, 2, 3, 4, 5]);\n vec.extend_from_bounded_vec(other); // should panic\n }\n\n #[test]\n fn extend_with_empty_collections() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n let original_len = vec.len();\n\n vec.extend_from_array([]);\n assert_eq(vec.len(), original_len);\n\n vec.extend_from_vector([].as_vector());\n assert_eq(vec.len(), original_len);\n\n let empty: BoundedVec<u32, 3> = BoundedVec::new();\n vec.extend_from_bounded_vec(empty);\n assert_eq(vec.len(), original_len);\n }\n }\n\n mod storage {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn storage_consistency() {\n let mut vec: BoundedVec<u32, 5> = BoundedVec::new();\n\n // test initial storage state\n assert_eq(vec.storage(), [0, 0, 0, 0, 0]);\n\n vec.push(1);\n vec.push(2);\n\n // test storage after modifications\n assert_eq(vec.storage(), [1, 2, 0, 0, 0]);\n\n // storage doesn't change length\n assert_eq(vec.len(), 2);\n assert_eq(vec.max_len(), 5);\n }\n\n #[test]\n fn storage_after_pop() {\n let mut vec: BoundedVec<u32, 3> = BoundedVec::from_array([1, 2, 3]);\n\n let _ = vec.pop();\n // after pop, the last element should be zeroed\n assert_eq(vec.storage(), [1, 2, 0]);\n assert_eq(vec.len(), 2);\n }\n\n #[test]\n fn vector_immutable() {\n let vec: BoundedVec<u32, 3> = BoundedVec::from_array([1, 2, 3]);\n let storage = vec.storage();\n\n assert_eq(storage, [1, 2, 3]);\n\n // Verify that the original vector is unchanged\n assert_eq(vec.len(), 3);\n assert_eq(vec.get(0), 1);\n assert_eq(vec.get(1), 2);\n assert_eq(vec.get(2), 3);\n }\n }\n}\n"
7137
7073
  },
7138
7074
  "69": {
7139
7075
  "function_locations": [