@digitaldefiance/secrets 2.0.3

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.
Files changed (79) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +445 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/browser-types.d.ts +112 -0
  5. package/dist/browser-types.d.ts.map +1 -0
  6. package/dist/browser-types.js +242 -0
  7. package/dist/browser-types.js.map +1 -0
  8. package/dist/errors.d.ts +33 -0
  9. package/dist/errors.d.ts.map +1 -0
  10. package/dist/errors.js +92 -0
  11. package/dist/errors.js.map +1 -0
  12. package/dist/esm/.tsbuildinfo +1 -0
  13. package/dist/esm/browser-types.d.ts +112 -0
  14. package/dist/esm/browser-types.d.ts.map +1 -0
  15. package/dist/esm/browser-types.js +201 -0
  16. package/dist/esm/browser-types.js.map +1 -0
  17. package/dist/esm/errors.d.ts +33 -0
  18. package/dist/esm/errors.d.ts.map +1 -0
  19. package/dist/esm/errors.js +54 -0
  20. package/dist/esm/errors.js.map +1 -0
  21. package/dist/esm/node-types.d.ts +87 -0
  22. package/dist/esm/node-types.d.ts.map +1 -0
  23. package/dist/esm/node-types.js +157 -0
  24. package/dist/esm/node-types.js.map +1 -0
  25. package/dist/esm/secrets.d.ts +262 -0
  26. package/dist/esm/secrets.d.ts.map +1 -0
  27. package/dist/esm/secrets.js +894 -0
  28. package/dist/esm/secrets.js.map +1 -0
  29. package/dist/esm/types.d.ts +249 -0
  30. package/dist/esm/types.d.ts.map +1 -0
  31. package/dist/esm/types.js +61 -0
  32. package/dist/esm/types.js.map +1 -0
  33. package/dist/esm/validation.d.ts +34 -0
  34. package/dist/esm/validation.d.ts.map +1 -0
  35. package/dist/esm/validation.js +72 -0
  36. package/dist/esm/validation.js.map +1 -0
  37. package/dist/node-types.d.ts +87 -0
  38. package/dist/node-types.d.ts.map +1 -0
  39. package/dist/node-types.js +191 -0
  40. package/dist/node-types.js.map +1 -0
  41. package/dist/secrets.d.ts +262 -0
  42. package/dist/secrets.d.ts.map +1 -0
  43. package/dist/secrets.js +897 -0
  44. package/dist/secrets.js.map +1 -0
  45. package/dist/types.d.ts +249 -0
  46. package/dist/types.d.ts.map +1 -0
  47. package/dist/types.js +67 -0
  48. package/dist/types.js.map +1 -0
  49. package/dist/umd/.tsbuildinfo +1 -0
  50. package/dist/umd/browser-types.d.ts +112 -0
  51. package/dist/umd/browser-types.d.ts.map +1 -0
  52. package/dist/umd/browser-types.js +252 -0
  53. package/dist/umd/browser-types.js.map +1 -0
  54. package/dist/umd/errors.d.ts +33 -0
  55. package/dist/umd/errors.d.ts.map +1 -0
  56. package/dist/umd/errors.js +102 -0
  57. package/dist/umd/errors.js.map +1 -0
  58. package/dist/umd/node-types.d.ts +87 -0
  59. package/dist/umd/node-types.d.ts.map +1 -0
  60. package/dist/umd/node-types.js +201 -0
  61. package/dist/umd/node-types.js.map +1 -0
  62. package/dist/umd/secrets.d.ts +262 -0
  63. package/dist/umd/secrets.d.ts.map +1 -0
  64. package/dist/umd/secrets.js +907 -0
  65. package/dist/umd/secrets.js.map +1 -0
  66. package/dist/umd/secrets.min.js +2 -0
  67. package/dist/umd/types.d.ts +249 -0
  68. package/dist/umd/types.d.ts.map +1 -0
  69. package/dist/umd/types.js +77 -0
  70. package/dist/umd/types.js.map +1 -0
  71. package/dist/umd/validation.d.ts +34 -0
  72. package/dist/umd/validation.d.ts.map +1 -0
  73. package/dist/umd/validation.js +92 -0
  74. package/dist/umd/validation.js.map +1 -0
  75. package/dist/validation.d.ts +34 -0
  76. package/dist/validation.d.ts.map +1 -0
  77. package/dist/validation.js +82 -0
  78. package/dist/validation.js.map +1 -0
  79. package/package.json +181 -0
package/LICENSE ADDED
@@ -0,0 +1,8 @@
1
+ Copyright (c) 2012 Alexander Stetsyuk
2
+ Copyright (c) 2014-2019 Glenn Rempe
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
5
+
6
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,445 @@
1
+ # @digitaldefiance/secrets
2
+
3
+ A modern, browser-compatible implementation of Shamir's threshold secret sharing scheme.
4
+
5
+ - [What is it?](#about)
6
+ - [Browser Compatibility](#browser-compatibility)
7
+ - [Examples](#examples)
8
+ - [Installation and usage](#installation-and-usage)
9
+ - [API](#api)
10
+ - [Share format](#share-format)
11
+ - [Note on security](#note-on-security)
12
+ - [License](#license)
13
+ - [Development and Testing](#development-and-testing)
14
+ - [Changelog](#changelog)
15
+ - [Possible future enhancements](#possible-future-enhancements)
16
+
17
+ ## About
18
+
19
+ @digitaldefiance/secrets is a pure TypeScrip implementation of [Shamir's threshold secret sharing scheme](http://en.wikipedia.org/wiki/Shamir's_Secret_Sharing) that works natively in both Node.js and modern browsers without requiring any polyfills or shims.
20
+
21
+ It can be used to split any "secret" (i.e. a password, text file, Bitcoin private key, anything) into _n_ number of "shares" (each the same size in bits as the original secret), requiring that exactly any number _t_ ("threshold") of them be present to reconstruct the original secret.
22
+
23
+ This library is maintained by Digital Defiance and is based on the excellent work originally created by `amper5and` and later maintained by `grempe` and `34r7h`.
24
+
25
+ ## Security Audit
26
+
27
+ This code is provided without warranty, as-is and you use it at your own risk.
28
+
29
+ This library was included in the scope of a security audit performed by Cure53 in July 2019 at the request of the [Slant PrivEOS project](https://www.slant.li/priveos/) and no issues were found in this implementation. Our thanks to that team for including this code in its audit scope and for sharing the results with us. A copy of the audit can be found [online](https://ipfs.eternum.io/ipfs/QmVXSZyYZY3Gd9CVZxkUAsqGggN9qWb4bDhYtk79as7hGp/SLA-01-report.pdf) and in the `audit` folder of this repository.
30
+
31
+ The audit was performed on released code on the master branch no later than commit `b6e13cb43f2065a9b622a35002a68222f2bfd437` (`Wed Aug 3 21:30:11 2016 -0700`).
32
+
33
+ Quoting from the Cure53 audit report:
34
+
35
+ ```text
36
+ Conclusion
37
+
38
+ ...
39
+
40
+ It can be clarified that PrivEOS is based on the cryptographic algorithm called Shamir’s
41
+ Secret Sharing and has been implemented with an EOS smart contract.
42
+
43
+ ...
44
+
45
+ Next up, the aforementioned implementation of Shamir's Secret Sharing was audited
46
+ and proven to correctly adhere to its specification. Similarly good verdict was reached
47
+ about distribution of Shamir’s Secret Sharing.
48
+
49
+ ```
50
+
51
+ ## Browser Compatibility
52
+
53
+ @digitaldefiance/secrets works natively in all modern browsers that support `crypto.getRandomValues()` without requiring any polyfills or shims. The library automatically detects the environment and uses the appropriate cryptographic random number generator:
54
+
55
+ - **Node.js**: Uses `crypto.randomBytes()` for secure random number generation
56
+ - **Browsers**: Uses `crypto.getRandomValues()` for secure random number generation
57
+ - **Cross-platform**: Identical hex conversion and cryptographic operations across all environments
58
+
59
+ The library maintains the same API and produces identical results regardless of the environment, ensuring seamless portability between server and client-side applications.
60
+
61
+ ## TypeScript Support
62
+
63
+ @digitaldefiance/secrets is written in TypeScript and provides comprehensive type definitions out of the box. The library supports TypeScript 4.0 and above, with continuous testing across multiple TypeScript versions.
64
+
65
+ ### Features
66
+
67
+ - **Full Type Safety**: All functions, parameters, and return types are fully typed
68
+ - **IntelliSense Support**: Get autocomplete and inline documentation in your IDE
69
+ - **Compile-Time Validation**: Catch errors before runtime with TypeScript's type checking
70
+ - **Multiple Module Formats**: CommonJS, ES Modules, and UMD builds with corresponding type definitions
71
+
72
+ ### Requirements
73
+
74
+ - TypeScript 4.0.0 or higher (specified as an optional peer dependency)
75
+ - Works with all TypeScript 4.x and 5.x versions
76
+
77
+ ### Usage in TypeScript
78
+
79
+ ```typescript
80
+ import secrets = require('@digitaldefiance/secrets');
81
+ import type { Shares, SecretsConfig, ShareComponents } from '@digitaldefiance/secrets/types';
82
+
83
+ // All functions are fully typed
84
+ const key: string = secrets.random(512);
85
+ const shares: Shares = secrets.share(key, 10, 5);
86
+ const reconstructed: string = secrets.combine(shares.slice(0, 5));
87
+
88
+ // Type-safe configuration
89
+ const config: SecretsConfig = secrets.getConfig();
90
+ console.log(config.bits); // number
91
+ console.log(config.maxShares); // number
92
+
93
+ // Extract share components with type safety
94
+ const components: ShareComponents = secrets.extractShareComponents(shares[0]);
95
+ console.log(components.bits); // number
96
+ console.log(components.id); // number
97
+ console.log(components.data); // string
98
+ ```
99
+
100
+ ### ES Modules Support
101
+
102
+ ```typescript
103
+ // Modern ES module syntax
104
+ import secrets from '@digitaldefiance/secrets';
105
+ import type { Shares } from '@digitaldefiance/secrets/types';
106
+
107
+ const shares: Shares = secrets.share('deadbeef', 5, 3);
108
+ ```
109
+
110
+ ### Migration from JavaScript
111
+
112
+ Existing JavaScript code works without changes. TypeScript users get enhanced type safety automatically. For detailed migration guidance, see [docs/TYPESCRIPT_MIGRATION.md](docs/TYPESCRIPT_MIGRATION.md).
113
+
114
+ For more information about TypeScript compatibility, see [docs/TYPESCRIPT_COMPATIBILITY.md](docs/TYPESCRIPT_COMPATIBILITY.md).
115
+
116
+ ## Examples
117
+
118
+ Divide a 512-bit key, expressed in hexadecimal form, into 10 shares, requiring that any 5 of them are necessary to reconstruct the original key:
119
+
120
+ ```javascript
121
+ // generate a 512-bit key
122
+ var key = secrets.random(512) // => key is a hex string
123
+
124
+ // split into 10 shares with a threshold of 5
125
+ var shares = secrets.share(key, 10, 5)
126
+ // => shares = ['801xxx...xxx','802xxx...xxx','803xxx...xxx','804xxx...xxx','805xxx...xxx']
127
+
128
+ // combine 4 shares
129
+ var comb = secrets.combine(shares.slice(0, 4))
130
+ console.log(comb === key) // => false
131
+
132
+ // combine 5 shares
133
+ comb = secrets.combine(shares.slice(4, 9))
134
+ console.log(comb === key) // => true
135
+
136
+ // combine ALL shares
137
+ comb = secrets.combine(shares)
138
+ console.log(comb === key) // => true
139
+
140
+ // create another share with id 8
141
+ var newShare = secrets.newShare(8, shares) // => newShare = '808xxx...xxx'
142
+
143
+ // reconstruct using 4 original shares and the new share:
144
+ comb = secrets.combine(shares.slice(1, 5).concat(newShare))
145
+ console.log(comb === key) // => true
146
+ ```
147
+
148
+ Divide a password containing a mix of numbers, letters, and other characters, requiring that any 3 shares must be present to reconstruct the original password:
149
+
150
+ ```javascript
151
+ var pw = "<<PassWord123>>"
152
+
153
+ // convert the text into a hex string
154
+ var pwHex = secrets.str2hex(pw) // => hex string
155
+
156
+ // split into 5 shares, with a threshold of 3
157
+ var shares = secrets.share(pwHex, 5, 3)
158
+
159
+ // combine 2 shares:
160
+ var comb = secrets.combine(shares.slice(1, 3))
161
+
162
+ //convert back to UTF string:
163
+ comb = secrets.hex2str(comb)
164
+ console.log(comb === pw) // => false
165
+
166
+ // combine 3 shares:
167
+ comb = secrets.combine([shares[1], shares[3], shares[4]])
168
+
169
+ //convert back to UTF string:
170
+ comb = secrets.hex2str(comb)
171
+ console.log(comb === pw) // => true
172
+ ```
173
+
174
+ There are some additional examples of simple usage in the browser, Node.js, and AMD loading (require.js) in the `examples` folder.
175
+
176
+ ## Installation and usage
177
+
178
+ @digitaldefiance/secrets is available from [www.npmjs.com](https://www.npmjs.com/package/@digitaldefiance/secrets). Install using
179
+
180
+ ```bash
181
+ npm install @digitaldefiance/secrets
182
+ ```
183
+
184
+ The source code for this package is available on [Github](https://github.com/Digital-Defiance/secrets.js).
185
+
186
+ To use it in a Node.js application:
187
+
188
+ ```javascript
189
+ var secrets = require("@digitaldefiance/secrets")
190
+ ```
191
+
192
+ To use it in the browser with the global 'secrets' defined, include _secrets.js_ or _secrets.min.js_ in your HTML:
193
+
194
+ ```html
195
+ <script src="secrets.min.js"></script>
196
+ ```
197
+
198
+ You can also use it in the browser with an AMD module loading tool like [require.js](http://www.requirejs.org/). The library works natively in all modern browsers without requiring any polyfills.
199
+
200
+ ## API
201
+
202
+ - secrets.share()
203
+ - secrets.combine()
204
+ - secrets.newShare()
205
+ - secrets.init()
206
+ - secrets.getConfig()
207
+ - secrets.extractShareComponents()
208
+ - secrets.setRNG()
209
+ - secrets.random()
210
+ - secrets.str2hex()
211
+ - secrets.hex2str()
212
+
213
+ ### secrets.share( secret, numShares, threshold, [padLength] )
214
+
215
+ Divide a `secret` expressed in hexadecimal form into `numShares` number of shares, requiring that `threshold` number of shares be present for reconstructing the `secret`;
216
+
217
+ - `secret`: String, required: A hexadecimal string.
218
+ - `numShares`: Number, required: The number of shares to compute. This must be an integer between 2 and 2^bits-1 (see `secrets.init()` below for explanation of `bits`).
219
+ - `threshold`: Number, required: The number of shares required to reconstruct the secret. This must be an integer between 2 and 2^bits-1 (see `secrets.init()` below for explanation of `bits`).
220
+ - `padLength`: Number, optional, default `128`: How much to zero-pad the binary representation of `secret`. This ensures a minimum length for each share. See "Note on security" below.
221
+
222
+ The output of `secrets.share()` is an Array of length `numShares`. Each item in the array is a String. See `Share format` below for information on the format.
223
+
224
+ ### secrets.combine( shares )
225
+
226
+ Reconstructs a secret from `shares`.
227
+
228
+ - `shares`: Array, required: An Array of shares. The form is equivalent to the output from `secrets.share()`.
229
+
230
+ The output of `secrets.combine()` is a String representing the reconstructed secret. Note that this function will ALWAYS produce an output String. However, if the number of `shares` that are provided is not the `threshold` number of shares, the output _will not_ be the original `secret`. In order to guarantee that the original secret is reconstructed, the correct `threshold` number of shares must be provided.
231
+
232
+ Note that using _more_ than the `threshold` number of shares will also result in an accurate reconstruction of the secret. However, using more shares adds to computation time.
233
+
234
+ ### secrets.newShare( id, shares )
235
+
236
+ Create a new share from the input shares.
237
+
238
+ - `id`: Number or String, required: A Number representing the share id. The id is an integer between 1 and 2^bits-1. It can be entered as a Number or a number String expressed in hexadecimal form.
239
+ - `shares`: Array, required: The array of shares (in the same format as outputted from `secrets.share()`) that can be used to reconstruct the original `secret`.
240
+
241
+ The output of `secrets.newShare()` is a String. This is the same format for the share that `secrets.share()` outputs. Note that this function ALWAYS produces an output String. However, as for `secrets.combine()`, if the number of `shares` that are entered is not the `threshold` number of shares, the output share _will not_ be a valid share (i.e. _will not_ be useful in reconstructing the original secret). In order to guarantee that the share is valid, the correct `threshold` number of shares must be provided.
242
+
243
+ ### secrets.init( [bits, rngType] )
244
+
245
+ Set the number of bits to use for finite field arithmetic.
246
+
247
+ - `bits`: Number, optional, default `8`: An integer between 3 and 20. The number of bits to use for the Galois field.
248
+ - `rngType`: String, optional: A string that has one of the values `["nodeCryptoRandomBytes", "browserCryptoGetRandomValues"]`. Setting this will try to override the RNG that would be selected normally based on feature detection. Warning: You can specify a RNG that won't actually _work_ in your environment.
249
+
250
+ Internally, secrets.js uses finite field arithmetic in binary Galois Fields of size 2^bits. Multiplication is implemented by the means of log and exponential tables. Before any arithmetic is performed, the log and exp tables are pre-computed. Each table contains 2^bits entries.
251
+
252
+ `bits` is the limiting factor on `numShares` and `threshold`. The maximum number of shares possible for a particular `bits` is (2^bits)-1 (the zeroth share cannot be used as it is the `secret` by definition.). By default, secrets.js uses 8 bits, for a total 2^8-1 = 255 possible number of shares. To compute more shares, a larger field must be used. To compute the number of bits you will need for your `numShares` or `threshold`, compute the log-base2 of (`numShares`+1) and round up, i.e. in JavaScript: `Math.ceil(Math.log(numShares+1)/Math.LN2)`. You can examine the current calculated `maxShares` value by calling `secrets.getConfig()` and increase the bits accordingly for the number of shares you need to generate.
253
+
254
+ Note:
255
+
256
+ - You can call `secrets.init()` anytime to reset _all_ internal state and re-initialize.
257
+ - `secrets.init()` does NOT need to be called if you plan on using the default of 8 bits. It is automatically called on loading the library.
258
+ - The size of the exp and log tables depends on `bits` (each has 2^bits entries). Therefore, using a large number of bits will cause a slightly longer delay to compute the tables.
259
+ - The _theoretical_ maximum number of bits is 31, as JavaScript performs bitwise operations on 31-bit numbers. A limit of 20 bits has been hard-coded into secrets.js, which can produce 1,048,575 shares. secrets.js has not been tested with this many shares, and it is not advisable to go this high, as it may be too slow to be of any practical use.
260
+ - The Galois Field may be re-initialized to a new setting when `secrets.newShare()` or `secrets.combine()` are called with shares that are from a different Galois Field than the currently initialized one. For this reason, use `secrets.getConfig()` to check what the current `bits` setting is.
261
+
262
+ ### secrets.getConfig()
263
+
264
+ Returns an Object with the current configuration. Has the following properties:
265
+
266
+ - `bits`: [Number] The number of bits used for the current initialized finite field
267
+ - `radix`: [Number] The current radix (Default: 16)
268
+ - `maxShares`: [Number] The max shares that can be created with the current `bits`. Computed as `Math.pow(2, config.bits) - 1`
269
+ - `hasCSPRNG`: [Boolean] Indicates whether or not a Cryptographically Secure Pseudo Random Number Generator has been found and initialized.
270
+ - - `typeCSPRNG`: [String] Indicates which random number generator function has been selected based on either environment feature detection (the default) or by manually specifying the RNG type using `secrets.init()` or `secrets.setRNG()`. The current possible types that can be displayed here are ["nodeCryptoRandomBytes", "browserCryptoGetRandomValues"].
271
+
272
+ ### secrets.extractShareComponents( share )
273
+
274
+ Returns an Object with the extracted parts of a public share string passed as an argument. Has the following properties:
275
+
276
+ - `bits`: [Number] The number of bits configured when the share was created.
277
+ - `id`: [Number] The ID number associated with the share when created.
278
+ - `data`: [String] A hex string of the actual share data.
279
+
280
+ ### secrets.setRNG( function(bits){} | rngType )
281
+
282
+ Set the pseudo-random number generator used to compute shares.
283
+
284
+ secrets.js uses a PRNG in the `secrets.share()` and `secrets.random()` functions. By default, it tries to use a cryptographically strong PRNG. In Node.js this is `crypto.randomBytes()`. In browsers that support it, it is `crypto.getRandomValues()` (using typed arrays, which must be supported too).
285
+
286
+ To supply your own PRNG, use `secrets.setRNG()`. It expects a Function of the form `function(bits){}`. It should compute a random integer between 1 and 2^bits-1. The output must be a String of length `bits` containing random 1's and 0's (cannot be ALL 0's). When `secrets.setRNG()` is called, it tries to check the PRNG to make sure it complies with some of these demands, but obviously it's not possible to run through all possible outputs. So make sure that it works correctly.
287
+
288
+ - `rngType`: String, optional: A string that has one of the values `["nodeCryptoRandomBytes", "browserCryptoGetRandomValues"]`. Setting this will try to override the RNG that would be selected normally based on feature detection. Warning: You can specify a RNG that won't actually _work_ in your environment.
289
+
290
+ ### secrets.random( bits )
291
+
292
+ Generate a random `bits` length string, and output it in hexadecimal format. `bits` must be an integer greater than 1.
293
+
294
+ ### secrets.str2hex( str, [bytesPerChar] )
295
+
296
+ Convert a UTF string `str` into a hexadecimal string, using `bytesPerChar` bytes (octets) for each character.
297
+
298
+ - `str`: String, required: A UTF string.
299
+ - `bytesPerChar`: Number, optional, default `2`. The maximum `bytesPerChar` is 6 to ensure that each character is represented by a number that is below JavaScript's 2^53 maximum for integers.
300
+
301
+ ### secrets.hex2str( str, [bytesPerChar] )
302
+
303
+ Convert a hexadecimal string into a UTF string. Each character of the output string is represented by `bytesPerChar` bytes in the String `str`. See note on `bytesPerChar` under `secrets.str2hex()` above.
304
+
305
+ ## Share Format
306
+
307
+ Each share is a string in the format `<bits><id><value>`. Each part of the string is described below:
308
+
309
+ - `bits`: The first character, expressed in Base36 format, is the number of bits used for the Galois Field. This number must be between 3 and 20, expressed by the characters [3-9, a-k] in Base36.
310
+ - `id`: The id of the share. This is a number between 1 and 2^bits-1, expressed in hexadecimal form. The number of characters used to represent the id is the character-length of the representation of the maximum id (2^bits-1) in hexadecimal: `(Math.pow(2,bits)-1).toString(16).length`.
311
+ - `data`: The value of the share, expressed in hexadecimal form. The length of this string depends on the length of the secret.
312
+
313
+ You can extract these attributes from a share in your possession with the `secrets.extractShareComponents(share)` function which will return an Object with these attributes. You may use these values, for example, to call `secrets.init()` with the proper bits setting for shares you want to combine.
314
+
315
+ ## Note on Security
316
+
317
+ Shamir's secret sharing scheme is "information-theoretically secure" and "perfectly secure" in that less than the requisite number of shares provide no information about the secret (i.e. knowing less than the requisite number of shares is the same as knowing none of the shares). However, because the size of each share is the same as the size of the secret (when using binary Galois fields, as secrets.js does), in practice it does leak _some_ information, namely the _size_ of the secret. Therefore, if you will be using secrets.js to share _short_ password strings (which can be brute-forced much more easily than longer ones), it would be wise to zero-pad them so that the shares do not leak information about the size of the secret. With this in mind, secrets.js will zero-pad in multiples of 128 bits by default which slightly increases the share size for small secrets in the name of added security. You can increase or decrease this padding manually by passing the `padLength` argument to `secrets.share()`.
318
+
319
+ When `secrets.share()` is called with a `padLength`, the `secret` is zero-padded so that it's length is a multiple of the padLength. The second example above can be modified to use 1024-bit zero-padding, producing longer shares:
320
+
321
+ ```javascript
322
+ var pw = "<<PassWord123>>"
323
+
324
+ // convert the text into a hex string
325
+ var pwHex = secrets.str2hex(pw) // => 240-bit password
326
+
327
+ // split into 5 shares, with a threshold of 3, WITH zero-padding
328
+ var shares = secrets.share(pwHex, 5, 3, 1024) // => 1024-bit padded shares
329
+
330
+ // combine 3 shares
331
+ var comb = secrets.combine([shares[1], shares[3], shares[4]])
332
+
333
+ // convert back to UTF string
334
+ comb = secrets.hex2str(comb)
335
+
336
+ console.log(comb === pw) // => true
337
+ ```
338
+
339
+ There is a [workbook containing some additional padding examples](https://github.com/grempe/secrets.js/blob/master/examples/padding.js).
340
+
341
+ ## License
342
+
343
+ secrets.js is released under the MIT License. See the `LICENSE` file.
344
+
345
+ ## Development and Testing
346
+
347
+ ```bash
348
+ cd secrets.js/
349
+ npm install
350
+ ```
351
+
352
+ ### Continuous Development
353
+
354
+ Watch all JavaScript files and run the testing and minification tasks on every save to a file.
355
+
356
+ ```bash
357
+ npm run watch
358
+ ```
359
+
360
+ ### Build & Minify
361
+
362
+ The minified version of the `secrets.js` can be found in `secrets.min.js`. This file was generated using the [UglifyJS2](https://github.com/mishoo/UglifyJS2) tool.
363
+
364
+ ```bash
365
+ npm run build
366
+ ```
367
+
368
+ ### Node.js Testing with Jasmine
369
+
370
+ You can also run the Jasmine test suite within a Node.js instance.
371
+
372
+ ```bash
373
+ npm run test
374
+ ```
375
+
376
+ ### Browser Testing with Jasmine
377
+
378
+ There is a [Jasmine](https://jasmine.github.io/) test suite that exercises the entire `secrets` module that can be run against the source code or the minified version.
379
+
380
+ ```bash
381
+ npm run test-browser
382
+ npm run test-browser-min
383
+ ```
384
+
385
+ ## Changelog
386
+
387
+ - 2.0.3
388
+
389
+ - [BREAKING] Package renamed from `secrets.js-34r7h` to `@digitaldefiance/secrets` under Digital Defiance organization
390
+ - [Enhancement] Complete browser compatibility rewrite - library now works natively in browsers without requiring Buffer polyfills or shims
391
+ - [Enhancement] Added cross-platform `bytesToHex()` function that works identically in Node.js and browsers
392
+ - [Enhancement] Replaced Buffer-specific `toString("hex")` calls with browser-compatible hex conversion
393
+ - [Enhancement] Added comprehensive property-based testing for cross-platform consistency
394
+ - [Enhancement] Added extensive browser environment detection and validation tests
395
+ - [Security] Maintained cryptographic strength across all environments - no fallback to weak random sources
396
+ - Repository moved to https://github.com/Digital-Defiance/secrets.js
397
+ - Updated package metadata and contributor information
398
+
399
+ - 2.0.0
400
+
401
+ - [BREAKING] Removed SJCL random number generator. Modern browsers have all the support they need for `crypto.getRandomValues()`.
402
+ - Modernize build and test process
403
+ - Lint and Prettier JS and Markdown files
404
+ - Implement `npm run ...` scripts for common tests and build tasks
405
+ - Remove global dev dependencies
406
+ - Remove references to, and use of, Bower installation
407
+
408
+ - 1.2.0
409
+
410
+ - Added `secrets.seedRNG()` function to allow seeding the SJCL RNG instantly via Browser or Node.js RNG's or with entropy from an external server.
411
+
412
+ - 1.1.0
413
+
414
+ - Added `grunt watch` task to auto-run tests and minification on every JavaScript file save.
415
+ - Minified file now contains name, version and author comments automatically.
416
+ - Configured basic `grunt` tasks for minification, Node.js testing with Jasmine, jshint, eslint. Removed Karma test runner and manual minification and testing steps. Just run `grunt`.
417
+ - [Bugfix] calling `secrets.init()` now actually resets _all_ internal state back to the default settings. Previously `init()` only reset some internal values. `init()` now calls a new private function `reset()` to accomplish this.
418
+ - [Enhancement] If the [Stanford Javascript Crypto Libarary (SJCL)](https://bitwiseshiftleft.github.io/sjcl/) is loaded in the browser it can be used as a fallback, or explicitly selected, CSPRNG for those browsers that don't support `crypto.getRandomValues()`. It uses the Fortuna RNG and collects additional entropy from mouse movements continually. The downside is that it requires mouse movements initially before `secrets.random()` can be called. `secrets.random()` will throw an Error if called when SJCL is not fully seeded. Currently set to use the maximum SJCL 'paranoia' level of 10. An enhancement to this might be to call out to retrieve one or more external sources of entropy (and mixing them together) to pre-seed the RNG when the library is loaded.
419
+ - [Enhancement] You can now pass a string to `init()` or `setRNG()` which forces loading of a specific RNG (whether it will work or not in your current env!) \* Re-factored how `getRNG()` works internally. Now it returns small focused functions, not a giant function with detection conditionals. If SJCL is loaded the RNG tests are skipped since they would always initially fail due to the entropy pool being initally empty. This should be OK for this 'trusted' RNG.
420
+
421
+ - 1.0.0
422
+
423
+ - Packaging cleanup and ready for 1.0.0 release on Bower and NPM.
424
+ - [Enhancement] Now supports the Javascript Universal Module Definition [UMDJS](https://github.com/umdjs/umd) for loading this module in the Browser with a `secrets` global, using an AMD Module loader like require.js, or in Node.js apps.
425
+ - Refactor getRNG() to no longer have embedded `require` now that crypto is included on module load with the UMDJS change.
426
+ - Updated README.md with info about this fork of secrets.js. \* Added some simple examples of usage to the examples folder.
427
+
428
+ - 0.2.0
429
+
430
+ - [Enhancement] Extend the output of getConfig() to include the `radix` and `maxShares` properties.
431
+ - [Security] Zero-pad all secrets in multiples of 128 bits (instead of 0) by default.
432
+ - [Performance] Massive (100x) speed optimization to padLeft() private function (the second most frequently called block of code internally).
433
+ - [Testing] Added a full jasmine test suite and Karma test runner. Karma runs will also generate code coverage HTML reports. Code coverage is currently >90%.
434
+ - [Testing] Expose all private functions as Underscore (\_) prefixed functions to allow direct unit testing.
435
+ - [Security] Removed Math.random fallback random number generator. Should always fail safe, even if it means not working. `secrets.getConfig().unsafePRNG` will always result in undefined now as it is no longer ever set.
436
+ - Refactored away need to know anything about `global` var.
437
+ - [Testing] jslint.com, jshint.com, and eslint CLI warnings for code and style now clean. - Beautify code.
438
+
439
+ - 0.1.8: bugfix release
440
+ - 0.1.7: added config.unsafePRNG reset when supplying a new PRNG
441
+ - 0.1.6:
442
+ - Removed JSBN dependency, support for arbitrary radices, and the `convertBase()` function, with attendant 50% file size reduction.
443
+ - Fixed bug where leading zeros were dropped. \* Renamed string conversion functions.
444
+ - 0.1.5: getConfig() returns information about PRNG
445
+ - 0.1.4: new share format
@@ -0,0 +1 @@
1
+ {"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../node_modules/typescript/lib/lib.esnext.float16.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../src/types.ts","../src/errors.ts","../src/browser-types.ts","../src/node-types.ts","../src/secrets.ts","../src/validation.ts","../node_modules/@types/estree/index.d.ts","../node_modules/@types/jasmine/index.d.ts","../node_modules/@types/json-schema/index.d.ts","../node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/@types/node/globals.typedarray.d.ts","../node_modules/@types/node/buffer.buffer.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/web-globals/abortcontroller.d.ts","../node_modules/@types/node/web-globals/blob.d.ts","../node_modules/@types/node/web-globals/console.d.ts","../node_modules/@types/node/web-globals/crypto.d.ts","../node_modules/@types/node/web-globals/domexception.d.ts","../node_modules/@types/node/web-globals/encoding.d.ts","../node_modules/@types/node/web-globals/events.d.ts","../node_modules/undici-types/utility.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client-stats.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/h2c-client.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-call-history.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/snapshot-agent.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/undici-types/retry-handler.d.ts","../node_modules/undici-types/retry-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/cache-interceptor.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/util.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/eventsource.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/web-globals/fetch.d.ts","../node_modules/@types/node/web-globals/importmeta.d.ts","../node_modules/@types/node/web-globals/messaging.d.ts","../node_modules/@types/node/web-globals/navigator.d.ts","../node_modules/@types/node/web-globals/performance.d.ts","../node_modules/@types/node/web-globals/storage.d.ts","../node_modules/@types/node/web-globals/streams.d.ts","../node_modules/@types/node/web-globals/timers.d.ts","../node_modules/@types/node/web-globals/url.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/inspector.generated.d.ts","../node_modules/@types/node/inspector/promises.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/path/posix.d.ts","../node_modules/@types/node/path/win32.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/quic.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/sea.d.ts","../node_modules/@types/node/sqlite.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/test/reporters.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/util/types.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/index.d.ts"],"fileIdsList":[[60,122,130,134,137,139,140,141,153],[60,119,120,122,130,134,137,139,140,141,153],[60,121,122,130,134,137,139,140,141,153],[122,130,134,137,139,140,141,153],[60,122,130,134,137,139,140,141,153,161],[60,122,123,128,130,133,134,137,139,140,141,143,153,158,170],[60,122,123,124,130,133,134,137,139,140,141,153],[60,122,125,130,134,137,139,140,141,153,171],[60,122,126,127,130,134,137,139,140,141,144,153],[60,122,127,130,134,137,139,140,141,153,158,167],[60,122,128,130,133,134,137,139,140,141,143,153],[60,121,122,129,130,134,137,139,140,141,153],[60,122,130,131,134,137,139,140,141,153],[60,122,130,132,133,134,137,139,140,141,153],[60,121,122,130,133,134,137,139,140,141,153],[60,122,130,133,134,135,137,139,140,141,153,158,170],[60,122,130,133,134,135,137,139,140,141,153,158,161],[60,109,122,130,133,134,136,137,139,140,141,143,153,158,170],[60,122,130,133,134,136,137,139,140,141,143,153,158,167,170],[60,122,130,134,136,137,138,139,140,141,153,158,167,170],[58,59,60,61,62,63,64,65,66,67,68,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177],[60,122,130,133,134,137,139,140,141,153],[60,122,130,134,137,139,141,153],[60,122,130,134,137,139,140,141,142,153,170],[60,122,130,133,134,137,139,140,141,143,153,158],[60,122,130,134,137,139,140,141,144,153],[60,122,130,134,137,139,140,141,145,153],[60,122,130,133,134,137,139,140,141,148,153],[60,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177],[60,122,130,134,137,139,140,141,150,153],[60,122,130,134,137,139,140,141,151,153],[60,122,127,130,134,137,139,140,141,143,153,161],[60,122,130,133,134,137,139,140,141,153,154],[60,122,130,134,137,139,140,141,153,155,171,174],[60,122,130,133,134,137,139,140,141,153,158,160,161],[60,122,130,134,137,139,140,141,153,159,161],[60,122,130,134,137,139,140,141,153,161,171],[60,122,130,134,137,139,140,141,153,162],[60,119,122,130,134,137,139,140,141,153,158,164],[60,122,130,134,137,139,140,141,153,158,163],[60,122,130,133,134,137,139,140,141,153,165,166],[60,122,130,134,137,139,140,141,153,165,166],[60,122,127,130,134,137,139,140,141,143,153,158,167],[60,122,130,134,137,139,140,141,153,168],[60,122,130,134,137,139,140,141,143,153,169],[60,122,130,134,136,137,139,140,141,151,153,170],[60,122,130,134,137,139,140,141,153,171,172],[60,122,127,130,134,137,139,140,141,153,172],[60,122,130,134,137,139,140,141,153,158,173],[60,122,130,134,137,139,140,141,142,153,174],[60,122,130,134,137,139,140,141,153,175],[60,122,125,130,134,137,139,140,141,153],[60,122,127,130,134,137,139,140,141,153],[60,122,130,134,137,139,140,141,153,171],[60,109,122,130,134,137,139,140,141,153],[60,122,130,134,137,139,140,141,153,170],[60,122,130,134,137,139,140,141,153,176],[60,122,130,134,137,139,140,141,148,153],[60,122,130,134,137,139,140,141,153,166],[60,109,122,130,133,134,135,137,139,140,141,148,153,158,161,170,173,174,176],[60,122,130,134,137,139,140,141,153,158,177],[60,75,78,81,82,122,130,134,137,139,140,141,153,170],[60,78,122,130,134,137,139,140,141,153,158,170],[60,78,82,122,130,134,137,139,140,141,153,170],[60,122,130,134,137,139,140,141,153,158],[60,72,122,130,134,137,139,140,141,153],[60,76,122,130,134,137,139,140,141,153],[60,74,75,78,122,130,134,137,139,140,141,153,170],[60,122,130,134,137,139,140,141,143,153,167],[60,122,130,134,137,139,140,141,153,178],[60,72,122,130,134,137,139,140,141,153,178],[60,74,78,122,130,134,137,139,140,141,143,153,170],[60,69,70,71,73,77,122,130,133,134,137,139,140,141,153,158,170],[60,78,86,94,122,130,134,137,139,140,141,153],[60,70,76,122,130,134,137,139,140,141,153],[60,78,103,104,122,130,134,137,139,140,141,153],[60,70,73,78,122,130,134,137,139,140,141,153,161,170,178],[60,78,122,130,134,137,139,140,141,153],[60,74,78,122,130,134,137,139,140,141,153,170],[60,69,122,130,134,137,139,140,141,153],[60,72,73,74,76,77,78,79,80,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,104,105,106,107,108,122,130,134,137,139,140,141,153],[60,78,96,99,122,130,134,137,139,140,141,153],[60,78,86,87,88,122,130,134,137,139,140,141,153],[60,76,78,87,89,122,130,134,137,139,140,141,153],[60,77,122,130,134,137,139,140,141,153],[60,70,72,78,122,130,134,137,139,140,141,153],[60,78,82,87,89,122,130,134,137,139,140,141,153],[60,82,122,130,134,137,139,140,141,153],[60,76,78,81,122,130,134,137,139,140,141,153,170],[60,70,74,78,86,122,130,134,137,139,140,141,153],[60,78,96,122,130,134,137,139,140,141,153],[60,89,122,130,134,137,139,140,141,153],[60,72,78,103,122,130,134,137,139,140,141,153,161,176,178],[49,50,60,122,130,134,137,139,140,141,153],[49,60,122,130,134,137,139,140,141,153]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"0295c1b06c7ce850cd13ecc8befea6cbcddba7be6860ea75706e315cffd10f26","signature":"9144d1e318d4303dd42b04e8b080b622e7027b1700316289e36d98ef7bc470c1"},{"version":"bd0e5b909791e087695f71e5c809c6e560e96535fa2373374c8e32baa88865bc","signature":"f45076cdf2cd09c4c0d3e9841026b72e807d9738dba6e32421812054a5236be6"},{"version":"533e087c242458057a5f16e3cb2a71107178654ecd3d78d8835ade17f157d0c5","signature":"b0584a53f67f172b77d5be42b6fd224b23aa57e5a594f8ed92af8de728b7da83"},{"version":"043b2ae619f0d38a68b949dbf1cbad0d03d1736e9142b790da417af32da00a96","signature":"90efd80eb2e3cbc6e475f5bd72abeced48e275a2953680c8fde8c3c374b00b04"},{"version":"10e9aa25c5b6f33eab9b46db84035c2dce14f9cc76935e3049514f54356363aa","signature":"c72c687c84d45e4e3432c3fe85bc073fe04589162eeefb1db4440f0f16f4772e","affectsGlobalScope":true},{"version":"f22ea78a48c9d641024a450373dab1aaa6c54083ee00d8981b2b683459b50a90","signature":"3e8aab4ec23d8f0c608ee779cee7d53d7ca0c7a99a45ec5dd2c0b18ee8bd4a11"},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"ee9520d0ddb073cf2c4ea30fe544466bbc3057f63183b760e1685b17a56a13be","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"438b41419b1df9f1fbe33b5e1b18f5853432be205991d1b19f5b7f351675541e","affectsGlobalScope":true,"impliedFormat":1},{"version":"096116f8fedc1765d5bd6ef360c257b4a9048e5415054b3bf3c41b07f8951b0b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"7fb266686238369442bd1719bc0d7edd0199da4fb8540354e1ff7f16669b4323","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"c183b931b68ad184bc8e8372bf663f3d33304772fb482f29fb91b3c391031f3e","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"e1528ca65ac90f6fa0e4a247eb656b4263c470bb22d9033e466463e13395e599","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"dd0109710de4cd93e245121ab86d8c66d20f3ead80074b68e9c3e349c4f53342","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"435b3711465425770ed2ee2f1cf00ce071835265e0851a7dc4600ab4b007550e","impliedFormat":1},{"version":"7e49f52a159435fc8df4de9dc377ef5860732ca2dc9efec1640531d3cf5da7a3","impliedFormat":1},{"version":"dd4bde4bdc2e5394aed6855e98cf135dfdf5dd6468cad842e03116d31bbcc9bc","impliedFormat":1},{"version":"4d4e879009a84a47c05350b8dca823036ba3a29a3038efed1be76c9f81e45edf","affectsGlobalScope":true,"impliedFormat":1},{"version":"cf83d90d5faf27b994c2e79af02e32b555dbfe42cd9bd1571445f2168d1f4e2d","impliedFormat":1},{"version":"9ba13b47cb450a438e3076c4a3f6afb9dc85e17eae50f26d4b2d72c0688c9251","impliedFormat":1},{"version":"b64cd4401633ea4ecadfd700ddc8323a13b63b106ac7127c1d2726f32424622c","impliedFormat":1},{"version":"37c6e5fe5715814412b43cc9b50b24c67a63c4e04e753e0d1305970d65417a60","impliedFormat":1},{"version":"0e28335ac43f4d94dd2fe6d9e6fa6813570640839addd10d309d7985f33a6308","impliedFormat":1},{"version":"ee0e4946247f842c6dd483cbb60a5e6b484fee07996e3a7bc7343dfb68a04c5d","impliedFormat":1},{"version":"ef051f42b7e0ef5ca04552f54c4552eac84099d64b6c5ad0ef4033574b6035b8","impliedFormat":1},{"version":"853a43154f1d01b0173d9cbd74063507ece57170bad7a3b68f3fa1229ad0a92f","impliedFormat":1},{"version":"56231e3c39a031bfb0afb797690b20ed4537670c93c0318b72d5180833d98b72","impliedFormat":1},{"version":"5cc7c39031bfd8b00ad58f32143d59eb6ffc24f5d41a20931269011dccd36c5e","impliedFormat":1},{"version":"b0b69c61b0f0ec8ca15db4c8c41f6e77f4cacb784d42bca948f42dea33e8757e","affectsGlobalScope":true,"impliedFormat":1},{"version":"f96a48183254c00d24575401f1a761b4ce4927d927407e7862a83e06ce5d6964","impliedFormat":1},{"version":"cc25940cfb27aa538e60d465f98bb5068d4d7d33131861ace43f04fe6947d68f","impliedFormat":1},{"version":"ac86245c2f31335bfd52cbe7fc760f9fc4f165387875869a478a6d9616a95e72","impliedFormat":1},{"version":"01ff95aa1443e3f7248974e5a771f513cb2ac158c8898f470a1792f817bee497","impliedFormat":1},{"version":"9d96a7ce809392ff2cb99691acf7c62e632fe56897356ba013b689277aca3619","impliedFormat":1},{"version":"42a05d8f239f74587d4926aba8cc54792eed8e8a442c7adc9b38b516642aadfe","impliedFormat":1},{"version":"5d21b58d60383cc6ab9ad3d3e265d7d25af24a2c9b506247e0e50b0a884920be","impliedFormat":1},{"version":"101f482fd48cb4c7c0468dcc6d62c843d842977aea6235644b1edd05e81fbf22","impliedFormat":1},{"version":"ae6757460f37078884b1571a3de3ebaf724d827d7e1d53626c02b3c2a408ac63","affectsGlobalScope":true,"impliedFormat":1},{"version":"27c0a08e343c6a0ae17bd13ba6d44a9758236dc904cd5e4b43456996cd51f520","impliedFormat":1},{"version":"3ef397f12387eff17f550bc484ea7c27d21d43816bbe609d495107f44b97e933","impliedFormat":1},{"version":"1023282e2ba810bc07905d3668349fbd37a26411f0c8f94a70ef3c05fe523fcf","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"6f80e51ba310608cd71bcdc09a171d7bbfb3b316048601c9ec215ce16a8dcfbc","impliedFormat":1},{"version":"70ac82add6c6f5c8a4a1db5390e75ead5a0cf5cd50216cf22769870c7026c786","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f2c62938251b45715fd2a9887060ec4fbc8724727029d1cbce373747252bdd7","impliedFormat":1},{"version":"e3ace08b6bbd84655d41e244677b474fd995923ffef7149ddb68af8848b60b05","impliedFormat":1},{"version":"132580b0e86c48fab152bab850fc57a4b74fe915c8958d2ccb052b809a44b61c","impliedFormat":1},{"version":"af4ab0aa8908fc9a655bb833d3bc28e117c4f0e1038c5a891546158beb25accb","impliedFormat":1},{"version":"69c9a5a9392e8564bd81116e1ed93b13205201fb44cb35a7fde8c9f9e21c4b23","impliedFormat":1},{"version":"5f8fc37f8434691ffac1bfd8fc2634647da2c0e84253ab5d2dd19a7718915b35","impliedFormat":1},{"version":"5981c2340fd8b076cae8efbae818d42c11ffc615994cb060b1cd390795f1be2b","impliedFormat":1},{"version":"2ca2bca6845a7234eff5c3d192727a068fca72ac565f3c819c6b04ccc83dadc0","impliedFormat":1},{"version":"ed4f674fc8c0c993cc7e145069ac44129e03519b910c62be206a0cc777bdc60b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0250da3eb85c99624f974e77ef355cdf86f43980251bc371475c2b397ba55bcd","impliedFormat":1},{"version":"f1c93e046fb3d9b7f8249629f4b63dc068dd839b824dd0aa39a5e68476dc9420","impliedFormat":1},{"version":"3d3a5f27ffbc06c885dd4d5f9ee20de61faf877fe2c3a7051c4825903d9a7fdc","impliedFormat":1},{"version":"12806f9f085598ef930edaf2467a5fa1789a878fba077cd27e85dc5851e11834","impliedFormat":1},{"version":"17d06eb5709839c7ce719f0c38ada6f308fb433f2cd6d8c87b35856e07400950","impliedFormat":1},{"version":"a43fe41c33d0a192a0ecaf9b92e87bef3709c9972e6d53c42c49251ccb962d69","impliedFormat":1},{"version":"a177959203c017fad3ecc4f3d96c8757a840957a4959a3ae00dab9d35961ca6c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6fc727ccf9b36e257ff982ea0badeffbfc2c151802f741bddff00c6af3b784cf","impliedFormat":1},{"version":"2a00d005e3af99cd1cfa75220e60c61b04bfb6be7ca7453bfe2ef6cca37cc03c","impliedFormat":1},{"version":"4844a4c9b4b1e812b257676ed8a80b3f3be0e29bf05e742cc2ea9c3c6865e6c6","impliedFormat":1},{"version":"064878a60367e0407c42fb7ba02a2ea4d83257357dc20088e549bd4d89433e9c","impliedFormat":1},{"version":"14d4bd22d1b05824971b98f7e91b2484c90f1a684805c330476641417c3d9735","impliedFormat":1},{"version":"586eaf66bace2e731cee0ddfbfac326ad74a83c1acfeac4afb2db85ad23226c7","impliedFormat":1},{"version":"b484ec11ba00e3a2235562a41898d55372ccabe607986c6fa4f4aba72093749f","impliedFormat":1},{"version":"d1a14d87cedcf4f0b8173720d6eb29cc02878bf2b6dabf9c9d9cee742f275368","impliedFormat":1},{"version":"e60efae9fe48a2955f66bf4cbf0f082516185b877daf50d9c5e2a009660a7714","impliedFormat":1},{"version":"041a7781b9127ab568d2cdcce62c58fdea7c7407f40b8c50045d7866a2727130","impliedFormat":1},{"version":"b37f83e7deea729aa9ce5593f78905afb45b7532fdff63041d374f60059e7852","impliedFormat":1},{"version":"e1cb68f3ef3a8dd7b2a9dfb3de482ed6c0f1586ba0db4e7d73c1d2147b6ffc51","impliedFormat":1},{"version":"55cdbeebe76a1fa18bbd7e7bf73350a2173926bd3085bb050cf5a5397025ee4e","impliedFormat":1}],"root":[[49,54]],"options":{"declaration":true,"declarationMap":true,"esModuleInterop":true,"importsNotUsedAsValues":0,"module":1,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitReturns":true,"outDir":"./","preserveConstEnums":true,"removeComments":false,"rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strict":true,"strictFunctionTypes":true,"strictNullChecks":true,"target":1,"tsBuildInfoFile":"./.tsbuildinfo"},"referencedMap":[[55,1],[56,1],[57,1],[119,2],[120,2],[121,3],[60,4],[122,5],[123,6],[124,7],[58,1],[125,8],[126,9],[127,10],[128,11],[129,12],[130,13],[131,13],[132,14],[133,15],[134,16],[135,17],[61,1],[59,1],[136,18],[137,19],[138,20],[178,21],[139,22],[140,23],[141,22],[142,24],[143,25],[144,26],[145,27],[146,27],[147,27],[148,28],[149,29],[150,30],[151,31],[152,32],[153,33],[154,33],[155,34],[156,1],[157,1],[158,35],[159,36],[160,35],[161,37],[162,38],[163,39],[164,40],[165,41],[166,42],[167,43],[168,44],[169,45],[170,46],[171,47],[172,48],[173,49],[174,50],[175,51],[62,22],[63,1],[64,52],[65,53],[66,1],[67,54],[68,1],[110,55],[111,56],[112,57],[113,57],[114,58],[115,1],[116,5],[117,59],[118,56],[176,60],[177,61],[47,1],[48,1],[8,1],[10,1],[9,1],[2,1],[11,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[3,1],[19,1],[20,1],[4,1],[21,1],[25,1],[22,1],[23,1],[24,1],[26,1],[27,1],[28,1],[5,1],[29,1],[30,1],[31,1],[32,1],[6,1],[36,1],[33,1],[34,1],[35,1],[37,1],[7,1],[38,1],[43,1],[44,1],[39,1],[40,1],[41,1],[42,1],[1,1],[45,1],[46,1],[86,62],[98,63],[84,64],[99,65],[108,66],[75,67],[76,68],[74,69],[107,70],[102,71],[106,72],[78,73],[95,74],[77,75],[105,76],[72,77],[73,71],[79,78],[80,1],[85,79],[83,78],[70,80],[109,81],[100,82],[89,83],[88,78],[90,84],[93,85],[87,86],[91,87],[103,70],[81,88],[82,89],[94,90],[71,65],[97,91],[96,78],[92,92],[101,1],[69,1],[104,93],[51,94],[50,1],[52,94],[53,95],[49,1],[54,94]],"version":"5.9.3"}