firefly-compiler 0.4.34 → 0.4.35

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 (77) hide show
  1. package/bin/Release.ff +47 -4
  2. package/compiler/Compiler.ff +1 -0
  3. package/core/Digest.ff +51 -0
  4. package/core/NodeSystem.ff +1 -1
  5. package/core/Pair.ff +9 -0
  6. package/experimental/s3/S3.ff +126 -0
  7. package/output/js/ff/compiler/Builder.mjs +2 -0
  8. package/output/js/ff/compiler/Compiler.mjs +3 -1
  9. package/output/js/ff/compiler/Dependencies.mjs +2 -0
  10. package/output/js/ff/compiler/DependencyLock.mjs +2 -0
  11. package/output/js/ff/compiler/Deriver.mjs +2 -0
  12. package/output/js/ff/compiler/Dictionaries.mjs +2 -0
  13. package/output/js/ff/compiler/Environment.mjs +2 -0
  14. package/output/js/ff/compiler/Inference.mjs +2 -0
  15. package/output/js/ff/compiler/JsEmitter.mjs +2 -0
  16. package/output/js/ff/compiler/JsImporter.mjs +2 -0
  17. package/output/js/ff/compiler/LspHook.mjs +2 -0
  18. package/output/js/ff/compiler/Main.mjs +2 -0
  19. package/output/js/ff/compiler/ModuleCache.mjs +2 -0
  20. package/output/js/ff/compiler/Parser.mjs +2 -0
  21. package/output/js/ff/compiler/Patterns.mjs +2 -0
  22. package/output/js/ff/compiler/Resolver.mjs +2 -0
  23. package/output/js/ff/compiler/Substitution.mjs +2 -0
  24. package/output/js/ff/compiler/Syntax.mjs +2 -0
  25. package/output/js/ff/compiler/Token.mjs +2 -0
  26. package/output/js/ff/compiler/Tokenizer.mjs +2 -0
  27. package/output/js/ff/compiler/Unification.mjs +2 -0
  28. package/output/js/ff/compiler/Wildcards.mjs +2 -0
  29. package/output/js/ff/compiler/Workspace.mjs +2 -0
  30. package/output/js/ff/core/Any.mjs +2 -0
  31. package/output/js/ff/core/Array.mjs +2 -0
  32. package/output/js/ff/core/AssetSystem.mjs +2 -0
  33. package/output/js/ff/core/Atomic.mjs +2 -0
  34. package/output/js/ff/core/Bool.mjs +2 -0
  35. package/output/js/ff/core/BrowserSystem.mjs +2 -0
  36. package/output/js/ff/core/Buffer.mjs +2 -0
  37. package/output/js/ff/core/BuildSystem.mjs +2 -0
  38. package/output/js/ff/core/Channel.mjs +2 -0
  39. package/output/js/ff/core/Char.mjs +2 -0
  40. package/output/js/ff/core/Core.mjs +2 -0
  41. package/output/js/ff/core/Digest.mjs +190 -0
  42. package/output/js/ff/core/Duration.mjs +2 -0
  43. package/output/js/ff/core/Equal.mjs +2 -0
  44. package/output/js/ff/core/Error.mjs +2 -0
  45. package/output/js/ff/core/FileHandle.mjs +2 -0
  46. package/output/js/ff/core/Float.mjs +2 -0
  47. package/output/js/ff/core/HttpClient.mjs +2 -0
  48. package/output/js/ff/core/Instant.mjs +2 -0
  49. package/output/js/ff/core/Int.mjs +2 -0
  50. package/output/js/ff/core/IntMap.mjs +2 -0
  51. package/output/js/ff/core/JsSystem.mjs +2 -0
  52. package/output/js/ff/core/JsValue.mjs +2 -0
  53. package/output/js/ff/core/Json.mjs +2 -0
  54. package/output/js/ff/core/List.mjs +2 -0
  55. package/output/js/ff/core/Lock.mjs +2 -0
  56. package/output/js/ff/core/Log.mjs +2 -0
  57. package/output/js/ff/core/Map.mjs +2 -0
  58. package/output/js/ff/core/NodeSystem.mjs +3 -1
  59. package/output/js/ff/core/Nothing.mjs +2 -0
  60. package/output/js/ff/core/Option.mjs +2 -0
  61. package/output/js/ff/core/Ordering.mjs +2 -0
  62. package/output/js/ff/core/Pair.mjs +10 -0
  63. package/output/js/ff/core/Path.mjs +2 -0
  64. package/output/js/ff/core/Random.mjs +2 -0
  65. package/output/js/ff/core/RbMap.mjs +2 -0
  66. package/output/js/ff/core/Serializable.mjs +2 -0
  67. package/output/js/ff/core/Set.mjs +2 -0
  68. package/output/js/ff/core/Show.mjs +2 -0
  69. package/output/js/ff/core/SourceLocation.mjs +2 -0
  70. package/output/js/ff/core/Stream.mjs +2 -0
  71. package/output/js/ff/core/String.mjs +2 -0
  72. package/output/js/ff/core/StringMap.mjs +2 -0
  73. package/output/js/ff/core/Task.mjs +2 -0
  74. package/output/js/ff/core/Try.mjs +2 -0
  75. package/output/js/ff/core/Unit.mjs +2 -0
  76. package/package.json +1 -1
  77. package/vscode/package.json +1 -1
package/bin/Release.ff CHANGED
@@ -1,6 +1,49 @@
1
1
  nodeMain(system: NodeSystem) {
2
- let result = system.execute("npm", ["-v"])
3
- Log.trace("exitCode: " + result.exitCode)
4
- Log.trace("out: " + result.standardOut.toString())
5
- Log.trace("err: " + result.standardError.toString())
2
+ run(system, "node", ["output/js/ff/compiler/Main.mjs", "bootstrap"], system.path(".."))
3
+ run(system, "node", ["output/js/ff/compiler/Main.mjs", "bootstrap"], system.path(".."))
4
+ run(system, "node", ["output/js/ff/compiler/Main.mjs", "bootstrap"], system.path(".."))
5
+ bumpMinorVersion(system, system.path("../package.json"))
6
+ bumpMinorVersion(system, system.path("../vscode/package.json"))
7
+ run(system, "npm", ["publish"], system.path(".."))
8
+ run(system, "vsce", ["publish"], system.path("../vscode"))
9
+ // tar gz core etc. and upload to s3
10
+ }
11
+
12
+ run(system: NodeSystem, command: String, arguments: List[String], workingDirectory: Path) {
13
+ system.writeLine("")
14
+ system.writeLine(command + " " + arguments.join(" "))
15
+ let out = system.execute(command, arguments, workingDirectory = Some(workingDirectory))
16
+ system.writeBuffer(out.standardOut)
17
+ system.writeErrorBuffer(out.standardError)
18
+ if(out.exitCode != 0) {
19
+ system.writeErrorLine("Exit code: " + out.exitCode)
20
+ system.exit(1)
21
+ }
22
+ }
23
+
24
+ bumpMinorVersion(system: NodeSystem, packageJsonPath: Path) {
25
+ let prefix = " \"version\": \""
26
+ mutable bumps = 0
27
+ system.writeLine("")
28
+ system.writeLine("Bumping version in " + packageJsonPath.absolute())
29
+ let newContent = packageJsonPath.readText().lines().map {
30
+ | line {
31
+ line.removeFirst(prefix).flatMap {_.removeLast("\",")} | Some(v)
32
+ } {
33
+ v.split('.') | [major, minor, patch]
34
+ } {
35
+ patch.getInt() | Some(p)
36
+ } =>
37
+ bumps += 1
38
+ let newVersion = major + "." + minor + "." + (p + 1)
39
+ system.writeLine("Will bump version: " + v + " to " + newVersion)
40
+ prefix + newVersion + "\","
41
+ | line =>
42
+ line
43
+ }.join("\n")
44
+ if(bumps != 1) {
45
+ system.writeErrorLine("Failed to bump version.")
46
+ system.exit(1)
47
+ }
48
+ packageJsonPath.writeText(newContent)
6
49
  }
@@ -66,6 +66,7 @@ coreImports: List[DImport] =
66
66
  "Channel"
67
67
  "Char"
68
68
  "Core"
69
+ "Digest"
69
70
  "Duration"
70
71
  "Equal"
71
72
  "Error"
package/core/Digest.ff ADDED
@@ -0,0 +1,51 @@
1
+ class Digest {}
2
+
3
+ hmacSha256(key: Buffer, buffer: Buffer = Buffer.new(0)): Digest {
4
+ new("sha256", Some(key), buffer)
5
+ }
6
+
7
+ sha256(buffer: Buffer = Buffer.new(0)): Digest {
8
+ new("sha256", None, buffer)
9
+ }
10
+
11
+ new(algorithm: String, hmacKey: Option[Buffer] = None, buffer: Buffer = Buffer.new(0)): Digest
12
+ target node sync """
13
+ import * as crypto from 'node:crypto'
14
+ const digest = typeof hmacKey_.value_ !== 'undefined'
15
+ ? crypto.createHmac(algorithm_, hmacKey_.value_)
16
+ : crypto.createHash(algorithm_);
17
+ if(buffer_.byteLength > 0) digest.update(buffer_);
18
+ return digest;
19
+ """
20
+
21
+ extend self: Digest {
22
+
23
+ writeText(text: String, encoding: String = "utf8"): Unit
24
+ target node sync """
25
+ self_.update(text_, encoding_);
26
+ """
27
+
28
+ writeBuffer(buffer: Buffer): Unit
29
+ target node sync """
30
+ self_.update(buffer_);
31
+ """
32
+
33
+ writeStream(stream: Stream[Buffer]): Unit {
34
+ stream.each {self.writeBuffer(_)}
35
+ }
36
+
37
+ toBuffer(): Buffer
38
+ target node sync """
39
+ const b = self_.digest();
40
+ return new DataView(b.buffer, b.byteOffset, b.length);
41
+ """
42
+
43
+ toHex(): String {
44
+ self.toBuffer().toHex()
45
+ }
46
+
47
+ toBase64(): String {
48
+ self.toBuffer().toBase64()
49
+ }
50
+
51
+ }
@@ -156,7 +156,7 @@ extend self: NodeSystem {
156
156
  const o = Buffer.concat(out);
157
157
  const e = Buffer.concat(err);
158
158
  resolve(ProcessResult(
159
- size > maxBuffer_ ? -1 : code,
159
+ code,
160
160
  new DataView(o.buffer, o.byteOffset, o.byteLength),
161
161
  new DataView(e.buffer, e.byteOffset, e.byteLength),
162
162
  ));
package/core/Pair.ff CHANGED
@@ -49,3 +49,12 @@ extend self[A: Order, B]: Pair[A, B] {
49
49
  }
50
50
 
51
51
  }
52
+
53
+
54
+ extend self: Pair[String, String] {
55
+
56
+ join(separator: String = ""): String {
57
+ self.first + separator + self.second
58
+ }
59
+
60
+ }
@@ -0,0 +1,126 @@
1
+ import Digest from ff:core
2
+
3
+ nodeMain(system: NodeSystem) {
4
+ system.writeLine(Digest.sha256("".toBuffer()).toHex())
5
+ system.writeLine(Digest.hmacSha256("key".toBuffer(), "The quick brown fox jumps over the lazy dog".toBuffer()).toHex())
6
+
7
+ // Trying to reproduce the result from an example here
8
+ // https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html
9
+ let expectedHeader = "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=date;host;x-amz-content-sha256;x-amz-date;x-amz-storage-class,Signature=98ad721746da40c64f1a55b78f14c238d841ea1380cd77a1b5971af0ece108bd"
10
+ let amzDate = "20130524T000000Z" // TODO
11
+ let headerDate = "Fri, 24 May 2013 00:00:00 GMT" // TODO
12
+ let bucket = "examplebucket"
13
+ let body = "Welcome to Amazon S3.".toBuffer()
14
+ let actualHeader = makeS3AuthorizationHeader(
15
+ system = system
16
+ accessKeyId = "AKIAIOSFODNN7EXAMPLE"
17
+ secretAccessKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
18
+ region = "us-east-1"
19
+ bucket = bucket
20
+ objectKey = "test%24file.text" // TODO URI encoded "test$file.text"
21
+ body = body
22
+ canonicalHeaders = [
23
+ Pair("date", headerDate)
24
+ Pair("host", bucket + ".s3.amazonaws.com")
25
+ Pair("x-amz-date", amzDate)
26
+ Pair("x-amz-content-sha256", Digest.sha256(body).toHex())
27
+ Pair("x-amz-storage-class", "REDUCED_REDUNDANCY")
28
+ ]
29
+ amzDate = amzDate
30
+ )
31
+ system.writeLine("")
32
+ system.writeLine("actual : " + actualHeader)
33
+ system.writeLine("")
34
+ system.writeLine("expected: " + expectedHeader)
35
+
36
+
37
+
38
+ /*put(system,
39
+ accessKeyId = ""
40
+ secretAccessKey = ""
41
+ region = "eu-central-1"
42
+ bucket = "firefly-site"
43
+ objectKey = "tmp/test2"
44
+ "Hello S3".toBuffer()
45
+ )*/
46
+ }
47
+
48
+ put(
49
+ system: NodeSystem
50
+ accessKeyId: String
51
+ secretAccessKey: String
52
+ region: String
53
+ bucket: String
54
+ objectKey: String
55
+ body: Buffer
56
+ ): Unit {
57
+ let amzDate = "20240523T122636Z" // TODO
58
+ let headerDate = "Thu May 23 2024 12:20:09 GMT" // TODO
59
+ let contentHash = Digest.sha256(body).toHex()
60
+ let host = bucket + ".s3.amazonaws.com"
61
+ let canonicalHeaders = [
62
+ Pair("date", headerDate)
63
+ Pair("host", host)
64
+ Pair("x-amz-date", amzDate)
65
+ Pair("x-amz-content-sha256", contentHash)
66
+ Pair("x-amz-storage-class", "REDUCED_REDUNDANCY")
67
+ Pair("Content-Type", "text/plain")
68
+ ]
69
+ let authenticationHeader = makeS3AuthorizationHeader(system, accessKeyId, secretAccessKey, region, bucket, objectKey, body, canonicalHeaders, amzDate)
70
+ let headers = [...canonicalHeaders, Pair("Authorization", authenticationHeader)]
71
+
72
+ let url = "https://" + host + "/" + objectKey
73
+ let response = system.httpClient().fetch(url, method = "PUT", headers = headers, body = Some(HttpClient.bodyBuffer(body)), throw = False)
74
+ system.writeLine("" + response.status())
75
+ system.writeLine(response.statusText())
76
+ system.writeLine(response.readText())
77
+ }
78
+
79
+ makeS3AuthorizationHeader(
80
+ system: NodeSystem
81
+ accessKeyId: String
82
+ secretAccessKey: String
83
+ region: String
84
+ bucket: String
85
+ objectKey: String
86
+ body: Buffer
87
+ canonicalHeaders: List[Pair[String, String]]
88
+ amzDate: String
89
+ ): String {
90
+ let scopeDate = amzDate.slice(0, 8) // YYYYMMDD
91
+
92
+ // CanonicalRequest
93
+ let canonicalQuerystring = "";
94
+ let contentHash = Digest.sha256(body).toHex()
95
+ let headers = canonicalHeaders.map {_.mapFirst {_.lower()}.mapSecond {_.trim()}}.sort()
96
+ let signedHeaders = headers.map {_.first}.join(";")
97
+ let canonicalRequest = [
98
+ "PUT"
99
+ "/" + objectKey
100
+ canonicalQuerystring
101
+ ...headers.map {p => p.first + ":" + p.second}
102
+ ""
103
+ signedHeaders
104
+ contentHash
105
+ ].join("\n")
106
+
107
+ // StringToSign
108
+ let credentialScope = [scopeDate, region, "s3", "aws4_request"].join("/")
109
+ let algorithm = "AWS4-HMAC-SHA256"
110
+ let stringToSign = [
111
+ algorithm
112
+ amzDate
113
+ credentialScope
114
+ Digest.sha256(canonicalRequest.toBuffer()).toHex()
115
+ ].join("\n")
116
+
117
+ // Signature
118
+ let signingKey = hmacSha256(hmacSha256(hmacSha256(hmacSha256(("AWS4" + secretAccessKey).toBuffer(), scopeDate), region), "s3"), "aws4_request")
119
+ let signature = hmacSha256(signingKey, stringToSign).toHex()
120
+
121
+ algorithm + " Credential=" + accessKeyId + "/" + credentialScope + ",SignedHeaders=" + signedHeaders + ",Signature=" + signature
122
+ }
123
+
124
+ hmacSha256(key: Buffer, message: String): Buffer {
125
+ Digest.hmacSha256(key, message.toBuffer()).toBuffer()
126
+ }
@@ -46,6 +46,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
46
46
 
47
47
  import * as ff_core_Core from "../../ff/core/Core.mjs"
48
48
 
49
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
50
+
49
51
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
50
52
 
51
53
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -46,6 +46,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
46
46
 
47
47
  import * as ff_core_Core from "../../ff/core/Core.mjs"
48
48
 
49
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
50
+
49
51
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
50
52
 
51
53
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -117,7 +119,7 @@ export function Compiler(emitTarget_, task_, compilerModulePath_, jsOutputPath_,
117
119
  return {emitTarget_, task_, compilerModulePath_, jsOutputPath_, packagePaths_, singleFilePackages_, virtualFiles_, cache_, lspHook_, phaseDurationDelta_, phaseDurations_};
118
120
  }
119
121
 
120
- export const coreImports_ = ff_core_List.List_map(["Any", "Array", "AssetSystem", "Atomic", "Bool", "BrowserSystem", "Buffer", "BuildSystem", "Channel", "Char", "Core", "Duration", "Equal", "Error", "FileHandle", "Float", "HttpClient", "Instant", "Int", "IntMap", "Json", "JsValue", "JsSystem", "List", "Lock", "Log", "Map", "NodeSystem", "Nothing", "Option", "Ordering", "Pair", "Path", "Random", "Serializable", "Set", "Show", "SourceLocation", "Stream", "String", "StringMap", "Task", "Try", "Unit"], ((moduleName_) => {
122
+ export const coreImports_ = ff_core_List.List_map(["Any", "Array", "AssetSystem", "Atomic", "Bool", "BrowserSystem", "Buffer", "BuildSystem", "Channel", "Char", "Core", "Digest", "Duration", "Equal", "Error", "FileHandle", "Float", "HttpClient", "Instant", "Int", "IntMap", "Json", "JsValue", "JsSystem", "List", "Lock", "Log", "Map", "NodeSystem", "Nothing", "Option", "Ordering", "Pair", "Path", "Random", "Serializable", "Set", "Show", "SourceLocation", "Stream", "String", "StringMap", "Task", "Try", "Unit"], ((moduleName_) => {
121
123
  return ff_compiler_Syntax.DImport(ff_compiler_Syntax.Location("<prelude>", 1, 1), moduleName_, ff_compiler_Syntax.PackagePair("ff", "core"), [], moduleName_)
122
124
  }));
123
125
 
@@ -36,6 +36,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
36
36
 
37
37
  import * as ff_core_Core from "../../ff/core/Core.mjs"
38
38
 
39
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
40
+
39
41
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
40
42
 
41
43
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -24,6 +24,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
24
24
 
25
25
  import * as ff_core_Core from "../../ff/core/Core.mjs"
26
26
 
27
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
28
+
27
29
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
28
30
 
29
31
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -26,6 +26,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
26
26
 
27
27
  import * as ff_core_Core from "../../ff/core/Core.mjs"
28
28
 
29
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
30
+
29
31
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
30
32
 
31
33
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -30,6 +30,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
30
30
 
31
31
  import * as ff_core_Core from "../../ff/core/Core.mjs"
32
32
 
33
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
34
+
33
35
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
34
36
 
35
37
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -26,6 +26,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
26
26
 
27
27
  import * as ff_core_Core from "../../ff/core/Core.mjs"
28
28
 
29
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
30
+
29
31
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
30
32
 
31
33
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -34,6 +34,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
34
34
 
35
35
  import * as ff_core_Core from "../../ff/core/Core.mjs"
36
36
 
37
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
38
+
37
39
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
38
40
 
39
41
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -30,6 +30,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
30
30
 
31
31
  import * as ff_core_Core from "../../ff/core/Core.mjs"
32
32
 
33
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
34
+
33
35
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
34
36
 
35
37
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -26,6 +26,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
26
26
 
27
27
  import * as ff_core_Core from "../../ff/core/Core.mjs"
28
28
 
29
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
30
+
29
31
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
30
32
 
31
33
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -30,6 +30,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
30
30
 
31
31
  import * as ff_core_Core from "../../ff/core/Core.mjs"
32
32
 
33
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
34
+
33
35
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
34
36
 
35
37
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -50,6 +50,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
50
50
 
51
51
  import * as ff_core_Core from "../../ff/core/Core.mjs"
52
52
 
53
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
54
+
53
55
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
54
56
 
55
57
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -26,6 +26,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
26
26
 
27
27
  import * as ff_core_Core from "../../ff/core/Core.mjs"
28
28
 
29
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
30
+
29
31
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
30
32
 
31
33
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -32,6 +32,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
32
32
 
33
33
  import * as ff_core_Core from "../../ff/core/Core.mjs"
34
34
 
35
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
36
+
35
37
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
36
38
 
37
39
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -26,6 +26,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
26
26
 
27
27
  import * as ff_core_Core from "../../ff/core/Core.mjs"
28
28
 
29
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
30
+
29
31
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
30
32
 
31
33
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -28,6 +28,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
28
28
 
29
29
  import * as ff_core_Core from "../../ff/core/Core.mjs"
30
30
 
31
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
32
+
31
33
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
32
34
 
33
35
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -26,6 +26,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
26
26
 
27
27
  import * as ff_core_Core from "../../ff/core/Core.mjs"
28
28
 
29
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
30
+
29
31
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
30
32
 
31
33
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -24,6 +24,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
24
24
 
25
25
  import * as ff_core_Core from "../../ff/core/Core.mjs"
26
26
 
27
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
28
+
27
29
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
28
30
 
29
31
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -26,6 +26,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
26
26
 
27
27
  import * as ff_core_Core from "../../ff/core/Core.mjs"
28
28
 
29
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
30
+
29
31
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
30
32
 
31
33
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -30,6 +30,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
30
30
 
31
31
  import * as ff_core_Core from "../../ff/core/Core.mjs"
32
32
 
33
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
34
+
33
35
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
34
36
 
35
37
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -28,6 +28,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
28
28
 
29
29
  import * as ff_core_Core from "../../ff/core/Core.mjs"
30
30
 
31
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
32
+
31
33
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
32
34
 
33
35
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -26,6 +26,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
26
26
 
27
27
  import * as ff_core_Core from "../../ff/core/Core.mjs"
28
28
 
29
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
30
+
29
31
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
30
32
 
31
33
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -26,6 +26,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
26
26
 
27
27
  import * as ff_core_Core from "../../ff/core/Core.mjs"
28
28
 
29
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
30
+
29
31
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
30
32
 
31
33
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -22,6 +22,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
22
22
 
23
23
  import * as ff_core_Core from "../../ff/core/Core.mjs"
24
24
 
25
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
26
+
25
27
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
26
28
 
27
29
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -22,6 +22,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
22
22
 
23
23
  import * as ff_core_Core from "../../ff/core/Core.mjs"
24
24
 
25
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
26
+
25
27
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
26
28
 
27
29
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -22,6 +22,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
22
22
 
23
23
  import * as ff_core_Core from "../../ff/core/Core.mjs"
24
24
 
25
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
26
+
25
27
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
26
28
 
27
29
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -22,6 +22,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
22
22
 
23
23
  import * as ff_core_Core from "../../ff/core/Core.mjs"
24
24
 
25
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
26
+
25
27
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
26
28
 
27
29
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -22,6 +22,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
22
22
 
23
23
  import * as ff_core_Core from "../../ff/core/Core.mjs"
24
24
 
25
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
26
+
25
27
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
26
28
 
27
29
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -22,6 +22,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
22
22
 
23
23
  import * as ff_core_Core from "../../ff/core/Core.mjs"
24
24
 
25
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
26
+
25
27
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
26
28
 
27
29
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -22,6 +22,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
22
22
 
23
23
  import * as ff_core_Core from "../../ff/core/Core.mjs"
24
24
 
25
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
26
+
25
27
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
26
28
 
27
29
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -22,6 +22,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
22
22
 
23
23
  import * as ff_core_Core from "../../ff/core/Core.mjs"
24
24
 
25
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
26
+
25
27
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
26
28
 
27
29
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -22,6 +22,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
22
22
 
23
23
  import * as ff_core_Core from "../../ff/core/Core.mjs"
24
24
 
25
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
26
+
25
27
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
26
28
 
27
29
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -22,6 +22,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
22
22
 
23
23
  import * as ff_core_Core from "../../ff/core/Core.mjs"
24
24
 
25
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
26
+
25
27
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
26
28
 
27
29
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"
@@ -22,6 +22,8 @@ import * as ff_core_Char from "../../ff/core/Char.mjs"
22
22
 
23
23
  import * as ff_core_Core from "../../ff/core/Core.mjs"
24
24
 
25
+ import * as ff_core_Digest from "../../ff/core/Digest.mjs"
26
+
25
27
  import * as ff_core_Duration from "../../ff/core/Duration.mjs"
26
28
 
27
29
  import * as ff_core_Equal from "../../ff/core/Equal.mjs"