diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..a3f05e7d9 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,3 @@ +# Require approval from ucm team when editing repository workflows +# This helps prevent users from sneaking in malicious changes to CI workflows. +/.github/ @unisonweb/ucm diff --git a/.github/workflows/check-contributor.yaml b/.github/workflows/check-contributor.yaml new file mode 100644 index 000000000..476ee6636 --- /dev/null +++ b/.github/workflows/check-contributor.yaml @@ -0,0 +1,20 @@ +name: Contributor signed CONTRIBUTORS.markdown + +on: + pull_request: + +jobs: + check-contributor: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: CONTRIBUTORS.markdown + - name: Look for @${{github.event.pull_request.user.login}} in CONTRIBUTORS.markdown + shell: bash + run: | + echo "If this step fails, make sure you've added yourself to CONTRIBUTORS.markdown" + echo "to acknowledge Unison's MIT license." + + egrep '\* .* \(@${{github.event.pull_request.user.login}}\)' \ + CONTRIBUTORS.markdown diff --git a/.github/workflows/ci-build-jit-binary.yaml b/.github/workflows/ci-build-jit-binary.yaml index 34ac0ad85..5b3244e2f 100644 --- a/.github/workflows/ci-build-jit-binary.yaml +++ b/.github/workflows/ci-build-jit-binary.yaml @@ -54,13 +54,13 @@ jobs: with: name: jit-source path: ${{ env.jit_src }} - + - name: cache/restore jit binaries id: cache-jit-binaries uses: actions/cache/restore@v4 with: path: ${{ env.jit_dist }} - key: jit-dist_${{matrix.os}}.racket_${{env.racket_version}}.jit-src_${{hashFiles(format('{0}/**.rkt',env.jit_src),format('{0}/**.ss',env.jit_src))}}.yaml_${{hashFiles('**/ci-build-jit-binary.yaml')}} + key: jit-dist_${{matrix.os}}.racket_${{env.racket_version}}.jit-src_${{hashFiles(format('{0}/**/*.rkt',env.jit_src),format('{0}/**/*.ss',env.jit_src))}}.yaml_${{hashFiles('**/ci-build-jit-binary.yaml')}} - name: cache racket dependencies if: steps.cache-jit-binaries.outputs.cache-hit != 'true' @@ -81,8 +81,18 @@ jobs: if: runner.os == 'macOS' && steps.cache-jit-binaries.outputs.cache-hit != 'true' run: | brew install libb2 - racket_lib_dir="$(dirname "$(readlink -f "$(which raco)")")/../lib" - ln -s "$(brew --prefix)"/lib/libb2.*.dylib "$racket_lib_dir/" + brew_lib_dir=$(brew --prefix)/lib + racket_lib_dir=$(dirname $(dirname $(readlink -f $(which raco))))/lib + + # link libb2 if not already present/cached + for dll in $brew_lib_dir/libb2.*.dylib; do + file=$(basename "$dll") + if [ ! -e "$racket_lib_dir/$file" ]; then + ln -s "$brew_lib_dir/$file" "$racket_lib_dir/$file" + else + echo "$racket_lib_dir/$file" already exists. + fi + done - name: build jit binary if: steps.cache-jit-binaries.outputs.cache-hit != 'true' @@ -104,7 +114,7 @@ jobs: uses: actions/cache/save@v4 with: path: ${{ env.jit_dist }} - key: jit-dist_${{matrix.os}}.racket_${{env.racket_version}}.jit-src_${{hashFiles(format('{0}/**.rkt',env.jit_src),format('{0}/**.ss',env.jit_src))}}.yaml_${{hashFiles('**/ci-build-jit-binary.yaml')}} + key: jit-dist_${{matrix.os}}.racket_${{env.racket_version}}.jit-src_${{hashFiles(format('{0}/**/*.rkt',env.jit_src),format('{0}/**/*.ss',env.jit_src))}}.yaml_${{hashFiles('**/ci-build-jit-binary.yaml')}} - name: save jit binary uses: actions/upload-artifact@v4 diff --git a/.github/workflows/ci.md b/.github/workflows/ci.md index ab5a8d93e..10019422c 100644 --- a/.github/workflows/ci.md +++ b/.github/workflows/ci.md @@ -9,7 +9,7 @@ At a high level, the CI process is: Some version numbers that are used during CI: - `ormolu_version: "0.5.0.1"` - `racket_version: "8.7"` -- `jit_version: "@unison/internal/releases/0.0.15"` +- `jit_version: "@unison/internal/releases/0.0.16"` Some cached directories: - `ucm_local_bin` a temp path for caching a built `ucm` diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9f93290f3..863f28d2f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -20,7 +20,7 @@ on: env: ormolu_version: 0.5.2.0 ucm_local_bin: ucm-local-bin - jit_version: "@unison/internal/releases/0.0.15" + jit_version: "@unison/internal/releases/0.0.16" jit_src_scheme: unison-jit-src/scheme-libs/racket jit_dist: unison-jit-dist jit_generator_os: ubuntu-20.04 diff --git a/CONTRIBUTORS.markdown b/CONTRIBUTORS.markdown index f3a6c72c1..408c1bc08 100644 --- a/CONTRIBUTORS.markdown +++ b/CONTRIBUTORS.markdown @@ -82,3 +82,7 @@ The format for this list: name, GitHub handle * Kyle Goetz (@kylegoetz) * Ethan Morgan (@sixfourtwelve) * Johan Winther (@JohanWinther) +* Greg Pfeil (@sellout) +* Upendra Upadhyay (@upendra1997) +* Dan Doel (@dolio) +* Eric Torreborre (@etorreborre) diff --git a/CREDITS.md b/CREDITS.md index 8107d0b01..321060f33 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -15,7 +15,7 @@ be listed here, please [file a ticket](https://github.com/unisonweb/unison/issue This file was generated using [unisonweb/credits-generator](http://github.com/unisonweb/credits-generator). -### Listing +### Listing These are listed in alphabetical order. | Package name | License | @@ -109,6 +109,7 @@ These are listed in alphabetical order. | [network-bsd-2.8.1.0](https://hackage.haskell.org/package/network-bsd-2.8.1.0) | [BSD3](https://hackage.haskell.org/package/network-bsd-2.8.1.0/src/LICENSE) | | [network-info-0.2.0.10](https://hackage.haskell.org/package/network-info-0.2.0.10) | [BSD3](https://hackage.haskell.org/package/network-info-0.2.0.10/src/LICENSE) | | [network-simple-0.4.5](https://hackage.haskell.org/package/network-simple-0.4.5) | [BSD3](https://hackage.haskell.org/package/network-simple-0.4.5/src/LICENSE) | +| [network-udp-0.0.0](https://hackage.haskell.org/package/network-udp-0.0.0) | [BSD3](https://hackage.haskell.org/package/network-udp-0.0.0/src/LICENSE) | | [nonempty-containers-0.3.3.0](https://hackage.haskell.org/package/nonempty-containers-0.3.3.0) | [BSD3](https://hackage.haskell.org/package/nonempty-containers-0.3.3.0/src/LICENSE) | | [nonempty-vector-0.2.0.2](https://hackage.haskell.org/package/nonempty-vector-0.2.0.2) | [BSD3](https://hackage.haskell.org/package/nonempty-vector-0.2.0.2/src/LICENSE) | | [parallel-3.2.2.0](https://hackage.haskell.org/package/parallel-3.2.2.0) | [BSD3](https://hackage.haskell.org/package/parallel-3.2.2.0/src/LICENSE) | diff --git a/development.markdown b/development.markdown index d753b5018..22e9657c7 100644 --- a/development.markdown +++ b/development.markdown @@ -42,7 +42,7 @@ Some tests are executables instead: * `stack exec transcripts` runs the transcripts-related integration tests, found in `unison-src/transcripts`. You can add more tests to this directory. * `stack exec transcripts -- prefix-of-filename` runs only transcript tests with a matching filename prefix. -* `stack exec integration-tests` runs the additional integration tests for cli. These tests are not triggered by `tests` or `trancscripts`. +* `stack exec integration-tests` runs the additional integration tests for cli. These tests are not triggered by `tests` or `transcripts`. * `stack exec unison -- transcript unison-src/transcripts-round-trip/main.md` runs the pretty-printing round trip tests * `stack exec unison -- transcript unison-src/transcripts-manual/benchmarks.md` runs the benchmark suite. Output goes in unison-src/transcripts-manual/benchmarks/output.txt. diff --git a/docs/language-server.markdown b/docs/language-server.markdown index 8ee1390fb..e43037f7b 100644 --- a/docs/language-server.markdown +++ b/docs/language-server.markdown @@ -4,9 +4,12 @@ * [Overview](#overview) * [Installation and setup](#installation-and-setup) - * [Settings](#settings) * [NeoVim](#neovim) * [VSCode](#vscode) + * [Helix Editor](#helix-editor) + * [Emacs](#emacs) + * [other editors](#other-editors) +* [Configuration](#configuration) ## Overview @@ -31,7 +34,7 @@ Note for Windows users: Due to an outstanding issue with GHC's IO manager on Win Enabling the LSP on windows can cause UCM to hang on exit and may require the process to be killed by the operating system or via Ctrl-C. Note that this doesn't pose any risk of codebase corruption or cause any known issues, it's simply an annoyance. -If you accept this annoyance, you can enable the LSP server on Windows by exporting the `UNISON_LSP_ENABLED=true` environment variable. +If you accept this annoyance, you can enable the LSP server on Windows by exporting the `UNISON_LSP_ENABLED=true` environment variable. You can set this persistently in powershell using: @@ -41,17 +44,6 @@ You can set this persistently in powershell using: See [this issue](https://github.com/unisonweb/unison/issues/3487) for more details. -### Settings - -Supported settings and their defaults. See information for your language server client about where to provide these. - -```json -{ - // A suggestion for the formatter about how wide (in columns) to print definitions. - "formattingWidth": 80 -} -``` - ### NeoVim Before configuring the LSP, install the Vim plugin for filetype detection and syntax highlighting. @@ -193,6 +185,18 @@ language-servers = [ "ucm" ] or follow the instructions for Unison in "[How to install the default language servers](https://github.com/helix-editor/helix/wiki/How-to-install-the-default-language-servers#unison)" wiki page. +### Emacs + +In Emacs 29 (or earlier, if you install the [Eglot](https://elpa.gnu.org/packages/eglot.html) package), add the following to your init file: + +```elisp +(push '((unison-ts-mode unisonlang-mode) "127.0.0.1" 5757) + eglot-server-programs) +``` + +This requires having either [unison-ts-mode](https://github.com/fmguerreiro/unison-ts-mode) or [unisonlang-mode](https://melpa.org/#/unisonlang-mode) installed. unison-ts-mode is newer, supported, and more complete, but isn’t in [MELPA](https://melpa.org/) yet and requires a couple commands to set up [tree-sitter-unison](https://github.com/kylegoetz/tree-sitter-unison). + +You can then use `M-x eglot` in a Unison scratch file buffer. You can also [configure Eglot to start automatically](https://www.gnu.org/software/emacs/manual/html_node/eglot/Starting-Eglot.html). ### Other Editors @@ -205,11 +209,14 @@ Note that some editors require passing the command and arguments as separate par Supported settings and their defaults. See information for your language server client about where to provide these. +* `formattingWidth`: A suggestion for the formatter about how wide (in columns) to print definitions. +* `maxCompletions`: The number of completions the server should collect and send based on a single query. Increasing this limit will provide more completion results, but at the cost of being slower to respond. + + If explicitly set to `null` the server will return ALL completions available. + ```json { - // The number of completions the server should collect and send based on a single query. - // Increasing this limit will provide more completion results, but at the cost of being slower to respond. - // If explicitly set to `null` the server will return ALL completions available. + "formattingWidth": 80, "maxCompletions": 100 } ``` diff --git a/lib/unison-pretty-printer/src/Unison/Util/ColorText.hs b/lib/unison-pretty-printer/src/Unison/Util/ColorText.hs index bc379e9c7..841b3f477 100644 --- a/lib/unison-pretty-printer/src/Unison/Util/ColorText.hs +++ b/lib/unison-pretty-printer/src/Unison/Util/ColorText.hs @@ -173,7 +173,7 @@ defaultColors :: ST.Element r -> Maybe Color defaultColors = \case ST.NumericLiteral -> Nothing ST.TextLiteral -> Nothing - ST.BytesLiteral -> Just HiBlack + ST.BytesLiteral -> Just HiPurple ST.CharLiteral -> Nothing ST.BooleanLiteral -> Nothing ST.Blank -> Nothing @@ -182,21 +182,21 @@ defaultColors = \case ST.TermReference _ -> Nothing ST.Op _ -> Nothing ST.Unit -> Nothing - ST.AbilityBraces -> Just HiBlack - ST.ControlKeyword -> Just Bold - ST.LinkKeyword -> Just HiBlack - ST.TypeOperator -> Just HiBlack + ST.AbilityBraces -> Just HiPurple + ST.ControlKeyword -> Just HiCyan + ST.LinkKeyword -> Just HiPurple + ST.TypeOperator -> Just HiPurple ST.BindingEquals -> Nothing ST.TypeAscriptionColon -> Just Blue ST.DataTypeKeyword -> Nothing ST.DataTypeParams -> Nothing ST.DataTypeModifier -> Nothing - ST.UseKeyword -> Just HiBlack - ST.UsePrefix -> Just HiBlack - ST.UseSuffix -> Just HiBlack - ST.HashQualifier _ -> Just HiBlack + ST.UseKeyword -> Just HiPurple + ST.UsePrefix -> Just HiPurple + ST.UseSuffix -> Just HiPurple + ST.HashQualifier _ -> Just HiPurple ST.DelayForceChar -> Just Yellow ST.DelimiterChar -> Nothing ST.Parenthesis -> Nothing ST.DocDelimiter -> Just Green - ST.DocKeyword -> Just Bold + ST.DocKeyword -> Just HiCyan diff --git a/parser-typechecker/package.yaml b/parser-typechecker/package.yaml index e84af99a6..8bb50c518 100644 --- a/parser-typechecker/package.yaml +++ b/parser-typechecker/package.yaml @@ -23,6 +23,8 @@ dependencies: - NanoID - aeson - ansi-terminal + - asn1-encoding + - asn1-types - async - atomic-primops - base @@ -60,6 +62,7 @@ dependencies: - http-media - http-types - IntervalMap + - iproute - lens - lucid - megaparsec @@ -73,6 +76,7 @@ dependencies: - natural-transformation - network - network-simple + - network-udp - network-uri - nonempty-containers - open-browser @@ -158,6 +162,7 @@ tests: - easytest - filemanip - split + - hex-text - unison-parser-typechecker when: - condition: false diff --git a/parser-typechecker/src/Unison/Builtin.hs b/parser-typechecker/src/Unison/Builtin.hs index 8f845fdfc..816b8a239 100644 --- a/parser-typechecker/src/Unison/Builtin.hs +++ b/parser-typechecker/src/Unison/Builtin.hs @@ -246,7 +246,10 @@ builtinTypesSrc = B' "MutableArray" CT.Data, B' "ImmutableByteArray" CT.Data, B' "MutableByteArray" CT.Data, - B' "Char.Class" CT.Data + B' "Char.Class" CT.Data, + B' "UDPSocket" CT.Data, + B' "ListenSocket" CT.Data, + B' "ClientSockAddr" CT.Data ] -- rename these to "builtin" later, when builtin means intrinsic as opposed to @@ -772,6 +775,10 @@ cryptoBuiltins = [ B "crypto.Ed25519.sign.impl" $ bytes --> bytes --> bytes --> eithert failure bytes, B "crypto.Ed25519.verify.impl" $ + bytes --> bytes --> bytes --> eithert failure boolean, + B "crypto.Rsa.sign.impl" $ + bytes --> bytes --> eithert failure bytes, + B "crypto.Rsa.verify.impl" $ bytes --> bytes --> bytes --> eithert failure boolean ] @@ -815,6 +822,17 @@ ioBuiltins = ("IO.serverSocket.impl.v3", optionalt text --> text --> iof socket), ("IO.listen.impl.v3", socket --> iof unit), ("IO.clientSocket.impl.v3", text --> text --> iof socket), + ("IO.UDP.clientSocket.impl.v1", text --> text --> iof udpSocket), + ("IO.UDP.ClientSockAddr.toText.v1", udpClientSockAddr --> text), + ("IO.UDP.UDPSocket.toText.impl.v1", udpSocket --> text), + ("IO.UDP.UDPSocket.close.impl.v1", udpSocket --> iof unit), + ("IO.UDP.serverSocket.impl.v1", text --> text --> iof udpListenSocket), + ("IO.UDP.ListenSocket.recvFrom.impl.v1", udpListenSocket --> iof (tuple [bytes, udpClientSockAddr])), + ("IO.UDP.ListenSocket.sendTo.impl.v1", udpListenSocket --> bytes --> udpClientSockAddr --> iof unit), + ("IO.UDP.ListenSocket.toText.impl.v1", udpListenSocket --> text), + ("IO.UDP.ListenSocket.close.impl.v1", udpListenSocket --> iof unit), + ("IO.UDP.UDPSocket.recv.impl.v1", udpSocket --> iof bytes), + ("IO.UDP.UDPSocket.send.impl.v1", udpSocket --> bytes --> iof unit), ("IO.closeSocket.impl.v3", socket --> iof unit), ("IO.socketPort.impl.v3", socket --> iof nat), ("IO.socketAccept.impl.v3", socket --> iof socket), @@ -1055,6 +1073,12 @@ handle = Type.fileHandle () phandle = Type.processHandle () unit = DD.unitType () + +udpSocket, udpListenSocket, udpClientSockAddr :: Type +udpSocket = Type.udpSocket () +udpListenSocket = Type.udpListenSocket () +udpClientSockAddr = Type.udpClientSockAddr () + tls, tlsClientConfig, tlsServerConfig, tlsSignedCert, tlsPrivateKey, tlsVersion, tlsCipher :: Type tls = Type.ref () Type.tlsRef tlsClientConfig = Type.ref () Type.tlsClientConfigRef diff --git a/parser-typechecker/src/Unison/KindInference/Generate.hs b/parser-typechecker/src/Unison/KindInference/Generate.hs index b2d41f5a5..dd47a0a61 100644 --- a/parser-typechecker/src/Unison/KindInference/Generate.hs +++ b/parser-typechecker/src/Unison/KindInference/Generate.hs @@ -356,6 +356,9 @@ builtinConstraintTree = flip Type.ref Type.filePathRef, Type.threadId, Type.socket, + Type.udpSocket, + Type.udpListenSocket, + Type.udpClientSockAddr, Type.processHandle, Type.ibytearrayType, flip Type.ref Type.charClassRef, diff --git a/parser-typechecker/src/Unison/Runtime/Builtin.hs b/parser-typechecker/src/Unison/Runtime/Builtin.hs index 8531698ca..027b9b69e 100644 --- a/parser-typechecker/src/Unison/Runtime/Builtin.hs +++ b/parser-typechecker/src/Unison/Runtime/Builtin.hs @@ -39,6 +39,7 @@ import Crypto.Error (CryptoError (..), CryptoFailable (..)) import Crypto.Hash qualified as Hash import Crypto.MAC.HMAC qualified as HMAC import Crypto.PubKey.Ed25519 qualified as Ed25519 +import Crypto.PubKey.RSA.PKCS15 qualified as RSA import Crypto.Random (getRandomBytes) import Data.Bits (shiftL, shiftR, (.|.)) import Data.ByteArray qualified as BA @@ -52,6 +53,7 @@ import Data.IORef as SYS readIORef, writeIORef, ) +import Data.IP (IP) import Data.Map qualified as Map import Data.PEM (PEM, pemContent, pemParseLBS) import Data.Set (insert) @@ -81,9 +83,23 @@ import Network.Simple.TCP as SYS import Network.Socket as SYS ( Socket, accept, - socketPort, + socketPort, PortNumber, ) import Network.TLS as TLS +import Network.UDP as UDP + ( UDPSocket (..), + ClientSockAddr, + ListenSocket, + clientSocket, + close, + recv, + recvFrom, + send, + sendTo, + serverSocket, + stop, + ) + import Network.TLS.Extra.Cipher as Cipher import System.Clock (Clock (..), getTime, nsec, sec) import System.Directory as SYS @@ -138,6 +154,7 @@ import System.Process as SYS ) import System.X509 qualified as X import Unison.ABT.Normalized hiding (TTm) +import Unison.Runtime.Crypto.Rsa as Rsa import Unison.Builtin qualified as Ty (builtinTypes) import Unison.Builtin.Decls qualified as Ty import Unison.Prelude hiding (Text, some) @@ -1544,6 +1561,22 @@ outIoFailBool stack1 stack2 stack3 extra fail result = ) ] +outIoFailTup :: forall v . (Var v) => v -> v -> v -> v -> v -> v -> v -> v -> ANormal v +outIoFailTup stack1 stack2 stack3 stack4 stack5 extra fail result = + TMatch result . MatchSum $ + mapFromList + [ failureCase stack1 stack2 stack3 extra fail, + ( 1, + ([BX, BX], + TAbss [stack1, stack2] + . TLetD stack3 BX (TCon Ty.unitRef 0 []) + . TLetD stack4 BX (TCon Ty.pairRef 0 [stack2, stack3]) + . TLetD stack5 BX (TCon Ty.pairRef 0 [stack1, stack4]) + $ right stack5 + ) + ) + ] + outIoFailG :: (Var v) => v -> @@ -1767,6 +1800,14 @@ boxToEFBox = where (arg, result, stack1, stack2, stack3, any, fail) = fresh +-- a -> Either Failure (b, c) +boxToEFTup :: ForeignOp +boxToEFTup = + inBx arg result $ + outIoFailTup stack1 stack2 stack3 stack4 stack5 extra fail result + where + (arg, result, stack1, stack2, stack3, stack4, stack5, extra, fail) = fresh + -- a -> Either Failure (Maybe b) boxToEFMBox :: ForeignOp boxToEFMBox = @@ -1858,6 +1899,14 @@ boxBoxToEF0 = where (arg1, arg2, result, stack1, stack2, stack3, fail, unit) = fresh +-- a -> b -> c -> Either Failure () +boxBoxBoxToEF0 :: ForeignOp +boxBoxBoxToEF0 = + inBxBxBx arg1 arg2 arg3 result $ + outIoFailUnit stack1 stack2 stack3 fail unit result + where + (arg1, arg2, arg3, result, stack1, stack2, stack3, fail, unit) = fresh + -- a -> Either Failure Nat boxToEFNat :: ForeignOp boxToEFNat = @@ -2290,8 +2339,64 @@ mkForeignTlsE f = mkForeign $ \a -> fmap flatten (tryIO2 (tryIO1 (f a))) flatten (Right (Right (Left e))) = Left e flatten (Right (Right (Right a))) = Right a +declareUdpForeigns :: FDecl Symbol () +declareUdpForeigns = do + declareForeign Tracked "IO.UDP.clientSocket.impl.v1" boxBoxToEFBox + . mkForeignIOF + $ \(host :: Util.Text.Text, port :: Util.Text.Text) -> + let hostStr = Util.Text.toString host + portStr = Util.Text.toString port + in UDP.clientSocket hostStr portStr True + + declareForeign Tracked "IO.UDP.UDPSocket.recv.impl.v1" boxToEFBox + . mkForeignIOF + $ \(sock :: UDPSocket) -> Bytes.fromArray <$> UDP.recv sock + + declareForeign Tracked "IO.UDP.UDPSocket.send.impl.v1" boxBoxToEF0 + . mkForeignIOF + $ \(sock :: UDPSocket, bytes :: Bytes.Bytes) -> + UDP.send sock (Bytes.toArray bytes) + + declareForeign Tracked "IO.UDP.UDPSocket.close.impl.v1" boxToEF0 + . mkForeignIOF + $ \(sock :: UDPSocket) -> UDP.close sock + + declareForeign Tracked "IO.UDP.ListenSocket.close.impl.v1" boxToEF0 + . mkForeignIOF + $ \(sock :: ListenSocket) -> UDP.stop sock + + declareForeign Tracked "IO.UDP.UDPSocket.toText.impl.v1" boxDirect + . mkForeign + $ \(sock :: UDPSocket) -> pure $ show sock + + declareForeign Tracked "IO.UDP.serverSocket.impl.v1" boxBoxToEFBox + . mkForeignIOF + $ \(ip :: Util.Text.Text, port :: Util.Text.Text) -> + let maybeIp = readMaybe $ Util.Text.toString ip :: Maybe IP + maybePort = readMaybe $ Util.Text.toString port :: Maybe PortNumber + in case (maybeIp, maybePort) of + (Nothing, _) -> fail "Invalid IP Address" + (_, Nothing) -> fail "Invalid Port Number" + (Just ip, Just pt) -> UDP.serverSocket (ip, pt) + + declareForeign Tracked "IO.UDP.ListenSocket.toText.impl.v1" boxDirect + . mkForeign + $ \(sock :: ListenSocket) -> pure $ show sock + + declareForeign Tracked "IO.UDP.ListenSocket.recvFrom.impl.v1" boxToEFTup . + mkForeignIOF $ fmap (first Bytes.fromArray) <$> UDP.recvFrom + + declareForeign Tracked "IO.UDP.ClientSockAddr.toText.v1" boxDirect + . mkForeign + $ \(sock :: ClientSockAddr) -> pure $ show sock + + declareForeign Tracked "IO.UDP.ListenSocket.sendTo.impl.v1" boxBoxBoxToEF0 . + mkForeignIOF $ \(socket :: ListenSocket, bytes :: Bytes.Bytes, addr :: ClientSockAddr) -> + UDP.sendTo socket (Bytes.toArray bytes) addr + declareForeigns :: FDecl Symbol () declareForeigns = do + declareUdpForeigns declareForeign Tracked "IO.openFile.impl.v3" boxIomrToEFBox $ mkForeignIOF $ \(fnameText :: Util.Text.Text, n :: Int) -> let fname = Util.Text.toString fnameText @@ -2830,6 +2935,14 @@ declareForeigns = do . mkForeign $ pure . verifyEd25519Wrapper + declareForeign Untracked "crypto.Rsa.sign.impl" boxBoxToEFBox + . mkForeign + $ pure . signRsaWrapper + + declareForeign Untracked "crypto.Rsa.verify.impl" boxBoxBoxToEFBool + . mkForeign + $ pure . verifyRsaWrapper + let catchAll :: (MonadCatch m, MonadIO m, NFData a) => m a -> m (Either Util.Text.Text a) catchAll e = do e <- Exception.tryAnyDeep e @@ -3471,6 +3584,31 @@ verifyEd25519Wrapper (public0, msg0, sig0) = case validated of "ed25519: Secret key structure invalid" errMsg _ = "ed25519: unexpected error" +signRsaWrapper :: + (Bytes.Bytes, Bytes.Bytes) -> Either Failure Bytes.Bytes +signRsaWrapper (secret0, msg0) = case validated of + Left err -> + Left (Failure Ty.cryptoFailureRef err unitValue) + Right secret -> + case RSA.sign Nothing (Just Hash.SHA256) secret msg of + Left err -> Left (Failure Ty.cryptoFailureRef (Rsa.rsaErrorToText err) unitValue) + Right signature -> Right $ Bytes.fromByteString signature + where + msg = Bytes.toArray msg0 :: ByteString + validated = Rsa.parseRsaPrivateKey (Bytes.toArray secret0 :: ByteString) + +verifyRsaWrapper :: + (Bytes.Bytes, Bytes.Bytes, Bytes.Bytes) -> Either Failure Bool +verifyRsaWrapper (public0, msg0, sig0) = case validated of + Left err -> + Left $ Failure Ty.cryptoFailureRef err unitValue + Right public -> + Right $ RSA.verify (Just Hash.SHA256) public msg sig + where + msg = Bytes.toArray msg0 :: ByteString + sig = Bytes.toArray sig0 :: ByteString + validated = Rsa.parseRsaPublicKey (Bytes.toArray public0 :: ByteString) + typeReferences :: [(Reference, Word64)] typeReferences = zip rs [1 ..] where diff --git a/parser-typechecker/src/Unison/Runtime/Crypto/Rsa.hs b/parser-typechecker/src/Unison/Runtime/Crypto/Rsa.hs new file mode 100644 index 000000000..fda596195 --- /dev/null +++ b/parser-typechecker/src/Unison/Runtime/Crypto/Rsa.hs @@ -0,0 +1,127 @@ +module Unison.Runtime.Crypto.Rsa ( + parseRsaPublicKey, + parseRsaPrivateKey, + rsaErrorToText, +) where + +import Crypto.Number.Basic qualified as Crypto +import Crypto.PubKey.RSA qualified as RSA +import Data.ASN1.BinaryEncoding qualified as ASN1 +import Data.ASN1.BitArray qualified as ASN1 +import Data.ASN1.Encoding qualified as ASN1 +import Data.ASN1.Error qualified as ASN1 +import Data.ASN1.Types qualified as ASN1 +import Data.ByteString qualified as BS +import Data.ByteString.Lazy qualified as BSL +import Unison.Util.Text (Text) +import Unison.Util.Text qualified as Util.Text + +-- | Parse a RSA public key from a ByteString +-- The input bytestring is a hex-encoded string of the DER file for the public key. +-- It can be generated with those commands: +-- # generate a RSA key of a given size +-- openssl genrsa -out private_key.pem +-- # output the DER format as a hex string +-- openssl rsa -in private_key.pem -outform DER -pubout | xxd -p +parseRsaPublicKey :: BS.ByteString -> Either Text RSA.PublicKey +parseRsaPublicKey bs = case ASN1.decodeASN1 ASN1.DER (BSL.fromStrict bs) of + Left err -> Left $ "rsa: cannot decode as an ASN.1 structure. " <> asn1ErrorToText err + Right asn1 -> + case asn1 of + [ ASN1.Start ASN1.Sequence, + ASN1.Start ASN1.Sequence, + ASN1.OID _, + ASN1.Null, + ASN1.End ASN1.Sequence, + ASN1.BitString (ASN1.BitArray _ bits), + ASN1.End ASN1.Sequence + ] -> case ASN1.decodeASN1 ASN1.DER (BSL.fromStrict bits) of + Left err -> Left $ "rsa: cannot decode as an ASN.1 inner structure. " <> asn1ErrorToText err + Right asn1 -> case asn1 of + [ASN1.Start ASN1.Sequence, ASN1.IntVal n, ASN1.IntVal e, ASN1.End ASN1.Sequence] -> + Right + RSA.PublicKey + { public_size = Crypto.numBytes n, + public_n = n, + public_e = e + } + other -> Left ("rsa: unexpected ASN.1 inner structure for a RSA public key" <> Util.Text.pack (show other)) + other -> Left ("rsa: unexpected ASN.1 outer structure for a RSA public key" <> Util.Text.pack (show other)) + +-- | Parse a RSA private key from a ByteString +-- The input bytestring is a hex-encoded string of the DER file for the private key. +-- It can be generated with those commands: +-- # generate a RSA key of a given size +-- openssl genrsa -out private_key.pem +-- # output the DER format as a hex string +-- openssl rsa -in private_key.pem -outform DER | xxd -p +parseRsaPrivateKey :: BS.ByteString -> Either Text RSA.PrivateKey +parseRsaPrivateKey bs = case ASN1.decodeASN1 ASN1.DER (BSL.fromStrict bs) of + Left err -> Left $ "Error decoding ASN.1: " <> asn1ErrorToText err + Right asn1 -> + case asn1 of + [ ASN1.Start ASN1.Sequence, + ASN1.IntVal 0, + ASN1.Start ASN1.Sequence, + ASN1.OID _, + ASN1.Null, + ASN1.End ASN1.Sequence, + ASN1.OctetString bits, + ASN1.End ASN1.Sequence + ] -> + case ASN1.decodeASN1 ASN1.DER (BSL.fromStrict bits) of + Left err -> Left $ "Error decoding inner ASN.1: " <> asn1ErrorToText err + Right asn1 -> + case asn1 of + [ ASN1.Start ASN1.Sequence, + ASN1.IntVal _, + ASN1.IntVal n, + ASN1.IntVal e, + ASN1.IntVal d, + ASN1.IntVal p, + ASN1.IntVal q, + ASN1.IntVal dP, + ASN1.IntVal dQ, + ASN1.IntVal qinv, + ASN1.End ASN1.Sequence + ] -> + Right + RSA.PrivateKey + { private_pub = RSA.PublicKey {public_size = Crypto.numBytes n, public_n = n, public_e = e}, + private_d = d, + private_p = p, + private_q = q, + private_dP = dP, + private_dQ = dQ, + private_qinv = qinv + } + other -> Left ("rsa: unexpected inner ASN.1 structure for a RSA private key" <> Util.Text.pack (show other)) + other -> Left ("rsa: unexpected outer ASN.1 structure for a RSA private key" <> Util.Text.pack (show other)) + +-- | Display an ASN1 Error +asn1ErrorToText :: ASN1.ASN1Error -> Text +asn1ErrorToText = \case + ASN1.StreamUnexpectedEOC -> "Unexpected EOC in the stream" + ASN1.StreamInfinitePrimitive -> "Invalid primitive with infinite length in a stream" + ASN1.StreamConstructionWrongSize -> "A construction goes over the size specified in the header" + ASN1.StreamUnexpectedSituation s -> "An unexpected situation has come up parsing an ASN1 event stream: " <> Util.Text.pack s + ASN1.ParsingHeaderFail s -> "Parsing an invalid header: " <> Util.Text.pack s + ASN1.ParsingPartial -> "Parsing is not finished, the key is not complete" + ASN1.TypeNotImplemented s -> "Decoding of a type that is not implemented: " <> Util.Text.pack s + ASN1.TypeDecodingFailed s -> "Decoding of a known type failed: " <> Util.Text.pack s + ASN1.TypePrimitiveInvalid s -> "Invalid primitive type: " <> Util.Text.pack s + ASN1.PolicyFailed s1 s2 -> "Policy failed. Policy name: " <> Util.Text.pack s1 <> ", reason:" <> Util.Text.pack s2 + +-- | Display a RSA Error +rsaErrorToText :: RSA.Error -> Text +rsaErrorToText = \case + RSA.MessageSizeIncorrect -> + "rsa: The message to decrypt is not of the correct size (need to be == private_size)" + RSA.MessageTooLong -> + "rsa: The message to encrypt is too long" + RSA.MessageNotRecognized -> + "rsa: The message decrypted doesn't have a PKCS15 structure (0 2 .. 0 msg)" + RSA.SignatureTooLong -> + "rsa: The message's digest is too long" + RSA.InvalidParameters -> + "rsa: Some parameters lead to breaking assumptions" diff --git a/parser-typechecker/src/Unison/Runtime/Foreign.hs b/parser-typechecker/src/Unison/Runtime/Foreign.hs index 3f4ed82e5..e12253095 100644 --- a/parser-typechecker/src/Unison/Runtime/Foreign.hs +++ b/parser-typechecker/src/Unison/Runtime/Foreign.hs @@ -27,6 +27,7 @@ import Data.Primitive (ByteArray, MutableArray, MutableByteArray) import Data.Tagged (Tagged (..)) import Data.X509 qualified as X509 import Network.Socket (Socket) +import Network.UDP (ListenSocket, UDPSocket, ClientSockAddr) import Network.TLS qualified as TLS (ClientParams, Context, ServerParams) import System.Clock (TimeSpec) import System.IO (Handle) @@ -81,6 +82,10 @@ socketEq :: Socket -> Socket -> Bool socketEq l r = l == r {-# NOINLINE socketEq #-} +udpSocketEq :: UDPSocket -> UDPSocket -> Bool +udpSocketEq l r = l == r +{-# NOINLINE udpSocketEq #-} + refEq :: IORef () -> IORef () -> Bool refEq l r = l == r {-# NOINLINE refEq #-} @@ -157,6 +162,7 @@ ref2eq r -- Ditto | r == Ty.tvarRef = Just $ promote tvarEq | r == Ty.socketRef = Just $ promote socketEq + | r == Ty.udpSocketRef = Just $ promote udpSocketEq | r == Ty.refRef = Just $ promote refEq | r == Ty.threadIdRef = Just $ promote tidEq | r == Ty.marrayRef = Just $ promote marrEq @@ -230,6 +236,12 @@ instance BuiltinForeign Referent where foreignRef = Tagged Ty.termLinkRef instance BuiltinForeign Socket where foreignRef = Tagged Ty.socketRef +instance BuiltinForeign ListenSocket where foreignRef = Tagged Ty.udpListenSocketRef + +instance BuiltinForeign ClientSockAddr where foreignRef = Tagged Ty.udpClientSockAddrRef + +instance BuiltinForeign UDPSocket where foreignRef = Tagged Ty.udpSocketRef + instance BuiltinForeign ThreadId where foreignRef = Tagged Ty.threadIdRef instance BuiltinForeign TLS.ClientParams where foreignRef = Tagged Ty.tlsClientConfigRef diff --git a/parser-typechecker/src/Unison/Runtime/Foreign/Function.hs b/parser-typechecker/src/Unison/Runtime/Foreign/Function.hs index b36a69d2f..3f1b93d9e 100644 --- a/parser-typechecker/src/Unison/Runtime/Foreign/Function.hs +++ b/parser-typechecker/src/Unison/Runtime/Foreign/Function.hs @@ -26,6 +26,7 @@ import Data.Time.Clock.POSIX (POSIXTime) import Data.Word (Word16, Word32, Word64, Word8) import GHC.IO.Exception (IOErrorType (..), IOException (..)) import Network.Socket (Socket) +import Network.UDP (UDPSocket) import System.IO (BufferMode (..), Handle, IOMode, SeekMode) import Unison.Builtin.Decls qualified as Ty import Unison.Reference (Reference) @@ -139,6 +140,10 @@ instance ForeignConvention Socket where readForeign = readForeignBuiltin writeForeign = writeForeignBuiltin +instance ForeignConvention UDPSocket where + readForeign = readForeignBuiltin + writeForeign = writeForeignBuiltin + instance ForeignConvention ThreadId where readForeign = readForeignBuiltin writeForeign = writeForeignBuiltin diff --git a/parser-typechecker/src/Unison/Runtime/Interface.hs b/parser-typechecker/src/Unison/Runtime/Interface.hs index c23e7098e..4ae186aa7 100644 --- a/parser-typechecker/src/Unison/Runtime/Interface.hs +++ b/parser-typechecker/src/Unison/Runtime/Interface.hs @@ -55,6 +55,7 @@ import System.Directory createDirectoryIfMissing, getXdgDirectory, ) +import System.Environment (getArgs) import System.Exit (ExitCode (..)) import System.FilePath ((<.>), ()) import System.Process @@ -869,6 +870,8 @@ nativeEvalInContext executable ppe ctx serv port codes base = do ensureRuntimeExists executable let cc = ccache ctx crs <- readTVarIO $ combRefs cc + -- Seems a bit weird, but apparently this is how we do it + args <- getArgs let bytes = serializeValue . compileValue base $ codes decodeResult (Error msg) = pure . Left $ text msg @@ -884,8 +887,14 @@ nativeEvalInContext executable ppe ctx serv port codes base = do (errs, dv) -> pure $ Right (listErrors errs, dv) comm mv (sock, _) = do - send sock . runPutS . putWord32be . fromIntegral $ BS.length bytes + let encodeNum = runPutS . putWord32be . fromIntegral + send sock . encodeNum $ BS.length bytes send sock bytes + send sock . encodeNum $ length args + for_ args $ \arg -> do + let bs = encodeUtf8 $ pack arg + send sock . encodeNum $ BS.length bs + send sock bs UnliftIO.putMVar mv =<< receiveAll sock callout _ _ _ ph = do diff --git a/parser-typechecker/src/Unison/Runtime/Machine.hs b/parser-typechecker/src/Unison/Runtime/Machine.hs index 5850517fb..473fdb34a 100644 --- a/parser-typechecker/src/Unison/Runtime/Machine.hs +++ b/parser-typechecker/src/Unison/Runtime/Machine.hs @@ -1950,8 +1950,10 @@ reserveIds :: Word64 -> TVar Word64 -> IO Word64 reserveIds n free = atomically . stateTVar free $ \i -> (i, i + n) updateMap :: (Semigroup s) => s -> TVar s -> STM s -updateMap new r = stateTVar r $ \old -> - let total = new <> old in (total, total) +updateMap new0 r = do + new <- evaluateSTM new0 + stateTVar r $ \old -> + let total = new <> old in (total, total) refLookup :: String -> M.Map Reference Word64 -> Reference -> Word64 refLookup s m r @@ -2080,6 +2082,11 @@ checkValueSandboxing cc allowed0 v = do where allowed = S.fromList allowed0 +-- Just evaluating to force exceptions. Shouldn't actually be that +-- unsafe. +evaluateSTM :: a -> STM a +evaluateSTM x = unsafeIOToSTM (evaluate x) + cacheAdd0 :: S.Set Reference -> [(Reference, SuperGroup Symbol)] -> diff --git a/parser-typechecker/tests/Unison/Test/Runtime/Crypto/Rsa.hs b/parser-typechecker/tests/Unison/Test/Runtime/Crypto/Rsa.hs new file mode 100644 index 000000000..178c2f95b --- /dev/null +++ b/parser-typechecker/tests/Unison/Test/Runtime/Crypto/Rsa.hs @@ -0,0 +1,48 @@ +module Unison.Test.Runtime.Crypto.Rsa where + +import Crypto.PubKey.RSA qualified as RSA +import Data.Maybe (fromJust) +import EasyTest +import Text.Hex +import Unison.Runtime.Crypto.Rsa + +test :: Test () +test = + scope "parsing" $ + tests + [ scope "parseRsaPublicKey" parseRsaPublicKeyTest, + scope "parseRsaPrivateKey" parseRsaPrivateKeyTest + ] + +parseRsaPublicKeyTest :: Test () +parseRsaPublicKeyTest = do + let publicKey = fromJust $ decodeHex "30819f300d06092a864886f70d010101050003818d0030818902818100a7104b2f20725896076e629ccedbcd6907b16694c6e3d8768b5e0e685670b49616e796c588e5aafb92ef986c1a42c021fed0bdc99212c969cdab98087a0ee4c2f4acd4b6049a87a96afc45668329a3cf21a86fb13b488bbe9fefa1cd5a459014f0d0101378e9661e11b73acf54c8a91141ac90309e7fb6ed69b4e63230ab29150203010001" + let actual = parseRsaPublicKey publicKey + let expected = + RSA.PublicKey + { public_size = 128, + public_n = 117316082691067466889305872575557202673362950667744445659499028356561021937142613205104589546643406309814005581397307365793352915031830083408196867291689544964758311244905648512755140288413724266536406258908443053617981341387254220659107167969619543916073994027510270571746462643891169516098953507692950006037, + public_e = 65537 + } + expectEqual actual (Right expected) + +parseRsaPrivateKeyTest :: Test () +parseRsaPrivateKeyTest = do + let privateKey = fromJust $ decodeHex "30820276020100300d06092a864886f70d0101010500048202603082025c02010002818100a7104b2f20725896076e629ccedbcd6907b16694c6e3d8768b5e0e685670b49616e796c588e5aafb92ef986c1a42c021fed0bdc99212c969cdab98087a0ee4c2f4acd4b6049a87a96afc45668329a3cf21a86fb13b488bbe9fefa1cd5a459014f0d0101378e9661e11b73acf54c8a91141ac90309e7fb6ed69b4e63230ab291502030100010281807cdc23a4fc3619d93f8293b728af848d0c0fdd603269d5bd7b99f760a9c22065d08693dbdcddf1f5863306133d694819e04d789aef4e95343b601507b8d9eac4492e6d7031b035c5d84eceaa9686b292712632d33b3303af84314d7920bc3d45f90d7818fc2587b129196d378ee4ed3e6b8d9010d504bb6470ff53e7c5fb17a1024100d67cbcf113d24325fcef12a778dc47c7060055290b68287649ef092558daccb61c4e7bc290740b75a29d4356dcbd66d18b0860dbff394cc8ff3d94d57617adbd024100c765d8261dd3d8e0d3caf11ab7b212eed181354215687ca6387283e4f0be16e79c8f298be0a70c7734dea78ea65128517d693cabfa4c0ff5328f2abb85d2023902403ca41dc347285e65c22251b2d9bfe5e7463217e1b7e0e5f7b3a58a7f6da4c6d60220ca6ad2ee8c42e10bf77afa83ee2af6551315800e52404db1ba7fb398b43d02410084877d85c0177933ddb12a554eb8edfa8b872c85d2c2d2ee8be019280696e19469ab81bab5c371f69d4e4be1f54b45d7fbda017870f1333e0eafb78051ee8689024061f694c12e934c44b7734f62d1b2a3d3624a4980e1b8e066d78dbabd2436654fbb9d9701425900daaafa1e031310e8a580520bb9e1c1288c669fce252bad1e65" + let actual = parseRsaPrivateKey privateKey + let expected = + RSA.PrivateKey + { private_pub = + RSA.PublicKey + { public_size = 128, + public_n = 117316082691067466889305872575557202673362950667744445659499028356561021937142613205104589546643406309814005581397307365793352915031830083408196867291689544964758311244905648512755140288413724266536406258908443053617981341387254220659107167969619543916073994027510270571746462643891169516098953507692950006037, + public_e = 65537 + }, + private_d = 87679616801061623139678211462583995973938243841750319557622746050821908471598979773246073219465960975647341309221073776399960619667883322633274192544886774496262613234964971623744931197514942326521327825606791139576216469817618072158660015124292686556025876602526093941289386692302798356532230087066424907681, + private_p = 11233609214744923027767175501352593646202568021007351512424743595719525825944483790453654486119375677127184086533073126720964060366977171672432803562630589, + private_q = 10443311712951670023099443962737058583295522901049380734330015511797675780053495867511334370071427510893202629294375157939437054042246322949533759718949433, + private_dP = 3176031022781156885141187342486873181111240716865972140527001145690023864823311109042460960576558461960260523664057127500690343997127119244373520564139069, + private_dQ = 6941120510619372179626602981107825119089517097926514417911731475020140673258620725588998791918173107511741662411060736754565186643059761376912904765212297, + private_qinv = 5130749483925715543854508655089227892147425255568362503702389513480166321367311031864242660308321705497233758877799126086240198385610964125158868020698725 + } + expectEqual actual (Right expected) diff --git a/parser-typechecker/unison-parser-typechecker.cabal b/parser-typechecker/unison-parser-typechecker.cabal index bf96bcb2f..1c5aac7cd 100644 --- a/parser-typechecker/unison-parser-typechecker.cabal +++ b/parser-typechecker/unison-parser-typechecker.cabal @@ -142,6 +142,7 @@ library Unison.Runtime.ANF.Serialize Unison.Runtime.Array Unison.Runtime.Builtin + Unison.Runtime.Crypto.Rsa Unison.Runtime.Debug Unison.Runtime.Decompile Unison.Runtime.Exception @@ -232,6 +233,8 @@ library , NanoID , aeson , ansi-terminal + , asn1-encoding + , asn1-types , async , atomic-primops , base @@ -268,6 +271,7 @@ library , http-client , http-media , http-types + , iproute , lens , lucid , megaparsec @@ -281,6 +285,7 @@ library , natural-transformation , network , network-simple + , network-udp , network-uri , nonempty-containers , open-browser @@ -370,6 +375,7 @@ test-suite parser-typechecker-tests Unison.Test.DataDeclaration Unison.Test.MCode Unison.Test.Referent + Unison.Test.Runtime.Crypto.Rsa Unison.Test.Syntax.FileParser Unison.Test.Syntax.TermParser Unison.Test.Syntax.TypePrinter @@ -424,6 +430,8 @@ test-suite parser-typechecker-tests , NanoID , aeson , ansi-terminal + , asn1-encoding + , asn1-types , async , atomic-primops , base @@ -460,9 +468,11 @@ test-suite parser-typechecker-tests , hashable , hashtables , haskeline + , hex-text , http-client , http-media , http-types + , iproute , lens , lucid , megaparsec @@ -476,6 +486,7 @@ test-suite parser-typechecker-tests , natural-transformation , network , network-simple + , network-udp , network-uri , nonempty-containers , open-browser diff --git a/scheme-libs/racket/unison-runtime.rkt b/scheme-libs/racket/unison-runtime.rkt index 85684ddf9..23b5e85e1 100644 --- a/scheme-libs/racket/unison-runtime.rkt +++ b/scheme-libs/racket/unison-runtime.rkt @@ -30,18 +30,32 @@ unison/data-info unison/chunked-seq unison/primops + unison/builtin unison/primops-generated unison/builtin-generated) +(define (grab-num port) + (integer-bytes->integer (read-bytes 4 port) #f #t 0 4)) + ; Gets bytes using the expected input format. The format is simple: ; ; - 4 bytes indicating how many bytes follow ; - the actual payload, with size matching the above (define (grab-bytes port) - (let* ([size-bytes (read-bytes 4 port)] - [size (integer-bytes->integer size-bytes #f #t 0 4)]) + (let ([size (grab-num port)]) (read-bytes size port))) +; Gets args sent after the code payload. Format is: +; +; - 4 bytes indicating how many arguments +; - for each argument +; - 4 bytes indicating length of argument +; - utf-8 bytes of that length +(define (grab-args port) + (let ([n (grab-num port)]) + (for/list ([i (range n)]) + (bytes->string/utf-8 (grab-bytes port))))) + ; Reads and decodes the input. First uses `grab-bytes` to read the ; payload, then uses unison functions to deserialize the `Value` that ; is expected. @@ -113,13 +127,15 @@ ; input. Then uses the dynamic loading machinery to add the code to ; the runtime. Finally executes a specified main reference. (define (do-evaluate in out) - (let-values ([(code main-ref) (decode-input in)]) + (let-values ([(code main-ref) (decode-input in)] + [(args) (list->vector (grab-args in))]) (add-runtime-code 'unison-main code) (with-handlers ([exn:bug? (lambda (e) (encode-error e out))]) - (handle [ref-exception:typelink] (eval-exn-handler out) - ((termlink->proc main-ref)))))) + (parameterize ([current-command-line-arguments args]) + (handle [ref-exception:typelink] (eval-exn-handler out) + ((termlink->proc main-ref))))))) ; Uses racket pretty printing machinery to instead generate a file ; containing the given code, and which executes the main definition on diff --git a/scheme-libs/racket/unison/boot.ss b/scheme-libs/racket/unison/boot.ss index 0dba789b4..67d390f9c 100644 --- a/scheme-libs/racket/unison/boot.ss +++ b/scheme-libs/racket/unison/boot.ss @@ -47,6 +47,10 @@ builtin-tls.signedcert:typelink builtin-tls.version:typelink + builtin-udpsocket:typelink + builtin-listensocket:typelink + builtin-clientsockaddr:typelink + bytevector bytes control @@ -607,5 +611,5 @@ (define (exn:bug->exception b) (raise-unison-exception ref-runtimefailure:typelink - (exn:bug-msg b) + (string->chunked-string (exn:bug-msg b)) (exn:bug-val b))) diff --git a/scheme-libs/racket/unison/builtin.rkt b/scheme-libs/racket/unison/builtin.rkt new file mode 100644 index 000000000..85d591b49 --- /dev/null +++ b/scheme-libs/racket/unison/builtin.rkt @@ -0,0 +1,4 @@ +#lang racket/base +(require unison/udp) + +(provide (all-from-out)) diff --git a/scheme-libs/racket/unison/core.ss b/scheme-libs/racket/unison/core.ss index 7064c5c41..a27393815 100644 --- a/scheme-libs/racket/unison/core.ss +++ b/scheme-libs/racket/unison/core.ss @@ -37,7 +37,6 @@ bytevector bytevector-append - directory-contents current-microseconds decode-value @@ -227,10 +226,6 @@ (define (current-microseconds) (fl->fx (* 1000 (current-inexact-milliseconds)))) -(define (directory-contents path-str) - (define (extract path) (string->chunked-string (path->string path))) - (map extract (directory-list (chunked-string->string path-str)))) - (define (list-head l n) (let rec ([c l] [m n]) (cond @@ -476,19 +471,17 @@ (next (fx1- i))))))) (define (write-exn:bug ex port mode) - (when mode - (write-string "string (exn:bug-msg ex)) port) + (recur (exn:bug-msg ex) port) (if mode (write-string " " port) (newline port)) (write-string (describe-value (exn:bug-val ex)) port)) - (when mode - (write-string ">"))) + (when mode (write-string ">" port))) (struct exn:bug (msg val) #:constructor-name make-exn:bug diff --git a/scheme-libs/racket/unison/data.ss b/scheme-libs/racket/unison/data.ss index 620a19bcd..7ab75d6d5 100644 --- a/scheme-libs/racket/unison/data.ss +++ b/scheme-libs/racket/unison/data.ss @@ -80,6 +80,9 @@ builtin-timespec:typelink builtin-threadid:typelink builtin-value:typelink + builtin-udpsocket:typelink + builtin-listensocket:typelink + builtin-clientsockaddr:typelink builtin-crypto.hashalgorithm:typelink builtin-char.class:typelink @@ -440,6 +443,9 @@ (define builtin-timespec:typelink (unison-typelink-builtin "TimeSpec")) (define builtin-threadid:typelink (unison-typelink-builtin "ThreadId")) (define builtin-value:typelink (unison-typelink-builtin "Value")) +(define builtin-udpsocket:typelink (unison-typelink-builtin "UDPSocket")) +(define builtin-listensocket:typelink (unison-typelink-builtin "ListenSocket")) +(define builtin-clientsockaddr:typelink (unison-typelink-builtin "ClientSockAddr")) (define builtin-crypto.hashalgorithm:typelink (unison-typelink-builtin "crypto.HashAlgorithm")) diff --git a/scheme-libs/racket/unison/io-handles.rkt b/scheme-libs/racket/unison/io-handles.rkt index 0967ee094..9f5c1bdc6 100644 --- a/scheme-libs/racket/unison/io-handles.rkt +++ b/scheme-libs/racket/unison/io-handles.rkt @@ -14,6 +14,7 @@ (provide unison-FOp-IO.stdHandle + unison-FOp-IO.openFile.impl.v3 (prefix-out builtin-IO. (combine-out @@ -100,13 +101,23 @@ ref-unit-unit) (ref-either-right char)))) -(define-unison (getSomeBytes.impl.v1 handle bytes) - (let* ([buffer (make-bytes bytes)] +(define-unison (getSomeBytes.impl.v1 handle nbytes) + (let* ([buffer (make-bytes nbytes)] [line (read-bytes-avail! buffer handle)]) - (if (eof-object? line) - (ref-either-right (bytes->chunked-bytes #"")) - (ref-either-right (bytes->chunked-bytes buffer)) - ))) + (cond + [(eof-object? line) + (ref-either-right (bytes->chunked-bytes #""))] + [(procedure? line) + (Exception + ref-iofailure:typelink + "getSomeBytes.impl: special value returned" + ref-unit-unit)] + [else + (ref-either-right + (bytes->chunked-bytes + (if (< line nbytes) + (subbytes buffer 0 line) + buffer)))]))) (define-unison (getBuffering.impl.v3 handle) (case (file-stream-buffer-mode handle) @@ -194,6 +205,15 @@ (ref-either-right (string->chunked-string (bytes->string/utf-8 value)))))) +(define (unison-FOp-IO.openFile.impl.v3 fn0 mode) + (define fn (chunked-string->string fn0)) + + (right (case mode + [(0) (open-input-file fn)] + [(1) (open-output-file fn #:exists 'truncate)] + [(2) (open-output-file fn #:exists 'append)] + [else (open-input-output-file fn #:exists 'can-update)]))) + ;; From https://github.com/sorawee/shlex/blob/5de06500e8c831cfc8dffb99d57a76decc02c569/main.rkt (MIT License) ;; with is a port of https://github.com/python/cpython/blob/bf2f76ec0976c09de79c8827764f30e3b6fba776/Lib/shlex.py#L325 (define unsafe-pattern #rx"[^a-zA-Z0-9_@%+=:,./-]") diff --git a/scheme-libs/racket/unison/io.rkt b/scheme-libs/racket/unison/io.rkt index 319bc9e7e..bc94c5314 100644 --- a/scheme-libs/racket/unison/io.rkt +++ b/scheme-libs/racket/unison/io.rkt @@ -5,6 +5,10 @@ unison/data-info racket/file racket/flonum + (only-in racket + date-dst? + date-time-zone-offset + date*-time-zone-name) (only-in unison/boot data-case define-unison) (only-in rnrs/arithmetic/flonums-6 @@ -12,6 +16,7 @@ (require racket/file) (provide + builtin-Clock.internals.systemTimeZone.v1 (prefix-out unison-FOp-Clock.internals. (combine-out @@ -35,6 +40,7 @@ renameFile.impl.v3 createDirectory.impl.v3 removeDirectory.impl.v3 + directoryContents.impl.v3 setCurrentDirectory.impl.v3 renameDirectory.impl.v3 isDirectory.impl.v3 @@ -42,6 +48,13 @@ systemTimeMicroseconds.impl.v3 createTempDirectory.impl.v3))) +(define (failure-result ty msg vl) + (ref-either-left + (ref-failure-failure + ty + (string->chunked-string msg) + (unison-any-any vl)))) + (define (getFileSize.impl.v3 path) (with-handlers [[exn:fail:filesystem? @@ -81,6 +94,24 @@ (current-directory (chunked-string->string path)) (ref-either-right none)) +(define-unison (directoryContents.impl.v3 path) + (with-handlers + [[exn:fail:filesystem? + (lambda (e) + (failure-result + ref-iofailure:typelink + (exception->string e) + ref-unit-unit))]] + (let* ([dirps (directory-list (chunked-string->string path))] + [dirss (map path->string dirps)]) + (ref-either-right + (vector->chunked-list + (list->vector + (map + string->chunked-string + (list* "." ".." dirss)))))))) + + (define-unison (createTempDirectory.impl.v3 prefix) (ref-either-right (string->chunked-string @@ -117,6 +148,14 @@ (define-unison (systemTimeMicroseconds.impl.v3 unit) (ref-either-right (inexact->exact (* 1000 (current-inexact-milliseconds))))) +(define-unison (builtin-Clock.internals.systemTimeZone.v1 secs) + (let* ([d (seconds->date secs)]) + (list->unison-tuple + (list + (date-time-zone-offset d) + (if (date-dst? d) 1 0) + (date*-time-zone-name d))))) + (define (threadCPUTime.v1) (right (integer->time diff --git a/scheme-libs/racket/unison/network-utils.rkt b/scheme-libs/racket/unison/network-utils.rkt new file mode 100644 index 000000000..a7b6cab73 --- /dev/null +++ b/scheme-libs/racket/unison/network-utils.rkt @@ -0,0 +1,31 @@ +#lang racket/base +(require racket/exn + unison/data ; exception + unison/data-info ; ref-* + unison/chunked-seq + unison/core) ; exception->string, chunked-string + +(provide handle-errors) + +(define (handle-errors fn) + (with-handlers + [[exn:fail:network? + (lambda (e) + (exception + ref-iofailure:typelink + (exception->string e) + ref-unit-unit))] + [exn:fail:contract? + (lambda (e) + (exception + ref-miscfailure:typelink + (exception->string e) + ref-unit-unit))] + [(lambda _ #t) + (lambda (e) + (exception + ref-miscfailure:typelink + (string->chunked-string + (format "Unknown exception ~a" (exn->string e))) + ref-unit-unit))]] + (fn))) diff --git a/scheme-libs/racket/unison/primops-generated.rkt b/scheme-libs/racket/unison/primops-generated.rkt index 7b90254be..ed4b7db7a 100644 --- a/scheme-libs/racket/unison/primops-generated.rkt +++ b/scheme-libs/racket/unison/primops-generated.rkt @@ -221,10 +221,11 @@ [(unison-termlink-builtin name) (string-append "builtin-" name)] [(unison-termlink-derived bs i) - (let ([hs (bytevector->base32-string bs #:alphabet 'hex)] - [po (if (= i 0) "" (string-append "." (number->string i)))]) + (let* ([hs (bytevector->base32-string bs #:alphabet 'hex)] + [tm (string-trim hs "=" #:repeat? #t)] + [po (if (= i 0) "" (string-append "." (number->string i)))]) (string->symbol - (string-append "ref-" (substring hs 0 8) po)))])) + (string-append "ref-" tm po)))])) (define (ref-bytes r) (sum-case (decode-ref r) @@ -304,8 +305,24 @@ (match v [(unison-data _ t (list rf rt bs0)) #:when (= t ref-value-data:tag) - (let ([bs (map reify-value (chunked-list->list bs0))]) - (make-data (reference->typelink rf) rt bs))] + (let ([bs (map reify-value (chunked-list->list bs0))] + [tl (reference->typelink rf)]) + (cond + [(eqv? tl builtin-boolean:typelink) + (cond + [(not (null? bs)) + (raise + (make-exn:bug + "reify-value: boolean with arguments" + bs0))] + [(= rt 0) #f] + [(= rt 1) #t] + [else + (raise + (make-exn:bug + "reify-value: unknown boolean tag" + rt))])] + [else (make-data tl rt bs)]))] [(unison-data _ t (list gr bs0)) #:when (= t ref-value-partial:tag) (let ([bs (map reify-value (chunked-list->list bs0))] @@ -316,11 +333,18 @@ (reify-vlit vl)] [(unison-data _ t (list bs0 k)) #:when (= t ref-value-cont:tag) - (raise "reify-value: unimplemented cont case")] + (raise + (make-exn:bug + "reify-value: unimplemented cont case" + ref-unit-unit))] [(unison-data r t fs) - (raise "reify-value: unimplemented data case")] + (raise + (make-exn:bug + "reify-value: unrecognized tag" + ref-unit-unit))] [else - (raise (format "reify-value: unknown tag"))])) + (raise + (make-exn:bug "reify-value: unrecognized value" v))])) (define (reflect-typelink tl) (match tl @@ -354,6 +378,11 @@ (define (reflect-value v) (match v + [(? boolean?) + (ref-value-data + (reflect-typelink builtin-boolean:typelink) + (if v 1 0) ; boolean pseudo-data tags + empty-chunked-list)] [(? exact-nonnegative-integer?) (ref-value-vlit (ref-vlit-pos v))] [(? exact-integer?) diff --git a/scheme-libs/racket/unison/primops.ss b/scheme-libs/racket/unison/primops.ss index 745f3be60..225b68acd 100644 --- a/scheme-libs/racket/unison/primops.ss +++ b/scheme-libs/racket/unison/primops.ss @@ -186,6 +186,29 @@ builtin-TypeLink.toReference builtin-TypeLink.toReference:termlink + builtin-IO.UDP.clientSocket.impl.v1 + builtin-IO.UDP.clientSocket.impl.v1:termlink + builtin-IO.UDP.UDPSocket.recv.impl.v1 + builtin-IO.UDP.UDPSocket.recv.impl.v1:termlink + builtin-IO.UDP.UDPSocket.send.impl.v1 + builtin-IO.UDP.UDPSocket.send.impl.v1:termlink + builtin-IO.UDP.UDPSocket.close.impl.v1 + builtin-IO.UDP.UDPSocket.close.impl.v1:termlink + builtin-IO.UDP.ListenSocket.close.impl.v1 + builtin-IO.UDP.ListenSocket.close.impl.v1:termlink + builtin-IO.UDP.UDPSocket.toText.impl.v1 + builtin-IO.UDP.UDPSocket.toText.impl.v1:termlink + builtin-IO.UDP.serverSocket.impl.v1 + builtin-IO.UDP.serverSocket.impl.v1:termlink + builtin-IO.UDP.ListenSocket.toText.impl.v1 + builtin-IO.UDP.ListenSocket.toText.impl.v1:termlink + builtin-IO.UDP.ListenSocket.recvFrom.impl.v1 + builtin-IO.UDP.ListenSocket.recvFrom.impl.v1:termlink + builtin-IO.UDP.ClientSockAddr.toText.v1 + builtin-IO.UDP.ClientSockAddr.toText.v1:termlink + builtin-IO.UDP.ListenSocket.sendTo.impl.v1 + builtin-IO.UDP.ListenSocket.sendTo.impl.v1:termlink + unison-FOp-internal.dataTag unison-FOp-Char.toText ; unison-FOp-Code.dependencies @@ -314,13 +337,16 @@ unison-FOp-Clock.internals.processCPUTime.v1 unison-FOp-Clock.internals.realtime.v1 unison-FOp-Clock.internals.monotonic.v1 + builtin-Clock.internals.systemTimeZone.v1 + builtin-Clock.internals.systemTimeZone.v1:termlink ; unison-FOp-Value.serialize unison-FOp-IO.stdHandle unison-FOp-IO.getArgs.impl.v1 - unison-FOp-IO.directoryContents.impl.v3 + builtin-IO.directoryContents.impl.v3 + builtin-IO.directoryContents.impl.v3:termlink unison-FOp-IO.systemTimeMicroseconds.v1 unison-FOp-ImmutableArray.copyTo! @@ -645,6 +671,7 @@ (unison murmurhash) (unison tls) (unison tcp) + (unison udp) (unison gzip) (unison zlib) (unison concurrent) @@ -732,6 +759,7 @@ (define-builtin-link IO.getEnv.impl.v1) (define-builtin-link IO.getChar.impl.v1) (define-builtin-link IO.getCurrentDirectory.impl.v3) + (define-builtin-link IO.directoryContents.impl.v3) (define-builtin-link IO.removeDirectory.impl.v3) (define-builtin-link IO.renameFile.impl.v3) (define-builtin-link IO.createTempDirectory.impl.v3) @@ -758,6 +786,7 @@ (define-builtin-link Char.Class.is) (define-builtin-link Scope.bytearrayOf) (define-builtin-link unsafe.coerceAbilities) + (define-builtin-link Clock.internals.systemTimeZone.v1) (begin-encourage-inline (define-unison (builtin-Value.toBuiltin v) (unison-quote v)) @@ -902,11 +931,13 @@ (define (unison-POp-LEQT s t) (bool (chunked-stringstring fnm)) + (let-values + ([(p g) (open-string-output-port)] + [(snm) (chunked-string->string fnm)]) + (put-string p snm) (put-string p ": ") (display (describe-value x) p) - (raise (make-exn:bug fnm x)))) + (raise (make-exn:bug snm x)))) (define (unison-POp-FTOT f) (define base (number->string f)) (define dotted @@ -1095,11 +1126,6 @@ (define (unison-FOp-IO.getArgs.impl.v1) (sum 1 (cdr (command-line)))) - (define (unison-FOp-IO.directoryContents.impl.v3 path) - (reify-exn - (lambda () - (sum 1 (directory-contents path))))) - (define unison-FOp-IO.systemTimeMicroseconds.v1 current-microseconds) ;; TODO should we convert Bytes -> Text directly without the intermediate conversions? @@ -1129,13 +1155,6 @@ (close-output-port h)) (right none)) - (define (unison-FOp-IO.openFile.impl.v3 fn mode) - (right (case mode - [(0) (open-file-input-port (chunked-string->string fn))] - [(1) (open-file-output-port (chunked-string->string fn))] - [(2) (open-file-output-port (chunked-string->string fn) 'no-truncate)] - [else (open-file-input/output-port (chunked-string->string fn))]))) - (define (unison-FOp-Text.repeat n t) (let loop ([cnt 0] [acc empty-chunked-string]) @@ -1470,6 +1489,7 @@ (declare-builtin-link builtin-IO.getArgs.impl.v1) (declare-builtin-link builtin-IO.getEnv.impl.v1) (declare-builtin-link builtin-IO.getChar.impl.v1) + (declare-builtin-link builtin-IO.directoryContents.impl.v3) (declare-builtin-link builtin-IO.getCurrentDirectory.impl.v3) (declare-builtin-link builtin-IO.removeDirectory.impl.v3) (declare-builtin-link builtin-IO.renameFile.impl.v3) @@ -1495,4 +1515,5 @@ (declare-builtin-link builtin-Char.Class.is) (declare-builtin-link builtin-Pattern.many.corrected) (declare-builtin-link builtin-unsafe.coerceAbilities) + (declare-builtin-link builtin-Clock.internals.systemTimeZone.v1) ) diff --git a/scheme-libs/racket/unison/sandbox.rkt b/scheme-libs/racket/unison/sandbox.rkt index d1e634f06..a24c70f2f 100644 --- a/scheme-libs/racket/unison/sandbox.rkt +++ b/scheme-libs/racket/unison/sandbox.rkt @@ -103,6 +103,17 @@ (sandbox-builtin "IO.getFileSize.impl.v3") (sandbox-builtin "IO.serverSocket.impl.v3") (sandbox-builtin "Socket.toText") +(sandbox-builtin "UDP.clientSocket.impl.v1") +(sandbox-builtin "UDP.serverSocket.impl.v1") +(sandbox-builtin "UDP.UDPSocket.close.impl.v1") +(sandbox-builtin "UDP.UDPSocket.recv.impl.v1") +(sandbox-builtin "UDP.UDPSocket.send.impl.v1") +(sandbox-builtin "UDP.ListenSocket.close.impl.v1") +(sandbox-builtin "UDP.UDPSocket.toText.impl.v1") +(sandbox-builtin "UDP.ListenSocket.toText.impl.v1") +(sandbox-builtin "UDP.ListenSocket.recvFrom.impl.v1") +(sandbox-builtin "UDP.ClientSockAddr.toText.v1") +(sandbox-builtin "UDP.ListenSocket.sendTo.impl.v1") (sandbox-builtin "Handle.toText") (sandbox-builtin "ThreadId.toText") (sandbox-builtin "IO.socketPort.impl.v3") diff --git a/scheme-libs/racket/unison/tcp.rkt b/scheme-libs/racket/unison/tcp.rkt index ccc9fafb8..481e36f64 100644 --- a/scheme-libs/racket/unison/tcp.rkt +++ b/scheme-libs/racket/unison/tcp.rkt @@ -6,6 +6,7 @@ unison/data unison/data-info unison/chunked-seq + unison/network-utils unison/core) (provide @@ -25,29 +26,6 @@ (struct socket-pair (input output)) -(define (handle-errors fn) - (with-handlers - [[exn:fail:network? - (lambda (e) - (exception - ref-iofailure:typelink - (exception->string e) - ref-unit-unit))] - [exn:fail:contract? - (lambda (e) - (exception - ref-miscfailure:typelink - (exception->string e) - ref-unit-unit))] - [(lambda _ #t) - (lambda (e) - (exception - ref-miscfailure:typelink - (chunked-string->string - (format "Unknown exception ~a" (exn->string e))) - ref-unit-unit))]] - (fn))) - (define (closeSocket.impl.v3 socket) (handle-errors (lambda () diff --git a/scheme-libs/racket/unison/udp.rkt b/scheme-libs/racket/unison/udp.rkt new file mode 100644 index 000000000..360767326 --- /dev/null +++ b/scheme-libs/racket/unison/udp.rkt @@ -0,0 +1,179 @@ +; UDP primitives! +#lang racket/base +(require racket/udp + racket/format + (only-in unison/boot define-unison) + unison/data + unison/data-info + unison/chunked-seq + (only-in unison/boot sum-case) + unison/network-utils + unison/core) + +(provide + (prefix-out + builtin-IO.UDP. + (combine-out + clientSocket.impl.v1 + clientSocket.impl.v1:termlink + UDPSocket.recv.impl.v1 + UDPSocket.recv.impl.v1:termlink + UDPSocket.send.impl.v1 + UDPSocket.send.impl.v1:termlink + UDPSocket.close.impl.v1 + UDPSocket.close.impl.v1:termlink + ListenSocket.close.impl.v1 + ListenSocket.close.impl.v1:termlink + UDPSocket.toText.impl.v1 + UDPSocket.toText.impl.v1:termlink + serverSocket.impl.v1 + serverSocket.impl.v1:termlink + ListenSocket.toText.impl.v1 + ListenSocket.toText.impl.v1:termlink + ListenSocket.recvFrom.impl.v1 + ListenSocket.recvFrom.impl.v1:termlink + ClientSockAddr.toText.v1 + ClientSockAddr.toText.v1:termlink + ListenSocket.sendTo.impl.v1 + ListenSocket.sendTo.impl.v1:termlink))) + + +(struct client-sock-addr (host port)) + +; Haskell's Network.UDP choice of buffer size is 2048, so mirror that here +(define buffer-size 2048) + +(define ; a -> Either Failure a + (wrap-in-either a) + (sum-case a + (0 (type msg meta) + (ref-either-left (ref-failure-failure type msg (unison-any-any meta)))) + (1 (data) + (ref-either-right data)))) + +(define + (format-socket socket) + (let*-values ([(local-hn local-port remote-hn remote-port) (udp-addresses socket #t)] + [(rv) (~a "")]) + (string->chunked-string rv))) + +(define (close-socket socket) + (let ([rv (handle-errors (lambda() (begin + (udp-close socket) + (right ref-unit-unit))))]) + (wrap-in-either rv))) + +;; define termlink builtins +(define clientSocket.impl.v1:termlink + (unison-termlink-builtin "IO.UDP.clientSocket.impl.v1")) +(define UDPSocket.recv.impl.v1:termlink + (unison-termlink-builtin "IO.UDP.UDPSocket.recv.impl.v1")) +(define UDPSocket.send.impl.v1:termlink + (unison-termlink-builtin "IO.UDP.UDPSocket.send.impl.v1")) +(define UDPSocket.close.impl.v1:termlink + (unison-termlink-builtin "IO.UDP.UDPSocket.close.impl.v1")) +(define ListenSocket.close.impl.v1:termlink + (unison-termlink-builtin "IO.UDP.ListenSocket.close.impl.v1")) +(define UDPSocket.toText.impl.v1:termlink + (unison-termlink-builtin "IO.UDP.UDPSocket.toText.impl.v1")) +(define serverSocket.impl.v1:termlink + (unison-termlink-builtin "IO.UDP.serverSocket.impl.v1")) +(define ListenSocket.toText.impl.v1:termlink + (unison-termlink-builtin "IO.UDP.ListenSocket.toText.impl.v1")) +(define ListenSocket.recvFrom.impl.v1:termlink + (unison-termlink-builtin "IO.UDP.ListenSocket.recvFrom.impl.v1")) +(define ClientSockAddr.toText.v1:termlink + (unison-termlink-builtin "IO.UDP.ClientSockAddr.toText.v1")) +(define ListenSocket.sendTo.impl.v1:termlink + (unison-termlink-builtin "IO.UDP.ListenSocket.sendTo.impl.v1")) + +;; define builtins + +(define-unison + (UDPSocket.recv.impl.v1 socket) ; socket -> Either Failure Bytes + (let + ([rv (handle-errors (lambda() + (let*-values + ([(buffer) (make-bytes buffer-size)] + [(len a b) (udp-receive! socket buffer)]) + (right (bytes->chunked-bytes (subbytes buffer 0 len))))))]) + (wrap-in-either rv))) + +(define-unison + (ListenSocket.close.impl.v1 socket) ; socket -> Either Failure () + (close-socket socket)) + +(define-unison + (serverSocket.impl.v1 ip port) ; string string -> Either Failure socket + (let + ([result (handle-errors (lambda() + (let* ([iip (chunked-string->string ip)] + [pport (string->number (chunked-string->string port))] + [sock (udp-open-socket iip pport)]) + (begin + (udp-bind! sock iip pport) + (right sock)))))]) + (wrap-in-either result))) + +(define-unison + (ListenSocket.recvFrom.impl.v1 socket) ; socket -> Either Failure (Bytes, ClientSockAddr) + (let ([result (handle-errors (lambda() + (if (not (udp? socket)) + (raise-argument-error 'socket "a UDP socket" socket) + (let*-values + ([(buffer) (make-bytes buffer-size)] + [(len host port) (udp-receive! socket buffer)] + [(csa) (client-sock-addr host port)] + [(bs) (subbytes buffer 0 len)] + [(chunked) (bytes->chunked-bytes bs)]) + (right (ref-tuple-pair chunked (ref-tuple-pair csa ref-unit-unit)))))))]) + (wrap-in-either result))) + +(define-unison + (UDPSocket.send.impl.v1 socket data) ; socket -> Bytes -> Either Failure () + (let + ([result (handle-errors (lambda () (begin + (udp-send socket (chunked-bytes->bytes data)) + (right ref-unit-unit))))]) + (wrap-in-either result))) + +(define-unison + (ListenSocket.sendTo.impl.v1 sock bytes addr) ; socket -> Bytes -> ClientSockAddr -> Either Failure () + (let + ([result (handle-errors (lambda() + (let* ([host (client-sock-addr-host addr)] + [port (client-sock-addr-port addr)] + [bytes (chunked-bytes->bytes bytes)]) + (begin + (udp-send-to sock host port bytes) + (right ref-unit-unit)))))]) + (wrap-in-either result))) + +(define-unison + (UDPSocket.toText.impl.v1 socket) ; socket -> string + (format-socket socket)) + +(define-unison + (ClientSockAddr.toText.v1 addr) ; ClientSocketAddr -> string + (string->chunked-string (format "" (client-sock-addr-host addr) (client-sock-addr-port addr)))) + +(define-unison + (ListenSocket.toText.impl.v1 socket) ; socket -> string + (format-socket socket)) + +(define-unison + (UDPSocket.close.impl.v1 socket) ; socket -> Either Failure () + (let + ([rv (handle-errors (lambda() (begin + (udp-close socket) + (right ref-unit-unit))))]) + (wrap-in-either rv))) + +(define-unison + (clientSocket.impl.v1 host port) ; string string -> Either Failure socket + (let ([rv (handle-errors (lambda() (let* ([pport (string->number (chunked-string->string port))] + [hhost (chunked-string->string host)] + [sock (udp-open-socket hhost pport)] + [_ (udp-bind! sock #f 0)] + [res (udp-connect! sock hhost pport)]) (right sock))))]) + (wrap-in-either rv))) diff --git a/scripts/get-share-hash.sh b/scripts/get-share-hash.sh index e0f5371b1..66c2714b9 100755 --- a/scripts/get-share-hash.sh +++ b/scripts/get-share-hash.sh @@ -22,7 +22,7 @@ getHash() { if [[ -z "$name" ]]; then name="${parts[i]}" else - name="$name/${parts[i]}" + name="$name%2F${parts[i]}" fi done fi diff --git a/stack.yaml b/stack.yaml index ed6cf8bce..ff76c60ea 100644 --- a/stack.yaml +++ b/stack.yaml @@ -66,6 +66,7 @@ extra-deps: - lsp-2.2.0.0@sha256:82fbf4b69d94d8d22543be71f89986b3e90050032d671fb3de3f8253ea1e5b6f,3550 - lsp-types-2.0.2.0@sha256:a9a51c3cea0726d91fe63fa0670935ee720f7b31bc3f3b33b2483fc538152677,29421 - row-types-1.0.1.2@sha256:4d4c7cb95d06a32b28ba977852d52a26b4c1f695ef083a6fd874ab6d79933b64,3071 + - network-udp-0.0.0 ghc-options: # All packages diff --git a/stack.yaml.lock b/stack.yaml.lock index 44702a034..4f98b610b 100644 --- a/stack.yaml.lock +++ b/stack.yaml.lock @@ -82,6 +82,13 @@ packages: size: 1060 original: hackage: row-types-1.0.1.2@sha256:4d4c7cb95d06a32b28ba977852d52a26b4c1f695ef083a6fd874ab6d79933b64,3071 +- completed: + hackage: network-udp-0.0.0@sha256:408d2d4fa1a25e49e95752ee124cca641993404bb133ae10fb81daef22d876ae,1075 + pantry-tree: + sha256: ee19a66c9d420861c5cc1dfad3210e2a53cdc6088ff3dd90b44f7961f5caebee + size: 284 + original: + hackage: network-udp-0.0.0 snapshots: - completed: sha256: 5a59b2a405b3aba3c00188453be172b85893cab8ebc352b1ef58b0eae5d248a2 diff --git a/unison-cli/package.yaml b/unison-cli/package.yaml index 09a63ae45..3402e98c9 100644 --- a/unison-cli/package.yaml +++ b/unison-cli/package.yaml @@ -51,6 +51,7 @@ dependencies: - mtl - network - network-simple + - network-udp - network-uri - nonempty-containers - open-browser diff --git a/unison-cli/src/Unison/CommandLine/Main.hs b/unison-cli/src/Unison/CommandLine/Main.hs index fe42fb134..de0d7e12f 100644 --- a/unison-cli/src/Unison/CommandLine/Main.hs +++ b/unison-cli/src/Unison/CommandLine/Main.hs @@ -13,7 +13,9 @@ import Data.IORef import Data.Text qualified as Text import Data.Text.IO qualified as Text import Ki qualified +import System.Console.Haskeline (Settings (autoAddHistory)) import System.Console.Haskeline qualified as Line +import System.Console.Haskeline.History qualified as Line import System.IO (hGetEcho, hPutStrLn, hSetEcho, stderr, stdin) import System.IO.Error (isDoesNotExistError) import U.Codebase.HashTags (CausalHash) @@ -102,17 +104,27 @@ getUserInput codebase authHTTPClient currentPath numberedArgs = ws -> do liftIO (parseInput codebase currentPath numberedArgs IP.patternMap ws) >>= \case Left msg -> do + -- We still add history that failed to parse so the user can easily reload + -- the input and fix it. + Line.modifyHistory $ Line.addHistoryUnlessConsecutiveDupe $ l liftIO $ putPrettyLn msg go Right Nothing -> do -- Ctrl-c or some input cancel, re-run the prompt go Right (Just (expandedArgs, i)) -> do + let expandedArgsStr = unwords expandedArgs when (expandedArgs /= ws) $ do - liftIO . putStrLn $ fullPrompt <> unwords expandedArgs + liftIO . putStrLn $ fullPrompt <> expandedArgsStr + Line.modifyHistory $ Line.addHistoryUnlessConsecutiveDupe $ unwords expandedArgs pure i settings :: Line.Settings IO - settings = Line.Settings tabComplete (Just ".unisonHistory") True + settings = + Line.Settings + { complete = tabComplete, + historyFile = Just ".unisonHistory", + autoAddHistory = False + } tabComplete = haskelineTabComplete IP.patternMap codebase authHTTPClient currentPath main :: diff --git a/unison-cli/unison-cli.cabal b/unison-cli/unison-cli.cabal index d6def3585..f0a7a249a 100644 --- a/unison-cli/unison-cli.cabal +++ b/unison-cli/unison-cli.cabal @@ -217,6 +217,7 @@ library , mtl , network , network-simple + , network-udp , network-uri , nonempty-containers , open-browser @@ -358,6 +359,7 @@ executable transcripts , mtl , network , network-simple + , network-udp , network-uri , nonempty-containers , open-browser @@ -507,6 +509,7 @@ test-suite cli-tests , mtl , network , network-simple + , network-udp , network-uri , nonempty-containers , open-browser diff --git a/unison-core/src/Unison/Type.hs b/unison-core/src/Unison/Type.hs index 9a39b85d9..4e571ff76 100644 --- a/unison-core/src/Unison/Type.hs +++ b/unison-core/src/Unison/Type.hs @@ -15,6 +15,19 @@ import Unison.LabeledDependency qualified as LD import Unison.Name qualified as Name import Unison.Names.ResolutionResult qualified as Names import Unison.Prelude + ( Const (Const, getConst), + Generic, + Generic1, + Identity (runIdentity), + Map, + Set, + Text, + foldl', + join, + sortOn, + ($>), + (<&>), + ) import Unison.Reference (TypeReference) import Unison.Reference qualified as Reference import Unison.Settings qualified as Settings @@ -269,6 +282,11 @@ filePathRef = Reference.Builtin "FilePath" threadIdRef = Reference.Builtin "ThreadId" socketRef = Reference.Builtin "Socket" +udpSocketRef, udpListenSocketRef, udpClientSockAddrRef :: TypeReference +udpSocketRef = Reference.Builtin "UDPSocket" +udpListenSocketRef = Reference.Builtin "ListenSocket" +udpClientSockAddrRef = Reference.Builtin "ClientSockAddr" + processHandleRef :: TypeReference processHandleRef = Reference.Builtin "ProcessHandle" @@ -388,6 +406,15 @@ mbytearrayType a = ref a mbytearrayRef socket :: (Ord v) => a -> Type v a socket a = ref a socketRef +udpSocket :: (Ord v) => a -> Type v a +udpSocket a = ref a udpSocketRef + +udpListenSocket :: (Ord v) => a -> Type v a +udpListenSocket a = ref a udpListenSocketRef + +udpClientSockAddr :: (Ord v) => a -> Type v a +udpClientSockAddr a = ref a udpClientSockAddrRef + list :: (Ord v) => a -> Type v a list a = ref a listRef diff --git a/unison-share-api/src/Unison/Server/Doc/AsHtml.hs b/unison-share-api/src/Unison/Server/Doc/AsHtml.hs index 84d6f7330..8403aa7e2 100644 --- a/unison-share-api/src/Unison/Server/Doc/AsHtml.hs +++ b/unison-share-api/src/Unison/Server/Doc/AsHtml.hs @@ -9,6 +9,7 @@ import Control.Monad.Writer.Class qualified as Writer import Control.Monad.Writer.Lazy (runWriterT) import Data.Char qualified as Char import Data.Foldable +import Data.List (intersperse) import Data.Map (Map) import Data.Map qualified as Map import Data.Maybe @@ -357,7 +358,8 @@ toHtml docNamesByRef document = [d] -> currentSectionLevelToHtml d ds -> - span_ [class_ "span"] <$> renderSequence currentSectionLevelToHtml (mergeWords " " ds) + span_ [class_ "span"] + <$> (renderSequence currentSectionLevelToHtml (intersperse (Word " ") (mergeWords " " ds))) BulletedList items -> let itemToHtml i = li_ [] <$> currentSectionLevelToHtml i diff --git a/unison-src/builtin-tests/jit-tests.output.md b/unison-src/builtin-tests/jit-tests.output.md index b2267d9d0..55c9234d5 100644 --- a/unison-src/builtin-tests/jit-tests.output.md +++ b/unison-src/builtin-tests/jit-tests.output.md @@ -49,3 +49,18 @@ foo = do () ``` +This can also only be tested by separately running this test, because +it is exercising the protocol that ucm uses to talk to the jit during +an exception. + +```ucm +runtime-tests/selected> run.native testBug + + 💔💥 + + I've encountered a call to builtin.bug with the following + value: + + "testing" + +``` diff --git a/unison-src/builtin-tests/jit-tests.tpl.md b/unison-src/builtin-tests/jit-tests.tpl.md index 3a0f95a32..b24a7c7c7 100644 --- a/unison-src/builtin-tests/jit-tests.tpl.md +++ b/unison-src/builtin-tests/jit-tests.tpl.md @@ -34,3 +34,11 @@ foo = do .> run.native foo .> run.native foo ``` + +This can also only be tested by separately running this test, because +it is exercising the protocol that ucm uses to talk to the jit during +an exception. + +```ucm:error +runtime-tests/selected> run.native testBug +``` diff --git a/unison-src/builtin-tests/udp-tests.u b/unison-src/builtin-tests/udp-tests.u new file mode 100644 index 000000000..458b711e3 --- /dev/null +++ b/unison-src/builtin-tests/udp-tests.u @@ -0,0 +1,66 @@ +UDP.client' h p = Either.toException (##IO.UDP.clientSocket.impl.v1 h p) +UDP.server' i p = Either.toException (##IO.UDP.serverSocket.impl.v1 i p) +closeClient' = ##IO.UDP.UDPSocket.close.impl.v1 >> Either.toException +send' s b = Either.toException (##IO.UDP.UDPSocket.send.impl.v1 s b) +closeServer' = ##IO.UDP.ListenSocket.close.impl.v1 >> Either.toException +sendTo' s b a = Either.toException (##IO.UDP.ListenSocket.sendTo.impl.v1 s b a) +recvFrom' = ##IO.UDP.ListenSocket.recvFrom.impl.v1 >> Either.toException +recv' = ##IO.UDP.UDPSocket.recv.impl.v1 >> Either.toException + +badPort = "what" +badIp = "what" +goodPort = "8000" +goodIp = "127.0.0.1" + +shouldFail fn = + result = catchAll fn + isLeft result + +udp.tests = do + check "client rejects invalid port" do shouldFail do UDP.client' goodIp badPort + check "server rejects invalid port" do shouldFail do UDP.server' goodIp badPort + check "server rejects invalid IP address" do shouldFail do UDP.server' badIp goodPort + check "client: no send after close" do shouldFail do + socket = UDP.client' goodIp goodPort + closeClient' socket + send' socket (toUtf8 "hello") -- should fail here + check "server no send after close" do shouldFail do + ssocket = UDP.server' goodIp goodPort + csocket = UDP.client' goodIp goodPort + send' csocket (toUtf8 "hello") + (_, clientSockAddr) = recvFrom' ssocket + closeServer' ssocket + sendTo' ssocket (toUtf8 "hello") clientSockAddr -- should fail here + check "no receive after close" do shouldFail do + socket = UDP.client' goodIp goodPort + closeClient' socket + recv' socket + !testServerAndClient + +testServerAndClient = do + fromServerMsg = "from server" + fromClientMsg = "from client" + setup = catchAll do + UDP.server' goodIp goodPort + match setup with + Left e -> + Tests.fail "Unable to open a socket for UDP server" (Debug.evalToText e) + Right ssocket -> + serve = do + (data, sockAddr) = recvFrom' ssocket + sendTo' ssocket (toUtf8 fromServerMsg) sockAddr + closeServer' ssocket + fromUtf8 data + + serveResult = !Promise.new + _ = fork do Promise.write serveResult (catchAll serve) + + data = catchAll do + csocket = UDP.client' goodIp goodPort + send' csocket (toUtf8 fromClientMsg) + d = recv' csocket + closeClient' csocket + fromUtf8 d + + checkEqual "Server received data" (Promise.read serveResult) (Right fromClientMsg) + checkEqual "Client received data" data (Right fromServerMsg) diff --git a/unison-src/transcripts-manual/gen-racket-libs.md b/unison-src/transcripts-manual/gen-racket-libs.md index 8c42dfd20..28589a3d5 100644 --- a/unison-src/transcripts-manual/gen-racket-libs.md +++ b/unison-src/transcripts-manual/gen-racket-libs.md @@ -5,7 +5,7 @@ Next, we'll download the jit project and generate a few Racket files from it. ```ucm .> project.create-empty jit-setup -jit-setup/main> pull @unison/internal/releases/0.0.15 lib.jit +jit-setup/main> pull @unison/internal/releases/0.0.16 lib.jit ``` ```unison diff --git a/unison-src/transcripts-manual/gen-racket-libs.output.md b/unison-src/transcripts-manual/gen-racket-libs.output.md index 8be97e5db..efc90384c 100644 --- a/unison-src/transcripts-manual/gen-racket-libs.output.md +++ b/unison-src/transcripts-manual/gen-racket-libs.output.md @@ -20,9 +20,9 @@ Next, we'll download the jit project and generate a few Racket files from it. 🎉 🥳 Happy coding! -jit-setup/main> pull @unison/internal/releases/0.0.15 lib.jit +jit-setup/main> pull @unison/internal/releases/0.0.16 lib.jit - Downloaded 15060 entities. + Downloaded 15091 entities. ✅ diff --git a/unison-src/transcripts-using-base/all-base-hashes.output.md b/unison-src/transcripts-using-base/all-base-hashes.output.md index 6f026525f..63c258e13 100644 --- a/unison-src/transcripts-using-base/all-base-hashes.output.md +++ b/unison-src/transcripts-using-base/all-base-hashes.output.md @@ -314,592 +314,606 @@ This transcript is intended to make visible accidental changes to the hashing al 99. -- ##Char.toText builtin.Char.toText : Char -> Text - 100. -- ##Code + 100. -- ##ClientSockAddr + builtin type builtin.ClientSockAddr + + 101. -- ##Code builtin type builtin.Code - 101. -- ##Code.cache_ + 102. -- ##Code.cache_ builtin.Code.cache_ : [(Link.Term, Code)] ->{IO} [Link.Term] - 102. -- ##Code.dependencies + 103. -- ##Code.dependencies builtin.Code.dependencies : Code -> [Link.Term] - 103. -- ##Code.deserialize + 104. -- ##Code.deserialize builtin.Code.deserialize : Bytes -> Either Text Code - 104. -- ##Code.display + 105. -- ##Code.display builtin.Code.display : Text -> Code -> Text - 105. -- ##Code.isMissing + 106. -- ##Code.isMissing builtin.Code.isMissing : Link.Term ->{IO} Boolean - 106. -- ##Code.lookup + 107. -- ##Code.lookup builtin.Code.lookup : Link.Term ->{IO} Optional Code - 107. -- ##Code.serialize + 108. -- ##Code.serialize builtin.Code.serialize : Code -> Bytes - 108. -- ##Code.validate + 109. -- ##Code.validate builtin.Code.validate : [(Link.Term, Code)] ->{IO} Optional Failure - 109. -- ##Code.validateLinks + 110. -- ##Code.validateLinks builtin.Code.validateLinks : [(Link.Term, Code)] ->{Exception} Either [Link.Term] [Link.Term] - 110. -- #ldqsht5qvddaabskcad3idka4nqkv6lfncrp0s0o4rqbbnk1qvq269bueu7qobhvaf7gpluqtpn9bgp9u69jsntv0u6o4qtbktnfrs0 + 111. -- #ldqsht5qvddaabskcad3idka4nqkv6lfncrp0s0o4rqbbnk1qvq269bueu7qobhvaf7gpluqtpn9bgp9u69jsntv0u6o4qtbktnfrs0 type builtin.ConsoleText - 111. -- #ldqsht5qvddaabskcad3idka4nqkv6lfncrp0s0o4rqbbnk1qvq269bueu7qobhvaf7gpluqtpn9bgp9u69jsntv0u6o4qtbktnfrs0#5 + 112. -- #ldqsht5qvddaabskcad3idka4nqkv6lfncrp0s0o4rqbbnk1qvq269bueu7qobhvaf7gpluqtpn9bgp9u69jsntv0u6o4qtbktnfrs0#5 builtin.ConsoleText.Background : Color -> ConsoleText -> ConsoleText - 112. -- #ldqsht5qvddaabskcad3idka4nqkv6lfncrp0s0o4rqbbnk1qvq269bueu7qobhvaf7gpluqtpn9bgp9u69jsntv0u6o4qtbktnfrs0#0 + 113. -- #ldqsht5qvddaabskcad3idka4nqkv6lfncrp0s0o4rqbbnk1qvq269bueu7qobhvaf7gpluqtpn9bgp9u69jsntv0u6o4qtbktnfrs0#0 builtin.ConsoleText.Bold : ConsoleText -> ConsoleText - 113. -- #ldqsht5qvddaabskcad3idka4nqkv6lfncrp0s0o4rqbbnk1qvq269bueu7qobhvaf7gpluqtpn9bgp9u69jsntv0u6o4qtbktnfrs0#4 + 114. -- #ldqsht5qvddaabskcad3idka4nqkv6lfncrp0s0o4rqbbnk1qvq269bueu7qobhvaf7gpluqtpn9bgp9u69jsntv0u6o4qtbktnfrs0#4 builtin.ConsoleText.Foreground : Color -> ConsoleText -> ConsoleText - 114. -- #ldqsht5qvddaabskcad3idka4nqkv6lfncrp0s0o4rqbbnk1qvq269bueu7qobhvaf7gpluqtpn9bgp9u69jsntv0u6o4qtbktnfrs0#2 + 115. -- #ldqsht5qvddaabskcad3idka4nqkv6lfncrp0s0o4rqbbnk1qvq269bueu7qobhvaf7gpluqtpn9bgp9u69jsntv0u6o4qtbktnfrs0#2 builtin.ConsoleText.Invert : ConsoleText -> ConsoleText - 115. -- #ldqsht5qvddaabskcad3idka4nqkv6lfncrp0s0o4rqbbnk1qvq269bueu7qobhvaf7gpluqtpn9bgp9u69jsntv0u6o4qtbktnfrs0#3 + 116. -- #ldqsht5qvddaabskcad3idka4nqkv6lfncrp0s0o4rqbbnk1qvq269bueu7qobhvaf7gpluqtpn9bgp9u69jsntv0u6o4qtbktnfrs0#3 builtin.ConsoleText.Plain : Text -> ConsoleText - 116. -- #ldqsht5qvddaabskcad3idka4nqkv6lfncrp0s0o4rqbbnk1qvq269bueu7qobhvaf7gpluqtpn9bgp9u69jsntv0u6o4qtbktnfrs0#1 + 117. -- #ldqsht5qvddaabskcad3idka4nqkv6lfncrp0s0o4rqbbnk1qvq269bueu7qobhvaf7gpluqtpn9bgp9u69jsntv0u6o4qtbktnfrs0#1 builtin.ConsoleText.Underline : ConsoleText -> ConsoleText - 117. -- #pgornst1pqaea8qmf8ckbtvrm7f6hn49djhffgebajmo12faf4jku63ftc9fp0r4k58e0qcdi77g08f34b2ihvsu97s48du6mfn7vko + 118. -- #pgornst1pqaea8qmf8ckbtvrm7f6hn49djhffgebajmo12faf4jku63ftc9fp0r4k58e0qcdi77g08f34b2ihvsu97s48du6mfn7vko type builtin.CopyrightHolder - 118. -- #pgornst1pqaea8qmf8ckbtvrm7f6hn49djhffgebajmo12faf4jku63ftc9fp0r4k58e0qcdi77g08f34b2ihvsu97s48du6mfn7vko#0 + 119. -- #pgornst1pqaea8qmf8ckbtvrm7f6hn49djhffgebajmo12faf4jku63ftc9fp0r4k58e0qcdi77g08f34b2ihvsu97s48du6mfn7vko#0 builtin.CopyrightHolder.CopyrightHolder : GUID -> Text -> CopyrightHolder - 119. -- #9jpkv5bb0d680ffs4f2j4lntj54m1iq9kaei8foqv5973i04jq9fugbn9msmpeiorjh4umhdeak625u53hejkvkm3buruj33msd1p6g + 120. -- #9jpkv5bb0d680ffs4f2j4lntj54m1iq9kaei8foqv5973i04jq9fugbn9msmpeiorjh4umhdeak625u53hejkvkm3buruj33msd1p6g builtin.CopyrightHolder.guid : CopyrightHolder -> GUID - 120. -- #6fhjsi02lnhvotndl6ufqnnsv20f3b9b4eg45n0rgo96m8f21dpqe5erb2dtn9nhdlp028vkock07r0foqune3jojhcrnmti9srsmdg + 121. -- #6fhjsi02lnhvotndl6ufqnnsv20f3b9b4eg45n0rgo96m8f21dpqe5erb2dtn9nhdlp028vkock07r0foqune3jojhcrnmti9srsmdg builtin.CopyrightHolder.guid.modify : (GUID ->{g} GUID) -> CopyrightHolder ->{g} CopyrightHolder - 121. -- #1lk04okan4prc9kkh7julshv5l2q331pa5tf5f0ghm7ob5vkep3t6dnqejc8aju4i2vob6b5seliccer3a1kmtq4481i36alivhgdr0 + 122. -- #1lk04okan4prc9kkh7julshv5l2q331pa5tf5f0ghm7ob5vkep3t6dnqejc8aju4i2vob6b5seliccer3a1kmtq4481i36alivhgdr0 builtin.CopyrightHolder.guid.set : GUID -> CopyrightHolder -> CopyrightHolder - 122. -- #u1k741o71gg743tr5o7fc3joeqdm14qkd58cf2h2tmkpejr2uj3qhclvugqsgoighd7o4ijlrp17i6iadgsuhhhb56vi4j22i6c2lbo + 123. -- #u1k741o71gg743tr5o7fc3joeqdm14qkd58cf2h2tmkpejr2uj3qhclvugqsgoighd7o4ijlrp17i6iadgsuhhhb56vi4j22i6c2lbo builtin.CopyrightHolder.name : CopyrightHolder -> Text - 123. -- #3845ei99ci6p7dh3bcsctodd0otjtsntik5n0q7fpafo3s7v45a8nl7mk6ae7qot87jr9p4q3857tm4jtvmkb4s3rtn77t7goaphmf8 + 124. -- #3845ei99ci6p7dh3bcsctodd0otjtsntik5n0q7fpafo3s7v45a8nl7mk6ae7qot87jr9p4q3857tm4jtvmkb4s3rtn77t7goaphmf8 builtin.CopyrightHolder.name.modify : (Text ->{g} Text) -> CopyrightHolder ->{g} CopyrightHolder - 124. -- #2ehufgpsgnd2jq0i1topsir6dvv2m132dp2phs2bncnm6n9qrf7oaod6pbmvs9muihlq9dckpnughb3pajrmit7chdr67qco6tsd8j0 + 125. -- #2ehufgpsgnd2jq0i1topsir6dvv2m132dp2phs2bncnm6n9qrf7oaod6pbmvs9muihlq9dckpnughb3pajrmit7chdr67qco6tsd8j0 builtin.CopyrightHolder.name.set : Text -> CopyrightHolder -> CopyrightHolder - 125. -- #bcubd2qdb27v92gb4kohhbq710cdu0g1njvnjm5iqemr6b0sq44nheo4jsgi9demkcrej53oj8hgjgdcsc50l5j53mg9h4koo52bfb8 + 126. -- #bcubd2qdb27v92gb4kohhbq710cdu0g1njvnjm5iqemr6b0sq44nheo4jsgi9demkcrej53oj8hgjgdcsc50l5j53mg9h4koo52bfb8 type builtin.crypto.CryptoFailure - 126. -- ##crypto.Ed25519.sign.impl + 127. -- ##crypto.Ed25519.sign.impl builtin.crypto.Ed25519.sign.impl : Bytes -> Bytes -> Bytes -> Either Failure Bytes - 127. -- ##crypto.Ed25519.verify.impl + 128. -- ##crypto.Ed25519.verify.impl builtin.crypto.Ed25519.verify.impl : Bytes -> Bytes -> Bytes -> Either Failure Boolean - 128. -- ##crypto.hash + 129. -- ##crypto.hash builtin.crypto.hash : HashAlgorithm -> a -> Bytes - 129. -- ##crypto.HashAlgorithm + 130. -- ##crypto.HashAlgorithm builtin type builtin.crypto.HashAlgorithm - 130. -- ##crypto.HashAlgorithm.Blake2b_256 + 131. -- ##crypto.HashAlgorithm.Blake2b_256 builtin.crypto.HashAlgorithm.Blake2b_256 : HashAlgorithm - 131. -- ##crypto.HashAlgorithm.Blake2b_512 + 132. -- ##crypto.HashAlgorithm.Blake2b_512 builtin.crypto.HashAlgorithm.Blake2b_512 : HashAlgorithm - 132. -- ##crypto.HashAlgorithm.Blake2s_256 + 133. -- ##crypto.HashAlgorithm.Blake2s_256 builtin.crypto.HashAlgorithm.Blake2s_256 : HashAlgorithm - 133. -- ##crypto.HashAlgorithm.Md5 + 134. -- ##crypto.HashAlgorithm.Md5 builtin.crypto.HashAlgorithm.Md5 : HashAlgorithm - 134. -- ##crypto.HashAlgorithm.Sha1 + 135. -- ##crypto.HashAlgorithm.Sha1 builtin.crypto.HashAlgorithm.Sha1 : HashAlgorithm - 135. -- ##crypto.HashAlgorithm.Sha2_256 + 136. -- ##crypto.HashAlgorithm.Sha2_256 builtin.crypto.HashAlgorithm.Sha2_256 : HashAlgorithm - 136. -- ##crypto.HashAlgorithm.Sha2_512 + 137. -- ##crypto.HashAlgorithm.Sha2_512 builtin.crypto.HashAlgorithm.Sha2_512 : HashAlgorithm - 137. -- ##crypto.HashAlgorithm.Sha3_256 + 138. -- ##crypto.HashAlgorithm.Sha3_256 builtin.crypto.HashAlgorithm.Sha3_256 : HashAlgorithm - 138. -- ##crypto.HashAlgorithm.Sha3_512 + 139. -- ##crypto.HashAlgorithm.Sha3_512 builtin.crypto.HashAlgorithm.Sha3_512 : HashAlgorithm - 139. -- ##crypto.hashBytes + 140. -- ##crypto.hashBytes builtin.crypto.hashBytes : HashAlgorithm -> Bytes -> Bytes - 140. -- ##crypto.hmac + 141. -- ##crypto.hmac builtin.crypto.hmac : HashAlgorithm -> Bytes -> a -> Bytes - 141. -- ##crypto.hmacBytes + 142. -- ##crypto.hmacBytes builtin.crypto.hmacBytes : HashAlgorithm -> Bytes -> Bytes -> Bytes - 142. -- ##Debug.toText + 143. -- ##crypto.Rsa.sign.impl + builtin.crypto.Rsa.sign.impl : Bytes + -> Bytes + -> Either Failure Bytes + + 144. -- ##crypto.Rsa.verify.impl + builtin.crypto.Rsa.verify.impl : Bytes + -> Bytes + -> Bytes + -> Either Failure Boolean + + 145. -- ##Debug.toText builtin.Debug.toText : a -> Optional (Either Text Text) - 143. -- ##Debug.trace + 146. -- ##Debug.trace builtin.Debug.trace : Text -> a -> () - 144. -- ##Debug.watch + 147. -- ##Debug.watch builtin.Debug.watch : Text -> a -> a - 145. -- #p65rcethk26an850aaaceojremfu054hqllhoip1mt9s22584j9r62o08qo9t0pri7ssgu9m7f0rfp4nujhulgbmo41tkgl182quhd8 + 148. -- #p65rcethk26an850aaaceojremfu054hqllhoip1mt9s22584j9r62o08qo9t0pri7ssgu9m7f0rfp4nujhulgbmo41tkgl182quhd8 type builtin.Doc - 146. -- #baiqeiovdrs4ju0grn5q5akq64k4kuhgifqno52smkkttqg31jkgm3qa9o3ohe54fgpiigd1tj0an7rfveopfg622sjj9v9g44n27go + 149. -- #baiqeiovdrs4ju0grn5q5akq64k4kuhgifqno52smkkttqg31jkgm3qa9o3ohe54fgpiigd1tj0an7rfveopfg622sjj9v9g44n27go builtin.Doc.++ : Doc2 -> Doc2 -> Doc2 - 147. -- #p65rcethk26an850aaaceojremfu054hqllhoip1mt9s22584j9r62o08qo9t0pri7ssgu9m7f0rfp4nujhulgbmo41tkgl182quhd8#0 + 150. -- #p65rcethk26an850aaaceojremfu054hqllhoip1mt9s22584j9r62o08qo9t0pri7ssgu9m7f0rfp4nujhulgbmo41tkgl182quhd8#0 builtin.Doc.Blob : Text -> Doc - 148. -- #p65rcethk26an850aaaceojremfu054hqllhoip1mt9s22584j9r62o08qo9t0pri7ssgu9m7f0rfp4nujhulgbmo41tkgl182quhd8#4 + 151. -- #p65rcethk26an850aaaceojremfu054hqllhoip1mt9s22584j9r62o08qo9t0pri7ssgu9m7f0rfp4nujhulgbmo41tkgl182quhd8#4 builtin.Doc.Evaluate : Link.Term -> Doc - 149. -- #p65rcethk26an850aaaceojremfu054hqllhoip1mt9s22584j9r62o08qo9t0pri7ssgu9m7f0rfp4nujhulgbmo41tkgl182quhd8#5 + 152. -- #p65rcethk26an850aaaceojremfu054hqllhoip1mt9s22584j9r62o08qo9t0pri7ssgu9m7f0rfp4nujhulgbmo41tkgl182quhd8#5 builtin.Doc.Join : [Doc] -> Doc - 150. -- #p65rcethk26an850aaaceojremfu054hqllhoip1mt9s22584j9r62o08qo9t0pri7ssgu9m7f0rfp4nujhulgbmo41tkgl182quhd8#1 + 153. -- #p65rcethk26an850aaaceojremfu054hqllhoip1mt9s22584j9r62o08qo9t0pri7ssgu9m7f0rfp4nujhulgbmo41tkgl182quhd8#1 builtin.Doc.Link : Link -> Doc - 151. -- #p65rcethk26an850aaaceojremfu054hqllhoip1mt9s22584j9r62o08qo9t0pri7ssgu9m7f0rfp4nujhulgbmo41tkgl182quhd8#3 + 154. -- #p65rcethk26an850aaaceojremfu054hqllhoip1mt9s22584j9r62o08qo9t0pri7ssgu9m7f0rfp4nujhulgbmo41tkgl182quhd8#3 builtin.Doc.Signature : Link.Term -> Doc - 152. -- #p65rcethk26an850aaaceojremfu054hqllhoip1mt9s22584j9r62o08qo9t0pri7ssgu9m7f0rfp4nujhulgbmo41tkgl182quhd8#2 + 155. -- #p65rcethk26an850aaaceojremfu054hqllhoip1mt9s22584j9r62o08qo9t0pri7ssgu9m7f0rfp4nujhulgbmo41tkgl182quhd8#2 builtin.Doc.Source : Link -> Doc - 153. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0 + 156. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0 type builtin.Doc2 - 154. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#27 + 157. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#27 builtin.Doc2.Anchor : Text -> Doc2 -> Doc2 - 155. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#11 + 158. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#11 builtin.Doc2.Aside : Doc2 -> Doc2 - 156. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#15 + 159. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#15 builtin.Doc2.Blankline : Doc2 - 157. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#10 + 160. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#10 builtin.Doc2.Blockquote : Doc2 -> Doc2 - 158. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#7 + 161. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#7 builtin.Doc2.Bold : Doc2 -> Doc2 - 159. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#21 + 162. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#21 builtin.Doc2.BulletedList : [Doc2] -> Doc2 - 160. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#3 + 163. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#3 builtin.Doc2.Callout : Optional Doc2 -> Doc2 -> Doc2 - 161. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#6 + 164. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#6 builtin.Doc2.Code : Doc2 -> Doc2 - 162. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#25 + 165. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#25 builtin.Doc2.CodeBlock : Text -> Doc2 -> Doc2 - 163. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#24 + 166. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#24 builtin.Doc2.Column : [Doc2] -> Doc2 - 164. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#0 + 167. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#0 builtin.Doc2.Folded : Boolean -> Doc2 -> Doc2 -> Doc2 - 165. -- #h3gajooii4tsdseghcbcsq4qq7c33mtb71u5npg35b06mgv7v654g0n55gpq212umfmq7nvi11o28m1v13r5fto5g8ium3ee4qk1i68 + 168. -- #h3gajooii4tsdseghcbcsq4qq7c33mtb71u5npg35b06mgv7v654g0n55gpq212umfmq7nvi11o28m1v13r5fto5g8ium3ee4qk1i68 type builtin.Doc2.FrontMatter - 166. -- #h3gajooii4tsdseghcbcsq4qq7c33mtb71u5npg35b06mgv7v654g0n55gpq212umfmq7nvi11o28m1v13r5fto5g8ium3ee4qk1i68#0 + 169. -- #h3gajooii4tsdseghcbcsq4qq7c33mtb71u5npg35b06mgv7v654g0n55gpq212umfmq7nvi11o28m1v13r5fto5g8ium3ee4qk1i68#0 builtin.Doc2.FrontMatter.FrontMatter : [(Text, Text)] -> FrontMatter - 167. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#12 + 170. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#12 builtin.Doc2.Group : Doc2 -> Doc2 - 168. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#14 + 171. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#14 builtin.Doc2.Image : Doc2 -> Doc2 -> Optional Doc2 -> Doc2 - 169. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#8 + 172. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#8 builtin.Doc2.Italic : Doc2 -> Doc2 - 170. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#22 + 173. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#22 builtin.Doc2.Join : [Doc2] -> Doc2 - 171. -- #lpf7g5c2ct61mci2okedmug8o0i2j0rhpealc05r2musapmn15cina6dsqdvis234evvb2bo09l2p8v5qhh0me7gi1j37nqqp47qvto + 174. -- #lpf7g5c2ct61mci2okedmug8o0i2j0rhpealc05r2musapmn15cina6dsqdvis234evvb2bo09l2p8v5qhh0me7gi1j37nqqp47qvto type builtin.Doc2.LaTeXInline - 172. -- #lpf7g5c2ct61mci2okedmug8o0i2j0rhpealc05r2musapmn15cina6dsqdvis234evvb2bo09l2p8v5qhh0me7gi1j37nqqp47qvto#0 + 175. -- #lpf7g5c2ct61mci2okedmug8o0i2j0rhpealc05r2musapmn15cina6dsqdvis234evvb2bo09l2p8v5qhh0me7gi1j37nqqp47qvto#0 builtin.Doc2.LaTeXInline.LaTeXInline : Text -> LaTeXInline - 173. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#16 + 176. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#16 builtin.Doc2.Linebreak : Doc2 - 174. -- #ut0tds116gr0soc9p6nroaalqlq423u1mao3p4jjultjmok3vbck69la7rs26duptji5v5hscijpek4hotu4krbfah8np3sntr87gb0 + 177. -- #ut0tds116gr0soc9p6nroaalqlq423u1mao3p4jjultjmok3vbck69la7rs26duptji5v5hscijpek4hotu4krbfah8np3sntr87gb0 type builtin.Doc2.MediaSource - 175. -- #ut0tds116gr0soc9p6nroaalqlq423u1mao3p4jjultjmok3vbck69la7rs26duptji5v5hscijpek4hotu4krbfah8np3sntr87gb0#0 + 178. -- #ut0tds116gr0soc9p6nroaalqlq423u1mao3p4jjultjmok3vbck69la7rs26duptji5v5hscijpek4hotu4krbfah8np3sntr87gb0#0 builtin.Doc2.MediaSource.MediaSource : Text -> Optional Text -> MediaSource - 176. -- #f7s1m2rs7ldj4idrcirtdqohsmc6n719e6cdqtgrhdkcrbm7971uvug6mvkrcc32qhdpo1og4oqin4rbmb2346m47ni24k5m3bpp3so + 179. -- #f7s1m2rs7ldj4idrcirtdqohsmc6n719e6cdqtgrhdkcrbm7971uvug6mvkrcc32qhdpo1og4oqin4rbmb2346m47ni24k5m3bpp3so builtin.Doc2.MediaSource.mimeType : MediaSource -> Optional Text - 177. -- #rncdj545f93f7nfrneabp6jlrjag766vr2n18al8u2a78ju5v746agg62r4ob8u6ue8eeac6nbg8apeii6qfasgfv2q2ap3h4sk1tdg + 180. -- #rncdj545f93f7nfrneabp6jlrjag766vr2n18al8u2a78ju5v746agg62r4ob8u6ue8eeac6nbg8apeii6qfasgfv2q2ap3h4sk1tdg builtin.Doc2.MediaSource.mimeType.modify : (Optional Text ->{g} Optional Text) -> MediaSource ->{g} MediaSource - 178. -- #54dl203thl9540r2jec546pishtg1b1ecb8vl6rqlbgf4h2rk04mrkdkqo4be82m8d3t2d0ef3gidjsn2r9u8ko7c9kvtavbqflim88 + 181. -- #54dl203thl9540r2jec546pishtg1b1ecb8vl6rqlbgf4h2rk04mrkdkqo4be82m8d3t2d0ef3gidjsn2r9u8ko7c9kvtavbqflim88 builtin.Doc2.MediaSource.mimeType.set : Optional Text -> MediaSource -> MediaSource - 179. -- #77l9vc6k6miu7pobamoasrpdm455ddgprgvfpg2di6liigijg70f4t3ppmpbs3j12kp93eep7u0e5r1bdq0niou0v85lo4aa5kek8mg + 182. -- #77l9vc6k6miu7pobamoasrpdm455ddgprgvfpg2di6liigijg70f4t3ppmpbs3j12kp93eep7u0e5r1bdq0niou0v85lo4aa5kek8mg builtin.Doc2.MediaSource.sourceUrl : MediaSource -> Text - 180. -- #laoh1nhllsb9vf0reilmbmjutdei2b0vs0vse1s8j148imfi1m9uu4l17iqdt9r5575dap8jnlq6r48kdn6ob70iroso75erqfc74e0 + 183. -- #laoh1nhllsb9vf0reilmbmjutdei2b0vs0vse1s8j148imfi1m9uu4l17iqdt9r5575dap8jnlq6r48kdn6ob70iroso75erqfc74e0 builtin.Doc2.MediaSource.sourceUrl.modify : (Text ->{g} Text) -> MediaSource ->{g} MediaSource - 181. -- #eb0dl30fc5k80vb0fna187vmag5ta1rgik40s1shlkng8stvvkt2gglecit8ajjd8vmfrtg8ki8ft3ife8rrqlcoit5161ekg6vhcfo + 184. -- #eb0dl30fc5k80vb0fna187vmag5ta1rgik40s1shlkng8stvvkt2gglecit8ajjd8vmfrtg8ki8ft3ife8rrqlcoit5161ekg6vhcfo builtin.Doc2.MediaSource.sourceUrl.set : Text -> MediaSource -> MediaSource - 182. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#2 + 185. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#2 builtin.Doc2.NamedLink : Doc2 -> Doc2 -> Doc2 - 183. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#4 + 186. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#4 builtin.Doc2.NumberedList : Nat -> [Doc2] -> Doc2 - 184. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#20 + 187. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#20 builtin.Doc2.Paragraph : [Doc2] -> Doc2 - 185. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#13 + 188. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#13 builtin.Doc2.Section : Doc2 -> [Doc2] -> Doc2 - 186. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#17 + 189. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#17 builtin.Doc2.SectionBreak : Doc2 - 187. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#5 + 190. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#5 builtin.Doc2.Special : SpecialForm -> Doc2 - 188. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0 + 191. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0 type builtin.Doc2.SpecialForm - 189. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#4 + 192. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#4 builtin.Doc2.SpecialForm.Embed : Any -> SpecialForm - 190. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#5 + 193. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#5 builtin.Doc2.SpecialForm.EmbedInline : Any -> SpecialForm - 191. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#9 + 194. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#9 builtin.Doc2.SpecialForm.Eval : Doc2.Term -> SpecialForm - 192. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#10 + 195. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#10 builtin.Doc2.SpecialForm.EvalInline : Doc2.Term -> SpecialForm - 193. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#0 + 196. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#0 builtin.Doc2.SpecialForm.Example : Nat -> Doc2.Term -> SpecialForm - 194. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#1 + 197. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#1 builtin.Doc2.SpecialForm.ExampleBlock : Nat -> Doc2.Term -> SpecialForm - 195. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#7 + 198. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#7 builtin.Doc2.SpecialForm.FoldedSource : [( Either Type Doc2.Term, [Doc2.Term])] -> SpecialForm - 196. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#3 + 199. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#3 builtin.Doc2.SpecialForm.Link : Either Type Doc2.Term -> SpecialForm - 197. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#2 + 200. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#2 builtin.Doc2.SpecialForm.Signature : [Doc2.Term] -> SpecialForm - 198. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#8 + 201. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#8 builtin.Doc2.SpecialForm.SignatureInline : Doc2.Term -> SpecialForm - 199. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#6 + 202. -- #e46kdnv67raqhc4m3jnitkh3o9seq3q5mtlqnvobjlqnnd2tk7nui54b6grui7eql62fne4fo3ndetmeb23oj5es85habha5f6saoi0#6 builtin.Doc2.SpecialForm.Source : [( Either Type Doc2.Term, [Doc2.Term])] -> SpecialForm - 200. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#9 + 203. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#9 builtin.Doc2.Strikethrough : Doc2 -> Doc2 - 201. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#26 + 204. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#26 builtin.Doc2.Style : Text -> Doc2 -> Doc2 - 202. -- #sv2cta4p4th10h7tpurvr0t6s3cbahlevvmpadk01v32e39kse8aicdvfsm2dbk6ltc68ht788jvkfhk6ol2mch7eubngtug019e8fg + 205. -- #sv2cta4p4th10h7tpurvr0t6s3cbahlevvmpadk01v32e39kse8aicdvfsm2dbk6ltc68ht788jvkfhk6ol2mch7eubngtug019e8fg type builtin.Doc2.Svg - 203. -- #sv2cta4p4th10h7tpurvr0t6s3cbahlevvmpadk01v32e39kse8aicdvfsm2dbk6ltc68ht788jvkfhk6ol2mch7eubngtug019e8fg#0 + 206. -- #sv2cta4p4th10h7tpurvr0t6s3cbahlevvmpadk01v32e39kse8aicdvfsm2dbk6ltc68ht788jvkfhk6ol2mch7eubngtug019e8fg#0 builtin.Doc2.Svg.Svg : Text -> Svg - 204. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#18 + 207. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#18 builtin.Doc2.Table : [[Doc2]] -> Doc2 - 205. -- #s0an21vospbdlsbddiskuvt3ngbf00n78sip2o1mnp4jgp16i7sursbm14bf8ap7osphqbis2lduep3i29b7diu8sf03f8tlqd7rgcg + 208. -- #s0an21vospbdlsbddiskuvt3ngbf00n78sip2o1mnp4jgp16i7sursbm14bf8ap7osphqbis2lduep3i29b7diu8sf03f8tlqd7rgcg type builtin.Doc2.Term - 206. -- #42hub6f3fn0p5fk8t5bb2njhbgg5dj75vtqijvins6h45pkorakbu3g8h312ghu98ee4h75tb61fti192ckpk9cpdle9hsr8pdthkjo + 209. -- #42hub6f3fn0p5fk8t5bb2njhbgg5dj75vtqijvins6h45pkorakbu3g8h312ghu98ee4h75tb61fti192ckpk9cpdle9hsr8pdthkjo builtin.Doc2.term : '{g} a -> Doc2.Term - 207. -- #s0an21vospbdlsbddiskuvt3ngbf00n78sip2o1mnp4jgp16i7sursbm14bf8ap7osphqbis2lduep3i29b7diu8sf03f8tlqd7rgcg#0 + 210. -- #s0an21vospbdlsbddiskuvt3ngbf00n78sip2o1mnp4jgp16i7sursbm14bf8ap7osphqbis2lduep3i29b7diu8sf03f8tlqd7rgcg#0 builtin.Doc2.Term.Term : Any -> Doc2.Term - 208. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#1 + 211. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#1 builtin.Doc2.Tooltip : Doc2 -> Doc2 -> Doc2 - 209. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#23 + 212. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#23 builtin.Doc2.UntitledSection : [Doc2] -> Doc2 - 210. -- #794fndq1941e2khqv5uh7fmk9es2g4fkp8pr48objgs6blc1pqsdt2ab4o79noril2l7s70iu2eimn1smpd8t40j4g18btian8a2pt0 + 213. -- #794fndq1941e2khqv5uh7fmk9es2g4fkp8pr48objgs6blc1pqsdt2ab4o79noril2l7s70iu2eimn1smpd8t40j4g18btian8a2pt0 type builtin.Doc2.Video - 211. -- #46er7fsgre91rer0mpk6vhaa2vie19i0piubvtnfmt3vq7odcjfr6tlf0mc57q4jnij9rkolpekjd6dpqdotn41guk9lp9qioa88m58 + 214. -- #46er7fsgre91rer0mpk6vhaa2vie19i0piubvtnfmt3vq7odcjfr6tlf0mc57q4jnij9rkolpekjd6dpqdotn41guk9lp9qioa88m58 builtin.Doc2.Video.config : Video -> [(Text, Text)] - 212. -- #vld47vp37855gceko81jj00j5t0mf5p137ub57094585aq3jfevq0ob03fot9d73p97r2pj0alel9e6a7lqcc7mue0ogefshg991e6g + 215. -- #vld47vp37855gceko81jj00j5t0mf5p137ub57094585aq3jfevq0ob03fot9d73p97r2pj0alel9e6a7lqcc7mue0ogefshg991e6g builtin.Doc2.Video.config.modify : ([(Text, Text)] ->{g} [(Text, Text)]) -> Video ->{g} Video - 213. -- #ll9hiqi1s63ragrv9ul3ouu2rvpjkok4gdmgqs6cl8j4fgdmqlgikc5lseoe94e9fvrughjfetlcsn7gc5ed8prtnljfo5j6r1vveq8 + 216. -- #ll9hiqi1s63ragrv9ul3ouu2rvpjkok4gdmgqs6cl8j4fgdmqlgikc5lseoe94e9fvrughjfetlcsn7gc5ed8prtnljfo5j6r1vveq8 builtin.Doc2.Video.config.set : [(Text, Text)] -> Video -> Video - 214. -- #a454aldsi00l8kh10bhi6d4phtdr9ht0es6apr05jert6oo4vstm5cdr4ee2k0srted1urqgvkrcoihjvmus6tph92v628f3lr9b92o + 217. -- #a454aldsi00l8kh10bhi6d4phtdr9ht0es6apr05jert6oo4vstm5cdr4ee2k0srted1urqgvkrcoihjvmus6tph92v628f3lr9b92o builtin.Doc2.Video.sources : Video -> [MediaSource] - 215. -- #nm77894uq9g3kv5mo7ubuptpimt53jml7jt825lr83gu41tqcfpg2krcesn7p5aaea107su7brg2gm8vn1l0mabpfnpbcdi4onlatvo + 218. -- #nm77894uq9g3kv5mo7ubuptpimt53jml7jt825lr83gu41tqcfpg2krcesn7p5aaea107su7brg2gm8vn1l0mabpfnpbcdi4onlatvo builtin.Doc2.Video.sources.modify : ([MediaSource] ->{g} [MediaSource]) -> Video ->{g} Video - 216. -- #5r0bgv3t666s4lh274mvtk13jqu1doc26ki2k8t2rpophrq2hjran1qodeobf3trlnniarjehr1rgl6scn6mhqpmcokdafja3b54jt0 + 219. -- #5r0bgv3t666s4lh274mvtk13jqu1doc26ki2k8t2rpophrq2hjran1qodeobf3trlnniarjehr1rgl6scn6mhqpmcokdafja3b54jt0 builtin.Doc2.Video.sources.set : [MediaSource] -> Video -> Video - 217. -- #794fndq1941e2khqv5uh7fmk9es2g4fkp8pr48objgs6blc1pqsdt2ab4o79noril2l7s70iu2eimn1smpd8t40j4g18btian8a2pt0#0 + 220. -- #794fndq1941e2khqv5uh7fmk9es2g4fkp8pr48objgs6blc1pqsdt2ab4o79noril2l7s70iu2eimn1smpd8t40j4g18btian8a2pt0#0 builtin.Doc2.Video.Video : [MediaSource] -> [(Text, Text)] -> Video - 218. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#19 + 221. -- #ej86si0ur1lsjade71dojr25phk9bbom9rdks6dltolos5tjivakujcriqe02npba53n9gd7tkh8bmv08ttjb9t35lq2ch5heshqcs0#19 builtin.Doc2.Word : Text -> Doc2 - 219. -- #0o7mf021foma9acqdaibmlh1jidlijq08uf7f5se9tssttqs546pfunjpk6s31mqoq8s2o1natede8hkk6he45l95fibglidikt44v8 + 222. -- #0o7mf021foma9acqdaibmlh1jidlijq08uf7f5se9tssttqs546pfunjpk6s31mqoq8s2o1natede8hkk6he45l95fibglidikt44v8 structural type builtin.Either a b - 220. -- #0o7mf021foma9acqdaibmlh1jidlijq08uf7f5se9tssttqs546pfunjpk6s31mqoq8s2o1natede8hkk6he45l95fibglidikt44v8#1 + 223. -- #0o7mf021foma9acqdaibmlh1jidlijq08uf7f5se9tssttqs546pfunjpk6s31mqoq8s2o1natede8hkk6he45l95fibglidikt44v8#1 builtin.Either.Left : a -> Either a b - 221. -- #i8po73lvi3etn7kqb6hpucm2e836861juvrjalqiv96legk4ds7e1qhfpaakbsajiruji4noos8u4f41i2un3glpemba22qnahl65lg + 224. -- #i8po73lvi3etn7kqb6hpucm2e836861juvrjalqiv96legk4ds7e1qhfpaakbsajiruji4noos8u4f41i2un3glpemba22qnahl65lg builtin.Either.mapRight : (a ->{g} b) -> Either e a ->{g} Either e b - 222. -- #0o7mf021foma9acqdaibmlh1jidlijq08uf7f5se9tssttqs546pfunjpk6s31mqoq8s2o1natede8hkk6he45l95fibglidikt44v8#0 + 225. -- #0o7mf021foma9acqdaibmlh1jidlijq08uf7f5se9tssttqs546pfunjpk6s31mqoq8s2o1natede8hkk6he45l95fibglidikt44v8#0 builtin.Either.Right : b -> Either a b - 223. -- #4n0fgs00hpsj3paqnm9bfm4nbt9cbrin3hl88i992m9tjiq1ik7eq72asu4hcg885uti36tbnj5rudt56eahhnut1nobofg86pk1bng + 226. -- #4n0fgs00hpsj3paqnm9bfm4nbt9cbrin3hl88i992m9tjiq1ik7eq72asu4hcg885uti36tbnj5rudt56eahhnut1nobofg86pk1bng structural ability builtin.Exception structural ability Exception - 224. -- #4n0fgs00hpsj3paqnm9bfm4nbt9cbrin3hl88i992m9tjiq1ik7eq72asu4hcg885uti36tbnj5rudt56eahhnut1nobofg86pk1bng#0 + 227. -- #4n0fgs00hpsj3paqnm9bfm4nbt9cbrin3hl88i992m9tjiq1ik7eq72asu4hcg885uti36tbnj5rudt56eahhnut1nobofg86pk1bng#0 builtin.Exception.raise, Exception.raise : Failure ->{Exception} x - 225. -- ##Float + 228. -- ##Float builtin type builtin.Float - 226. -- ##Float.* + 229. -- ##Float.* builtin.Float.* : Float -> Float -> Float - 227. -- ##Float.+ + 230. -- ##Float.+ builtin.Float.+ : Float -> Float -> Float - 228. -- ##Float.- + 231. -- ##Float.- builtin.Float.- : Float -> Float -> Float - 229. -- ##Float./ + 232. -- ##Float./ builtin.Float./ : Float -> Float -> Float - 230. -- ##Float.abs + 233. -- ##Float.abs builtin.Float.abs : Float -> Float - 231. -- ##Float.acos + 234. -- ##Float.acos builtin.Float.acos : Float -> Float - 232. -- ##Float.acosh + 235. -- ##Float.acosh builtin.Float.acosh : Float -> Float - 233. -- ##Float.asin + 236. -- ##Float.asin builtin.Float.asin : Float -> Float - 234. -- ##Float.asinh + 237. -- ##Float.asinh builtin.Float.asinh : Float -> Float - 235. -- ##Float.atan + 238. -- ##Float.atan builtin.Float.atan : Float -> Float - 236. -- ##Float.atan2 + 239. -- ##Float.atan2 builtin.Float.atan2 : Float -> Float -> Float - 237. -- ##Float.atanh + 240. -- ##Float.atanh builtin.Float.atanh : Float -> Float - 238. -- ##Float.ceiling + 241. -- ##Float.ceiling builtin.Float.ceiling : Float -> Int - 239. -- ##Float.cos + 242. -- ##Float.cos builtin.Float.cos : Float -> Float - 240. -- ##Float.cosh + 243. -- ##Float.cosh builtin.Float.cosh : Float -> Float - 241. -- ##Float.== + 244. -- ##Float.== builtin.Float.eq : Float -> Float -> Boolean - 242. -- ##Float.exp + 245. -- ##Float.exp builtin.Float.exp : Float -> Float - 243. -- ##Float.floor + 246. -- ##Float.floor builtin.Float.floor : Float -> Int - 244. -- ##Float.fromRepresentation + 247. -- ##Float.fromRepresentation builtin.Float.fromRepresentation : Nat -> Float - 245. -- ##Float.fromText + 248. -- ##Float.fromText builtin.Float.fromText : Text -> Optional Float - 246. -- ##Float.> + 249. -- ##Float.> builtin.Float.gt : Float -> Float -> Boolean - 247. -- ##Float.>= + 250. -- ##Float.>= builtin.Float.gteq : Float -> Float -> Boolean - 248. -- ##Float.log + 251. -- ##Float.log builtin.Float.log : Float -> Float - 249. -- ##Float.logBase + 252. -- ##Float.logBase builtin.Float.logBase : Float -> Float -> Float - 250. -- ##Float.< + 253. -- ##Float.< builtin.Float.lt : Float -> Float -> Boolean - 251. -- ##Float.<= + 254. -- ##Float.<= builtin.Float.lteq : Float -> Float -> Boolean - 252. -- ##Float.max + 255. -- ##Float.max builtin.Float.max : Float -> Float -> Float - 253. -- ##Float.min + 256. -- ##Float.min builtin.Float.min : Float -> Float -> Float - 254. -- ##Float.pow + 257. -- ##Float.pow builtin.Float.pow : Float -> Float -> Float - 255. -- ##Float.round + 258. -- ##Float.round builtin.Float.round : Float -> Int - 256. -- ##Float.sin + 259. -- ##Float.sin builtin.Float.sin : Float -> Float - 257. -- ##Float.sinh + 260. -- ##Float.sinh builtin.Float.sinh : Float -> Float - 258. -- ##Float.sqrt + 261. -- ##Float.sqrt builtin.Float.sqrt : Float -> Float - 259. -- ##Float.tan + 262. -- ##Float.tan builtin.Float.tan : Float -> Float - 260. -- ##Float.tanh + 263. -- ##Float.tanh builtin.Float.tanh : Float -> Float - 261. -- ##Float.toRepresentation + 264. -- ##Float.toRepresentation builtin.Float.toRepresentation : Float -> Nat - 262. -- ##Float.toText + 265. -- ##Float.toText builtin.Float.toText : Float -> Text - 263. -- ##Float.truncate + 266. -- ##Float.truncate builtin.Float.truncate : Float -> Int - 264. -- #hqectlr3gt02r6r984b3627eg5bq3d82lab5q18e3ql09u1ka8dblf5k50ae0q0d8gk87udqd7b6767q86gogdt8ghpdiq77gk6blr8 + 267. -- #hqectlr3gt02r6r984b3627eg5bq3d82lab5q18e3ql09u1ka8dblf5k50ae0q0d8gk87udqd7b6767q86gogdt8ghpdiq77gk6blr8 type builtin.GUID - 265. -- #hqectlr3gt02r6r984b3627eg5bq3d82lab5q18e3ql09u1ka8dblf5k50ae0q0d8gk87udqd7b6767q86gogdt8ghpdiq77gk6blr8#0 + 268. -- #hqectlr3gt02r6r984b3627eg5bq3d82lab5q18e3ql09u1ka8dblf5k50ae0q0d8gk87udqd7b6767q86gogdt8ghpdiq77gk6blr8#0 builtin.GUID.GUID : Bytes -> GUID - 266. -- ##Handle.toText + 269. -- ##Handle.toText builtin.Handle.toText : Handle -> Text - 267. -- ##ImmutableArray + 270. -- ##ImmutableArray builtin type builtin.ImmutableArray - 268. -- ##ImmutableArray.copyTo! + 271. -- ##ImmutableArray.copyTo! builtin.ImmutableArray.copyTo! : MutableArray g a -> Nat -> ImmutableArray a @@ -907,21 +921,21 @@ This transcript is intended to make visible accidental changes to the hashing al -> Nat ->{g, Exception} () - 269. -- #j76q8bad5uoq65d0416qq5acd70c4p797grmp24e6cstl7lo3beqprtt30254d5o1tg8afc659bjvh6ufg7ha4ljvhl32g2pcqkhum8 + 272. -- #j76q8bad5uoq65d0416qq5acd70c4p797grmp24e6cstl7lo3beqprtt30254d5o1tg8afc659bjvh6ufg7ha4ljvhl32g2pcqkhum8 builtin.ImmutableArray.fromList : [a] -> ImmutableArray a - 270. -- ##ImmutableArray.read + 273. -- ##ImmutableArray.read builtin.ImmutableArray.read : ImmutableArray a -> Nat ->{Exception} a - 271. -- ##ImmutableArray.size + 274. -- ##ImmutableArray.size builtin.ImmutableArray.size : ImmutableArray a -> Nat - 272. -- ##ImmutableByteArray + 275. -- ##ImmutableByteArray builtin type builtin.ImmutableByteArray - 273. -- ##ImmutableByteArray.copyTo! + 276. -- ##ImmutableByteArray.copyTo! builtin.ImmutableByteArray.copyTo! : MutableByteArray g -> Nat -> ImmutableByteArray @@ -929,886 +943,938 @@ This transcript is intended to make visible accidental changes to the hashing al -> Nat ->{g, Exception} () - 274. -- #oga1fp2c04ta09nait31evk6ga0u4onj8kleuj79ou9i8p4d85n7ja5tbahsdjrr3jkmb1h7rqiir4ci7dkgohlrstbj0shgal28170 + 277. -- #oga1fp2c04ta09nait31evk6ga0u4onj8kleuj79ou9i8p4d85n7ja5tbahsdjrr3jkmb1h7rqiir4ci7dkgohlrstbj0shgal28170 builtin.ImmutableByteArray.fromBytes : Bytes -> ImmutableByteArray - 275. -- ##ImmutableByteArray.read16be + 278. -- ##ImmutableByteArray.read16be builtin.ImmutableByteArray.read16be : ImmutableByteArray -> Nat ->{Exception} Nat - 276. -- ##ImmutableByteArray.read24be + 279. -- ##ImmutableByteArray.read24be builtin.ImmutableByteArray.read24be : ImmutableByteArray -> Nat ->{Exception} Nat - 277. -- ##ImmutableByteArray.read32be + 280. -- ##ImmutableByteArray.read32be builtin.ImmutableByteArray.read32be : ImmutableByteArray -> Nat ->{Exception} Nat - 278. -- ##ImmutableByteArray.read40be + 281. -- ##ImmutableByteArray.read40be builtin.ImmutableByteArray.read40be : ImmutableByteArray -> Nat ->{Exception} Nat - 279. -- ##ImmutableByteArray.read64be + 282. -- ##ImmutableByteArray.read64be builtin.ImmutableByteArray.read64be : ImmutableByteArray -> Nat ->{Exception} Nat - 280. -- ##ImmutableByteArray.read8 + 283. -- ##ImmutableByteArray.read8 builtin.ImmutableByteArray.read8 : ImmutableByteArray -> Nat ->{Exception} Nat - 281. -- ##ImmutableByteArray.size + 284. -- ##ImmutableByteArray.size builtin.ImmutableByteArray.size : ImmutableByteArray -> Nat - 282. -- ##Int + 285. -- ##Int builtin type builtin.Int - 283. -- ##Int.* + 286. -- ##Int.* builtin.Int.* : Int -> Int -> Int - 284. -- ##Int.+ + 287. -- ##Int.+ builtin.Int.+ : Int -> Int -> Int - 285. -- ##Int.- + 288. -- ##Int.- builtin.Int.- : Int -> Int -> Int - 286. -- ##Int./ + 289. -- ##Int./ builtin.Int./ : Int -> Int -> Int - 287. -- ##Int.and + 290. -- ##Int.and builtin.Int.and : Int -> Int -> Int - 288. -- ##Int.complement + 291. -- ##Int.complement builtin.Int.complement : Int -> Int - 289. -- ##Int.== + 292. -- ##Int.== builtin.Int.eq : Int -> Int -> Boolean - 290. -- ##Int.fromRepresentation + 293. -- ##Int.fromRepresentation builtin.Int.fromRepresentation : Nat -> Int - 291. -- ##Int.fromText + 294. -- ##Int.fromText builtin.Int.fromText : Text -> Optional Int - 292. -- ##Int.> + 295. -- ##Int.> builtin.Int.gt : Int -> Int -> Boolean - 293. -- ##Int.>= + 296. -- ##Int.>= builtin.Int.gteq : Int -> Int -> Boolean - 294. -- ##Int.increment + 297. -- ##Int.increment builtin.Int.increment : Int -> Int - 295. -- ##Int.isEven + 298. -- ##Int.isEven builtin.Int.isEven : Int -> Boolean - 296. -- ##Int.isOdd + 299. -- ##Int.isOdd builtin.Int.isOdd : Int -> Boolean - 297. -- ##Int.leadingZeros + 300. -- ##Int.leadingZeros builtin.Int.leadingZeros : Int -> Nat - 298. -- ##Int.< + 301. -- ##Int.< builtin.Int.lt : Int -> Int -> Boolean - 299. -- ##Int.<= + 302. -- ##Int.<= builtin.Int.lteq : Int -> Int -> Boolean - 300. -- ##Int.mod + 303. -- ##Int.mod builtin.Int.mod : Int -> Int -> Int - 301. -- ##Int.negate + 304. -- ##Int.negate builtin.Int.negate : Int -> Int - 302. -- ##Int.or + 305. -- ##Int.or builtin.Int.or : Int -> Int -> Int - 303. -- ##Int.popCount + 306. -- ##Int.popCount builtin.Int.popCount : Int -> Nat - 304. -- ##Int.pow + 307. -- ##Int.pow builtin.Int.pow : Int -> Nat -> Int - 305. -- ##Int.shiftLeft + 308. -- ##Int.shiftLeft builtin.Int.shiftLeft : Int -> Nat -> Int - 306. -- ##Int.shiftRight + 309. -- ##Int.shiftRight builtin.Int.shiftRight : Int -> Nat -> Int - 307. -- ##Int.signum + 310. -- ##Int.signum builtin.Int.signum : Int -> Int - 308. -- ##Int.toFloat + 311. -- ##Int.toFloat builtin.Int.toFloat : Int -> Float - 309. -- ##Int.toRepresentation + 312. -- ##Int.toRepresentation builtin.Int.toRepresentation : Int -> Nat - 310. -- ##Int.toText + 313. -- ##Int.toText builtin.Int.toText : Int -> Text - 311. -- ##Int.trailingZeros + 314. -- ##Int.trailingZeros builtin.Int.trailingZeros : Int -> Nat - 312. -- ##Int.truncate0 + 315. -- ##Int.truncate0 builtin.Int.truncate0 : Int -> Nat - 313. -- ##Int.xor + 316. -- ##Int.xor builtin.Int.xor : Int -> Int -> Int - 314. -- #s6ijmhqkkaus51chjgahogc7sdrqj9t66i599le2k7ts6fkl216f997hbses3mqk6a21vaj3cm1mertbldn0g503jt522vfo4rfv720 + 317. -- #s6ijmhqkkaus51chjgahogc7sdrqj9t66i599le2k7ts6fkl216f997hbses3mqk6a21vaj3cm1mertbldn0g503jt522vfo4rfv720 type builtin.io2.ArithmeticFailure - 315. -- #6dtvam7msqc64dimm8p0d8ehdf0330o4qbd2fdafb11jj1c2rg4ke3jdcmbgo6s4pf2jgm0vb76jeavv4ba6ht71t74p963a1miekag + 318. -- #6dtvam7msqc64dimm8p0d8ehdf0330o4qbd2fdafb11jj1c2rg4ke3jdcmbgo6s4pf2jgm0vb76jeavv4ba6ht71t74p963a1miekag type builtin.io2.ArrayFailure - 316. -- #dc6n5ebu839ik3b6ohmnqm6p0cifn7o94em1g41mjp4ae0gmv3b4rupba499lbasfrp4bqce9u4hd6518unlbg8vk993c0q6rigos98 + 319. -- #dc6n5ebu839ik3b6ohmnqm6p0cifn7o94em1g41mjp4ae0gmv3b4rupba499lbasfrp4bqce9u4hd6518unlbg8vk993c0q6rigos98 type builtin.io2.BufferMode - 317. -- #dc6n5ebu839ik3b6ohmnqm6p0cifn7o94em1g41mjp4ae0gmv3b4rupba499lbasfrp4bqce9u4hd6518unlbg8vk993c0q6rigos98#2 + 320. -- #dc6n5ebu839ik3b6ohmnqm6p0cifn7o94em1g41mjp4ae0gmv3b4rupba499lbasfrp4bqce9u4hd6518unlbg8vk993c0q6rigos98#2 builtin.io2.BufferMode.BlockBuffering : BufferMode - 318. -- #dc6n5ebu839ik3b6ohmnqm6p0cifn7o94em1g41mjp4ae0gmv3b4rupba499lbasfrp4bqce9u4hd6518unlbg8vk993c0q6rigos98#1 + 321. -- #dc6n5ebu839ik3b6ohmnqm6p0cifn7o94em1g41mjp4ae0gmv3b4rupba499lbasfrp4bqce9u4hd6518unlbg8vk993c0q6rigos98#1 builtin.io2.BufferMode.LineBuffering : BufferMode - 319. -- #dc6n5ebu839ik3b6ohmnqm6p0cifn7o94em1g41mjp4ae0gmv3b4rupba499lbasfrp4bqce9u4hd6518unlbg8vk993c0q6rigos98#0 + 322. -- #dc6n5ebu839ik3b6ohmnqm6p0cifn7o94em1g41mjp4ae0gmv3b4rupba499lbasfrp4bqce9u4hd6518unlbg8vk993c0q6rigos98#0 builtin.io2.BufferMode.NoBuffering : BufferMode - 320. -- #dc6n5ebu839ik3b6ohmnqm6p0cifn7o94em1g41mjp4ae0gmv3b4rupba499lbasfrp4bqce9u4hd6518unlbg8vk993c0q6rigos98#3 + 323. -- #dc6n5ebu839ik3b6ohmnqm6p0cifn7o94em1g41mjp4ae0gmv3b4rupba499lbasfrp4bqce9u4hd6518unlbg8vk993c0q6rigos98#3 builtin.io2.BufferMode.SizedBlockBuffering : Nat -> BufferMode - 321. -- ##Clock.internals.monotonic.v1 + 324. -- ##Clock.internals.monotonic.v1 builtin.io2.Clock.internals.monotonic : '{IO} Either Failure TimeSpec - 322. -- ##Clock.internals.nsec.v1 + 325. -- ##Clock.internals.nsec.v1 builtin.io2.Clock.internals.nsec : TimeSpec -> Nat - 323. -- ##Clock.internals.processCPUTime.v1 + 326. -- ##Clock.internals.processCPUTime.v1 builtin.io2.Clock.internals.processCPUTime : '{IO} Either Failure TimeSpec - 324. -- ##Clock.internals.realtime.v1 + 327. -- ##Clock.internals.realtime.v1 builtin.io2.Clock.internals.realtime : '{IO} Either Failure TimeSpec - 325. -- ##Clock.internals.sec.v1 + 328. -- ##Clock.internals.sec.v1 builtin.io2.Clock.internals.sec : TimeSpec -> Int - 326. -- ##Clock.internals.systemTimeZone.v1 + 329. -- ##Clock.internals.systemTimeZone.v1 builtin.io2.Clock.internals.systemTimeZone : Int ->{IO} (Int, Nat, Text) - 327. -- ##Clock.internals.threadCPUTime.v1 + 330. -- ##Clock.internals.threadCPUTime.v1 builtin.io2.Clock.internals.threadCPUTime : '{IO} Either Failure TimeSpec - 328. -- ##TimeSpec + 331. -- ##TimeSpec builtin type builtin.io2.Clock.internals.TimeSpec - 329. -- #r29dja8j9dmjjp45trccchaata8eo1h6d6haar1eai74pq1jt4m7u3ldhlq79f7phfo57eq4bau39vqotl2h63k7ff1m5sj5o9ajuf8 + 332. -- #r29dja8j9dmjjp45trccchaata8eo1h6d6haar1eai74pq1jt4m7u3ldhlq79f7phfo57eq4bau39vqotl2h63k7ff1m5sj5o9ajuf8 type builtin.io2.Failure - 330. -- #r29dja8j9dmjjp45trccchaata8eo1h6d6haar1eai74pq1jt4m7u3ldhlq79f7phfo57eq4bau39vqotl2h63k7ff1m5sj5o9ajuf8#0 + 333. -- #r29dja8j9dmjjp45trccchaata8eo1h6d6haar1eai74pq1jt4m7u3ldhlq79f7phfo57eq4bau39vqotl2h63k7ff1m5sj5o9ajuf8#0 builtin.io2.Failure.Failure : Type -> Text -> Any -> Failure - 331. -- #jhnlob35huv3rr7jg6aa4gtd8okhprla7gvlq8io429qita8vj7k696n9jvp4b8ct9i2pc1jodb8ap2bipqtgp138epdgfcth7vqvt8 + 334. -- #jhnlob35huv3rr7jg6aa4gtd8okhprla7gvlq8io429qita8vj7k696n9jvp4b8ct9i2pc1jodb8ap2bipqtgp138epdgfcth7vqvt8 type builtin.io2.FileMode - 332. -- #jhnlob35huv3rr7jg6aa4gtd8okhprla7gvlq8io429qita8vj7k696n9jvp4b8ct9i2pc1jodb8ap2bipqtgp138epdgfcth7vqvt8#2 + 335. -- #jhnlob35huv3rr7jg6aa4gtd8okhprla7gvlq8io429qita8vj7k696n9jvp4b8ct9i2pc1jodb8ap2bipqtgp138epdgfcth7vqvt8#2 builtin.io2.FileMode.Append : FileMode - 333. -- #jhnlob35huv3rr7jg6aa4gtd8okhprla7gvlq8io429qita8vj7k696n9jvp4b8ct9i2pc1jodb8ap2bipqtgp138epdgfcth7vqvt8#0 + 336. -- #jhnlob35huv3rr7jg6aa4gtd8okhprla7gvlq8io429qita8vj7k696n9jvp4b8ct9i2pc1jodb8ap2bipqtgp138epdgfcth7vqvt8#0 builtin.io2.FileMode.Read : FileMode - 334. -- #jhnlob35huv3rr7jg6aa4gtd8okhprla7gvlq8io429qita8vj7k696n9jvp4b8ct9i2pc1jodb8ap2bipqtgp138epdgfcth7vqvt8#3 + 337. -- #jhnlob35huv3rr7jg6aa4gtd8okhprla7gvlq8io429qita8vj7k696n9jvp4b8ct9i2pc1jodb8ap2bipqtgp138epdgfcth7vqvt8#3 builtin.io2.FileMode.ReadWrite : FileMode - 335. -- #jhnlob35huv3rr7jg6aa4gtd8okhprla7gvlq8io429qita8vj7k696n9jvp4b8ct9i2pc1jodb8ap2bipqtgp138epdgfcth7vqvt8#1 + 338. -- #jhnlob35huv3rr7jg6aa4gtd8okhprla7gvlq8io429qita8vj7k696n9jvp4b8ct9i2pc1jodb8ap2bipqtgp138epdgfcth7vqvt8#1 builtin.io2.FileMode.Write : FileMode - 336. -- ##Handle + 339. -- ##Handle builtin type builtin.io2.Handle - 337. -- ##IO + 340. -- ##IO builtin type builtin.io2.IO - 338. -- ##IO.array + 341. -- ##IO.array builtin.io2.IO.array : Nat ->{IO} MutableArray {IO} a - 339. -- ##IO.arrayOf + 342. -- ##IO.arrayOf builtin.io2.IO.arrayOf : a -> Nat ->{IO} MutableArray {IO} a - 340. -- ##IO.bytearray + 343. -- ##IO.bytearray builtin.io2.IO.bytearray : Nat ->{IO} MutableByteArray {IO} - 341. -- ##IO.bytearrayOf + 344. -- ##IO.bytearrayOf builtin.io2.IO.bytearrayOf : Nat -> Nat ->{IO} MutableByteArray {IO} - 342. -- ##IO.clientSocket.impl.v3 + 345. -- ##IO.clientSocket.impl.v3 builtin.io2.IO.clientSocket.impl : Text -> Text ->{IO} Either Failure Socket - 343. -- ##IO.closeFile.impl.v3 + 346. -- ##IO.closeFile.impl.v3 builtin.io2.IO.closeFile.impl : Handle ->{IO} Either Failure () - 344. -- ##IO.closeSocket.impl.v3 + 347. -- ##IO.closeSocket.impl.v3 builtin.io2.IO.closeSocket.impl : Socket ->{IO} Either Failure () - 345. -- ##IO.createDirectory.impl.v3 + 348. -- ##IO.createDirectory.impl.v3 builtin.io2.IO.createDirectory.impl : Text ->{IO} Either Failure () - 346. -- ##IO.createTempDirectory.impl.v3 + 349. -- ##IO.createTempDirectory.impl.v3 builtin.io2.IO.createTempDirectory.impl : Text ->{IO} Either Failure Text - 347. -- ##IO.delay.impl.v3 + 350. -- ##IO.delay.impl.v3 builtin.io2.IO.delay.impl : Nat ->{IO} Either Failure () - 348. -- ##IO.directoryContents.impl.v3 + 351. -- ##IO.directoryContents.impl.v3 builtin.io2.IO.directoryContents.impl : Text ->{IO} Either Failure [Text] - 349. -- ##IO.fileExists.impl.v3 + 352. -- ##IO.fileExists.impl.v3 builtin.io2.IO.fileExists.impl : Text ->{IO} Either Failure Boolean - 350. -- ##IO.forkComp.v2 + 353. -- ##IO.forkComp.v2 builtin.io2.IO.forkComp : '{IO} a ->{IO} ThreadId - 351. -- ##IO.getArgs.impl.v1 + 354. -- ##IO.getArgs.impl.v1 builtin.io2.IO.getArgs.impl : '{IO} Either Failure [Text] - 352. -- ##IO.getBuffering.impl.v3 + 355. -- ##IO.getBuffering.impl.v3 builtin.io2.IO.getBuffering.impl : Handle ->{IO} Either Failure BufferMode - 353. -- ##IO.getBytes.impl.v3 + 356. -- ##IO.getBytes.impl.v3 builtin.io2.IO.getBytes.impl : Handle -> Nat ->{IO} Either Failure Bytes - 354. -- ##IO.getChar.impl.v1 + 357. -- ##IO.getChar.impl.v1 builtin.io2.IO.getChar.impl : Handle ->{IO} Either Failure Char - 355. -- ##IO.getCurrentDirectory.impl.v3 + 358. -- ##IO.getCurrentDirectory.impl.v3 builtin.io2.IO.getCurrentDirectory.impl : '{IO} Either Failure Text - 356. -- ##IO.getEcho.impl.v1 + 359. -- ##IO.getEcho.impl.v1 builtin.io2.IO.getEcho.impl : Handle ->{IO} Either Failure Boolean - 357. -- ##IO.getEnv.impl.v1 + 360. -- ##IO.getEnv.impl.v1 builtin.io2.IO.getEnv.impl : Text ->{IO} Either Failure Text - 358. -- ##IO.getFileSize.impl.v3 + 361. -- ##IO.getFileSize.impl.v3 builtin.io2.IO.getFileSize.impl : Text ->{IO} Either Failure Nat - 359. -- ##IO.getFileTimestamp.impl.v3 + 362. -- ##IO.getFileTimestamp.impl.v3 builtin.io2.IO.getFileTimestamp.impl : Text ->{IO} Either Failure Nat - 360. -- ##IO.getLine.impl.v1 + 363. -- ##IO.getLine.impl.v1 builtin.io2.IO.getLine.impl : Handle ->{IO} Either Failure Text - 361. -- ##IO.getSomeBytes.impl.v1 + 364. -- ##IO.getSomeBytes.impl.v1 builtin.io2.IO.getSomeBytes.impl : Handle -> Nat ->{IO} Either Failure Bytes - 362. -- ##IO.getTempDirectory.impl.v3 + 365. -- ##IO.getTempDirectory.impl.v3 builtin.io2.IO.getTempDirectory.impl : '{IO} Either Failure Text - 363. -- ##IO.handlePosition.impl.v3 + 366. -- ##IO.handlePosition.impl.v3 builtin.io2.IO.handlePosition.impl : Handle ->{IO} Either Failure Nat - 364. -- ##IO.isDirectory.impl.v3 + 367. -- ##IO.isDirectory.impl.v3 builtin.io2.IO.isDirectory.impl : Text ->{IO} Either Failure Boolean - 365. -- ##IO.isFileEOF.impl.v3 + 368. -- ##IO.isFileEOF.impl.v3 builtin.io2.IO.isFileEOF.impl : Handle ->{IO} Either Failure Boolean - 366. -- ##IO.isFileOpen.impl.v3 + 369. -- ##IO.isFileOpen.impl.v3 builtin.io2.IO.isFileOpen.impl : Handle ->{IO} Either Failure Boolean - 367. -- ##IO.isSeekable.impl.v3 + 370. -- ##IO.isSeekable.impl.v3 builtin.io2.IO.isSeekable.impl : Handle ->{IO} Either Failure Boolean - 368. -- ##IO.kill.impl.v3 + 371. -- ##IO.kill.impl.v3 builtin.io2.IO.kill.impl : ThreadId ->{IO} Either Failure () - 369. -- ##IO.listen.impl.v3 + 372. -- ##IO.listen.impl.v3 builtin.io2.IO.listen.impl : Socket ->{IO} Either Failure () - 370. -- ##IO.openFile.impl.v3 + 373. -- ##IO.openFile.impl.v3 builtin.io2.IO.openFile.impl : Text -> FileMode ->{IO} Either Failure Handle - 371. -- ##IO.process.call + 374. -- ##IO.process.call builtin.io2.IO.process.call : Text -> [Text] ->{IO} Nat - 372. -- ##IO.process.exitCode + 375. -- ##IO.process.exitCode builtin.io2.IO.process.exitCode : ProcessHandle ->{IO} Optional Nat - 373. -- ##IO.process.kill + 376. -- ##IO.process.kill builtin.io2.IO.process.kill : ProcessHandle ->{IO} () - 374. -- ##IO.process.start + 377. -- ##IO.process.start builtin.io2.IO.process.start : Text -> [Text] ->{IO} (Handle, Handle, Handle, ProcessHandle) - 375. -- ##IO.process.wait + 378. -- ##IO.process.wait builtin.io2.IO.process.wait : ProcessHandle ->{IO} Nat - 376. -- ##IO.putBytes.impl.v3 + 379. -- ##IO.putBytes.impl.v3 builtin.io2.IO.putBytes.impl : Handle -> Bytes ->{IO} Either Failure () - 377. -- ##IO.randomBytes + 380. -- ##IO.randomBytes builtin.io2.IO.randomBytes : Nat ->{IO} Bytes - 378. -- ##IO.ready.impl.v1 + 381. -- ##IO.ready.impl.v1 builtin.io2.IO.ready.impl : Handle ->{IO} Either Failure Boolean - 379. -- ##IO.ref + 382. -- ##IO.ref builtin.io2.IO.ref : a ->{IO} Ref {IO} a - 380. -- ##IO.removeDirectory.impl.v3 + 383. -- ##IO.removeDirectory.impl.v3 builtin.io2.IO.removeDirectory.impl : Text ->{IO} Either Failure () - 381. -- ##IO.removeFile.impl.v3 + 384. -- ##IO.removeFile.impl.v3 builtin.io2.IO.removeFile.impl : Text ->{IO} Either Failure () - 382. -- ##IO.renameDirectory.impl.v3 + 385. -- ##IO.renameDirectory.impl.v3 builtin.io2.IO.renameDirectory.impl : Text -> Text ->{IO} Either Failure () - 383. -- ##IO.renameFile.impl.v3 + 386. -- ##IO.renameFile.impl.v3 builtin.io2.IO.renameFile.impl : Text -> Text ->{IO} Either Failure () - 384. -- ##IO.seekHandle.impl.v3 + 387. -- ##IO.seekHandle.impl.v3 builtin.io2.IO.seekHandle.impl : Handle -> SeekMode -> Int ->{IO} Either Failure () - 385. -- ##IO.serverSocket.impl.v3 + 388. -- ##IO.serverSocket.impl.v3 builtin.io2.IO.serverSocket.impl : Optional Text -> Text ->{IO} Either Failure Socket - 386. -- ##IO.setBuffering.impl.v3 + 389. -- ##IO.setBuffering.impl.v3 builtin.io2.IO.setBuffering.impl : Handle -> BufferMode ->{IO} Either Failure () - 387. -- ##IO.setCurrentDirectory.impl.v3 + 390. -- ##IO.setCurrentDirectory.impl.v3 builtin.io2.IO.setCurrentDirectory.impl : Text ->{IO} Either Failure () - 388. -- ##IO.setEcho.impl.v1 + 391. -- ##IO.setEcho.impl.v1 builtin.io2.IO.setEcho.impl : Handle -> Boolean ->{IO} Either Failure () - 389. -- ##IO.socketAccept.impl.v3 + 392. -- ##IO.socketAccept.impl.v3 builtin.io2.IO.socketAccept.impl : Socket ->{IO} Either Failure Socket - 390. -- ##IO.socketPort.impl.v3 + 393. -- ##IO.socketPort.impl.v3 builtin.io2.IO.socketPort.impl : Socket ->{IO} Either Failure Nat - 391. -- ##IO.socketReceive.impl.v3 + 394. -- ##IO.socketReceive.impl.v3 builtin.io2.IO.socketReceive.impl : Socket -> Nat ->{IO} Either Failure Bytes - 392. -- ##IO.socketSend.impl.v3 + 395. -- ##IO.socketSend.impl.v3 builtin.io2.IO.socketSend.impl : Socket -> Bytes ->{IO} Either Failure () - 393. -- ##IO.stdHandle + 396. -- ##IO.stdHandle builtin.io2.IO.stdHandle : StdHandle -> Handle - 394. -- ##IO.systemTime.impl.v3 + 397. -- ##IO.systemTime.impl.v3 builtin.io2.IO.systemTime.impl : '{IO} Either Failure Nat - 395. -- ##IO.systemTimeMicroseconds.v1 + 398. -- ##IO.systemTimeMicroseconds.v1 builtin.io2.IO.systemTimeMicroseconds : '{IO} Int - 396. -- ##IO.tryEval + 399. -- ##IO.tryEval builtin.io2.IO.tryEval : '{IO} a ->{IO, Exception} a - 397. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0 + 400. -- ##IO.UDP.ClientSockAddr.toText.v1 + builtin.io2.IO.UDP.ClientSockAddr.toText : ClientSockAddr + -> Text + + 401. -- ##IO.UDP.clientSocket.impl.v1 + builtin.io2.IO.UDP.clientSocket.impl : Text + -> Text + ->{IO} Either Failure UDPSocket + + 402. -- ##IO.UDP.ListenSocket.close.impl.v1 + builtin.io2.IO.UDP.ListenSocket.close.impl : ListenSocket + ->{IO} Either Failure () + + 403. -- ##IO.UDP.ListenSocket.recvFrom.impl.v1 + builtin.io2.IO.UDP.ListenSocket.recvFrom.impl : ListenSocket + ->{IO} Either Failure (Bytes, ClientSockAddr) + + 404. -- ##IO.UDP.ListenSocket.sendTo.impl.v1 + builtin.io2.IO.UDP.ListenSocket.sendTo.impl : ListenSocket + -> Bytes + -> ClientSockAddr + ->{IO} Either Failure () + + 405. -- ##IO.UDP.ListenSocket.toText.impl.v1 + builtin.io2.IO.UDP.ListenSocket.toText.impl : ListenSocket + -> Text + + 406. -- ##IO.UDP.serverSocket.impl.v1 + builtin.io2.IO.UDP.serverSocket.impl : Text + -> Text + ->{IO} Either Failure ListenSocket + + 407. -- ##IO.UDP.UDPSocket.close.impl.v1 + builtin.io2.IO.UDP.UDPSocket.close.impl : UDPSocket + ->{IO} Either Failure () + + 408. -- ##IO.UDP.UDPSocket.recv.impl.v1 + builtin.io2.IO.UDP.UDPSocket.recv.impl : UDPSocket + ->{IO} Either Failure Bytes + + 409. -- ##IO.UDP.UDPSocket.send.impl.v1 + builtin.io2.IO.UDP.UDPSocket.send.impl : UDPSocket + -> Bytes + ->{IO} Either Failure () + + 410. -- ##IO.UDP.UDPSocket.toText.impl.v1 + builtin.io2.IO.UDP.UDPSocket.toText.impl : UDPSocket + -> Text + + 411. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0 type builtin.io2.IOError - 398. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0#0 + 412. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0#0 builtin.io2.IOError.AlreadyExists : IOError - 399. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0#4 + 413. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0#4 builtin.io2.IOError.EOF : IOError - 400. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0#5 + 414. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0#5 builtin.io2.IOError.IllegalOperation : IOError - 401. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0#1 + 415. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0#1 builtin.io2.IOError.NoSuchThing : IOError - 402. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0#6 + 416. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0#6 builtin.io2.IOError.PermissionDenied : IOError - 403. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0#2 + 417. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0#2 builtin.io2.IOError.ResourceBusy : IOError - 404. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0#3 + 418. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0#3 builtin.io2.IOError.ResourceExhausted : IOError - 405. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0#7 + 419. -- #h4smnou0l3fg4dn92g2r88j0imfvufjerkgbuscvvmaprv12l22nk6sff3c12edlikb2vfg3vfdj4b23a09q4lvtk75ckbe4lsmtuc0#7 builtin.io2.IOError.UserError : IOError - 406. -- #6ivk1e38hh0l9gcl8fn4mhf8bmak3qaji36vevg5e1n16ju5i4cl9u5gmqi7u16b907rd98gd60pouma892efbqt2ri58tmu99hp77g + 420. -- #6ivk1e38hh0l9gcl8fn4mhf8bmak3qaji36vevg5e1n16ju5i4cl9u5gmqi7u16b907rd98gd60pouma892efbqt2ri58tmu99hp77g type builtin.io2.IOFailure - 407. -- #574pvphqahl981k517dtrqtq812m05h3hj6t2bt9sn3pknenfik1krscfdb6r66nf1sm7g3r1r56k0c6ob7vg4opfq4gihi8njbnhsg + 421. -- #574pvphqahl981k517dtrqtq812m05h3hj6t2bt9sn3pknenfik1krscfdb6r66nf1sm7g3r1r56k0c6ob7vg4opfq4gihi8njbnhsg type builtin.io2.MiscFailure - 408. -- ##MVar + 422. -- ##MVar builtin type builtin.io2.MVar - 409. -- ##MVar.isEmpty + 423. -- ##MVar.isEmpty builtin.io2.MVar.isEmpty : MVar a ->{IO} Boolean - 410. -- ##MVar.new + 424. -- ##MVar.new builtin.io2.MVar.new : a ->{IO} MVar a - 411. -- ##MVar.newEmpty.v2 + 425. -- ##MVar.newEmpty.v2 builtin.io2.MVar.newEmpty : '{IO} MVar a - 412. -- ##MVar.put.impl.v3 + 426. -- ##MVar.put.impl.v3 builtin.io2.MVar.put.impl : MVar a -> a ->{IO} Either Failure () - 413. -- ##MVar.read.impl.v3 + 427. -- ##MVar.read.impl.v3 builtin.io2.MVar.read.impl : MVar a ->{IO} Either Failure a - 414. -- ##MVar.swap.impl.v3 + 428. -- ##MVar.swap.impl.v3 builtin.io2.MVar.swap.impl : MVar a -> a ->{IO} Either Failure a - 415. -- ##MVar.take.impl.v3 + 429. -- ##MVar.take.impl.v3 builtin.io2.MVar.take.impl : MVar a ->{IO} Either Failure a - 416. -- ##MVar.tryPut.impl.v3 + 430. -- ##MVar.tryPut.impl.v3 builtin.io2.MVar.tryPut.impl : MVar a -> a ->{IO} Either Failure Boolean - 417. -- ##MVar.tryRead.impl.v3 + 431. -- ##MVar.tryRead.impl.v3 builtin.io2.MVar.tryRead.impl : MVar a ->{IO} Either Failure (Optional a) - 418. -- ##MVar.tryTake + 432. -- ##MVar.tryTake builtin.io2.MVar.tryTake : MVar a ->{IO} Optional a - 419. -- ##ProcessHandle + 433. -- ##ProcessHandle builtin type builtin.io2.ProcessHandle - 420. -- ##Promise + 434. -- ##Promise builtin type builtin.io2.Promise - 421. -- ##Promise.new + 435. -- ##Promise.new builtin.io2.Promise.new : '{IO} Promise a - 422. -- ##Promise.read + 436. -- ##Promise.read builtin.io2.Promise.read : Promise a ->{IO} a - 423. -- ##Promise.tryRead + 437. -- ##Promise.tryRead builtin.io2.Promise.tryRead : Promise a ->{IO} Optional a - 424. -- ##Promise.write + 438. -- ##Promise.write builtin.io2.Promise.write : Promise a -> a ->{IO} Boolean - 425. -- ##Ref.cas + 439. -- ##Ref.cas builtin.io2.Ref.cas : Ref {IO} a -> Ticket a -> a ->{IO} Boolean - 426. -- ##Ref.readForCas + 440. -- ##Ref.readForCas builtin.io2.Ref.readForCas : Ref {IO} a ->{IO} Ticket a - 427. -- ##Ref.Ticket + 441. -- ##Ref.Ticket builtin type builtin.io2.Ref.Ticket - 428. -- ##Ref.Ticket.read + 442. -- ##Ref.Ticket.read builtin.io2.Ref.Ticket.read : Ticket a -> a - 429. -- #vph2eas3lf2gi259f3khlrspml3id2l8u0ru07kb5fd833h238jk4iauju0b6decth9i3nao5jkf5eej1e1kovgmu5tghhh8jq3i7p8 + 443. -- #vph2eas3lf2gi259f3khlrspml3id2l8u0ru07kb5fd833h238jk4iauju0b6decth9i3nao5jkf5eej1e1kovgmu5tghhh8jq3i7p8 type builtin.io2.RuntimeFailure - 430. -- ##sandboxLinks + 444. -- ##sandboxLinks builtin.io2.sandboxLinks : Link.Term ->{IO} [Link.Term] - 431. -- #1bca3hq98sfgr6a4onuon1tsda69cdjggq8pkmlsfola6492dbrih5up6dv18ptfbqeocm9q6parf64pj773p7p19qe76238o4trc40 + 445. -- #1bca3hq98sfgr6a4onuon1tsda69cdjggq8pkmlsfola6492dbrih5up6dv18ptfbqeocm9q6parf64pj773p7p19qe76238o4trc40 type builtin.io2.SeekMode - 432. -- #1bca3hq98sfgr6a4onuon1tsda69cdjggq8pkmlsfola6492dbrih5up6dv18ptfbqeocm9q6parf64pj773p7p19qe76238o4trc40#0 + 446. -- #1bca3hq98sfgr6a4onuon1tsda69cdjggq8pkmlsfola6492dbrih5up6dv18ptfbqeocm9q6parf64pj773p7p19qe76238o4trc40#0 builtin.io2.SeekMode.AbsoluteSeek : SeekMode - 433. -- #1bca3hq98sfgr6a4onuon1tsda69cdjggq8pkmlsfola6492dbrih5up6dv18ptfbqeocm9q6parf64pj773p7p19qe76238o4trc40#1 + 447. -- #1bca3hq98sfgr6a4onuon1tsda69cdjggq8pkmlsfola6492dbrih5up6dv18ptfbqeocm9q6parf64pj773p7p19qe76238o4trc40#1 builtin.io2.SeekMode.RelativeSeek : SeekMode - 434. -- #1bca3hq98sfgr6a4onuon1tsda69cdjggq8pkmlsfola6492dbrih5up6dv18ptfbqeocm9q6parf64pj773p7p19qe76238o4trc40#2 + 448. -- #1bca3hq98sfgr6a4onuon1tsda69cdjggq8pkmlsfola6492dbrih5up6dv18ptfbqeocm9q6parf64pj773p7p19qe76238o4trc40#2 builtin.io2.SeekMode.SeekFromEnd : SeekMode - 435. -- ##Socket + 449. -- ##Socket builtin type builtin.io2.Socket - 436. -- #121tku5rfh21t247v1cakhd6ir44fakkqsm799rrfp5qcjdls4nvdu4r3nco80stdd86tdo2hhh0ulcpoaofnrnkjun04kqnfmjqio8 + 450. -- #121tku5rfh21t247v1cakhd6ir44fakkqsm799rrfp5qcjdls4nvdu4r3nco80stdd86tdo2hhh0ulcpoaofnrnkjun04kqnfmjqio8 type builtin.io2.StdHandle - 437. -- #121tku5rfh21t247v1cakhd6ir44fakkqsm799rrfp5qcjdls4nvdu4r3nco80stdd86tdo2hhh0ulcpoaofnrnkjun04kqnfmjqio8#2 + 451. -- #121tku5rfh21t247v1cakhd6ir44fakkqsm799rrfp5qcjdls4nvdu4r3nco80stdd86tdo2hhh0ulcpoaofnrnkjun04kqnfmjqio8#2 builtin.io2.StdHandle.StdErr : StdHandle - 438. -- #121tku5rfh21t247v1cakhd6ir44fakkqsm799rrfp5qcjdls4nvdu4r3nco80stdd86tdo2hhh0ulcpoaofnrnkjun04kqnfmjqio8#0 + 452. -- #121tku5rfh21t247v1cakhd6ir44fakkqsm799rrfp5qcjdls4nvdu4r3nco80stdd86tdo2hhh0ulcpoaofnrnkjun04kqnfmjqio8#0 builtin.io2.StdHandle.StdIn : StdHandle - 439. -- #121tku5rfh21t247v1cakhd6ir44fakkqsm799rrfp5qcjdls4nvdu4r3nco80stdd86tdo2hhh0ulcpoaofnrnkjun04kqnfmjqio8#1 + 453. -- #121tku5rfh21t247v1cakhd6ir44fakkqsm799rrfp5qcjdls4nvdu4r3nco80stdd86tdo2hhh0ulcpoaofnrnkjun04kqnfmjqio8#1 builtin.io2.StdHandle.StdOut : StdHandle - 440. -- ##STM + 454. -- ##STM builtin type builtin.io2.STM - 441. -- ##STM.atomically + 455. -- ##STM.atomically builtin.io2.STM.atomically : '{STM} a ->{IO} a - 442. -- ##STM.retry + 456. -- ##STM.retry builtin.io2.STM.retry : '{STM} a - 443. -- #cggbdfff21ac5uedf4qvn4to83clinvhsovrila35u7f7e73g4l6hoj8pjmjnk713a8luhnn4bi1j9ai1nl0can1un66hvg230eog9g + 457. -- #cggbdfff21ac5uedf4qvn4to83clinvhsovrila35u7f7e73g4l6hoj8pjmjnk713a8luhnn4bi1j9ai1nl0can1un66hvg230eog9g type builtin.io2.STMFailure - 444. -- ##ThreadId + 458. -- ##ThreadId builtin type builtin.io2.ThreadId - 445. -- #ggh649864d9bfnk90n7kgtj7dflddc4kn8osu7u7mub8p7l8biid8dgtungj4u005h7karbgupfpum9jp94spks3ma1sgh39bhirv38 + 459. -- #ggh649864d9bfnk90n7kgtj7dflddc4kn8osu7u7mub8p7l8biid8dgtungj4u005h7karbgupfpum9jp94spks3ma1sgh39bhirv38 type builtin.io2.ThreadKilledFailure - 446. -- ##Tls + 460. -- ##Tls builtin type builtin.io2.Tls - 447. -- ##Tls.Cipher + 461. -- ##Tls.Cipher builtin type builtin.io2.Tls.Cipher - 448. -- ##Tls.ClientConfig + 462. -- ##Tls.ClientConfig builtin type builtin.io2.Tls.ClientConfig - 449. -- ##Tls.ClientConfig.certificates.set + 463. -- ##Tls.ClientConfig.certificates.set builtin.io2.Tls.ClientConfig.certificates.set : [SignedCert] -> ClientConfig -> ClientConfig - 450. -- ##TLS.ClientConfig.ciphers.set + 464. -- ##TLS.ClientConfig.ciphers.set builtin.io2.TLS.ClientConfig.ciphers.set : [Cipher] -> ClientConfig -> ClientConfig - 451. -- ##Tls.ClientConfig.default + 465. -- ##Tls.ClientConfig.default builtin.io2.Tls.ClientConfig.default : Text -> Bytes -> ClientConfig - 452. -- ##Tls.ClientConfig.versions.set + 466. -- ##Tls.ClientConfig.versions.set builtin.io2.Tls.ClientConfig.versions.set : [Version] -> ClientConfig -> ClientConfig - 453. -- ##Tls.decodeCert.impl.v3 + 467. -- ##Tls.decodeCert.impl.v3 builtin.io2.Tls.decodeCert.impl : Bytes -> Either Failure SignedCert - 454. -- ##Tls.decodePrivateKey + 468. -- ##Tls.decodePrivateKey builtin.io2.Tls.decodePrivateKey : Bytes -> [PrivateKey] - 455. -- ##Tls.encodeCert + 469. -- ##Tls.encodeCert builtin.io2.Tls.encodeCert : SignedCert -> Bytes - 456. -- ##Tls.encodePrivateKey + 470. -- ##Tls.encodePrivateKey builtin.io2.Tls.encodePrivateKey : PrivateKey -> Bytes - 457. -- ##Tls.handshake.impl.v3 + 471. -- ##Tls.handshake.impl.v3 builtin.io2.Tls.handshake.impl : Tls ->{IO} Either Failure () - 458. -- ##Tls.newClient.impl.v3 + 472. -- ##Tls.newClient.impl.v3 builtin.io2.Tls.newClient.impl : ClientConfig -> Socket ->{IO} Either Failure Tls - 459. -- ##Tls.newServer.impl.v3 + 473. -- ##Tls.newServer.impl.v3 builtin.io2.Tls.newServer.impl : ServerConfig -> Socket ->{IO} Either Failure Tls - 460. -- ##Tls.PrivateKey + 474. -- ##Tls.PrivateKey builtin type builtin.io2.Tls.PrivateKey - 461. -- ##Tls.receive.impl.v3 + 475. -- ##Tls.receive.impl.v3 builtin.io2.Tls.receive.impl : Tls ->{IO} Either Failure Bytes - 462. -- ##Tls.send.impl.v3 + 476. -- ##Tls.send.impl.v3 builtin.io2.Tls.send.impl : Tls -> Bytes ->{IO} Either Failure () - 463. -- ##Tls.ServerConfig + 477. -- ##Tls.ServerConfig builtin type builtin.io2.Tls.ServerConfig - 464. -- ##Tls.ServerConfig.certificates.set + 478. -- ##Tls.ServerConfig.certificates.set builtin.io2.Tls.ServerConfig.certificates.set : [SignedCert] -> ServerConfig -> ServerConfig - 465. -- ##Tls.ServerConfig.ciphers.set + 479. -- ##Tls.ServerConfig.ciphers.set builtin.io2.Tls.ServerConfig.ciphers.set : [Cipher] -> ServerConfig -> ServerConfig - 466. -- ##Tls.ServerConfig.default + 480. -- ##Tls.ServerConfig.default builtin.io2.Tls.ServerConfig.default : [SignedCert] -> PrivateKey -> ServerConfig - 467. -- ##Tls.ServerConfig.versions.set + 481. -- ##Tls.ServerConfig.versions.set builtin.io2.Tls.ServerConfig.versions.set : [Version] -> ServerConfig -> ServerConfig - 468. -- ##Tls.SignedCert + 482. -- ##Tls.SignedCert builtin type builtin.io2.Tls.SignedCert - 469. -- ##Tls.terminate.impl.v3 + 483. -- ##Tls.terminate.impl.v3 builtin.io2.Tls.terminate.impl : Tls ->{IO} Either Failure () - 470. -- ##Tls.Version + 484. -- ##Tls.Version builtin type builtin.io2.Tls.Version - 471. -- #r3gag1btclr8iclbdt68irgt8n1d1vf7agv5umke3dgdbl11acj6easav6gtihanrjnct18om07638rne9ej06u2bkv2v4l36knm2l0 + 485. -- #r3gag1btclr8iclbdt68irgt8n1d1vf7agv5umke3dgdbl11acj6easav6gtihanrjnct18om07638rne9ej06u2bkv2v4l36knm2l0 type builtin.io2.TlsFailure - 472. -- ##TVar + 486. -- ##TVar builtin type builtin.io2.TVar - 473. -- ##TVar.new + 487. -- ##TVar.new builtin.io2.TVar.new : a ->{STM} TVar a - 474. -- ##TVar.newIO + 488. -- ##TVar.newIO builtin.io2.TVar.newIO : a ->{IO} TVar a - 475. -- ##TVar.read + 489. -- ##TVar.read builtin.io2.TVar.read : TVar a ->{STM} a - 476. -- ##TVar.readIO + 490. -- ##TVar.readIO builtin.io2.TVar.readIO : TVar a ->{IO} a - 477. -- ##TVar.swap + 491. -- ##TVar.swap builtin.io2.TVar.swap : TVar a -> a ->{STM} a - 478. -- ##TVar.write + 492. -- ##TVar.write builtin.io2.TVar.write : TVar a -> a ->{STM} () - 479. -- ##validateSandboxed + 493. -- ##validateSandboxed builtin.io2.validateSandboxed : [Link.Term] -> a -> Boolean - 480. -- ##Value.validateSandboxed + 494. -- ##Value.validateSandboxed builtin.io2.Value.validateSandboxed : [Link.Term] -> Value ->{IO} Either [Link.Term] [Link.Term] - 481. -- #c23jofurcegj93796o0karmkcm6baifupiuu1rtkniu74avn6a4r1n66ga5rml5di7easkgn4iak800u3tnb6kfisbrv6tcfgkb13a8 + 495. -- #c23jofurcegj93796o0karmkcm6baifupiuu1rtkniu74avn6a4r1n66ga5rml5di7easkgn4iak800u3tnb6kfisbrv6tcfgkb13a8 type builtin.IsPropagated - 482. -- #c23jofurcegj93796o0karmkcm6baifupiuu1rtkniu74avn6a4r1n66ga5rml5di7easkgn4iak800u3tnb6kfisbrv6tcfgkb13a8#0 + 496. -- #c23jofurcegj93796o0karmkcm6baifupiuu1rtkniu74avn6a4r1n66ga5rml5di7easkgn4iak800u3tnb6kfisbrv6tcfgkb13a8#0 builtin.IsPropagated.IsPropagated : IsPropagated - 483. -- #q6snodsh7i7u6k7gtqj73tt7nv6htjofs5f37vg2v3dsfk6hau71fs5mcv0hq3lqg111fsvoi92mngm08850aftfgh65uka9mhqvft0 + 497. -- #q6snodsh7i7u6k7gtqj73tt7nv6htjofs5f37vg2v3dsfk6hau71fs5mcv0hq3lqg111fsvoi92mngm08850aftfgh65uka9mhqvft0 type builtin.IsTest - 484. -- #q6snodsh7i7u6k7gtqj73tt7nv6htjofs5f37vg2v3dsfk6hau71fs5mcv0hq3lqg111fsvoi92mngm08850aftfgh65uka9mhqvft0#0 + 498. -- #q6snodsh7i7u6k7gtqj73tt7nv6htjofs5f37vg2v3dsfk6hau71fs5mcv0hq3lqg111fsvoi92mngm08850aftfgh65uka9mhqvft0#0 builtin.IsTest.IsTest : IsTest - 485. -- #68haromionghg6cvojngjrgc7t0ob658nkk8b20fpho6k6ltjtf6rfmr4ia1omige97hk34lu21qsj933vl1dkpbna7evbjfkh71r9g + 499. -- #68haromionghg6cvojngjrgc7t0ob658nkk8b20fpho6k6ltjtf6rfmr4ia1omige97hk34lu21qsj933vl1dkpbna7evbjfkh71r9g type builtin.License - 486. -- #knhl4mlkqf0mt877flahlbas2ufb7bub8f11vi9ihh9uf7r6jqaglk7rm6912q1vml50866ddl0qfa4o6d7o0gomchaoae24m0u2nk8 + 500. -- #knhl4mlkqf0mt877flahlbas2ufb7bub8f11vi9ihh9uf7r6jqaglk7rm6912q1vml50866ddl0qfa4o6d7o0gomchaoae24m0u2nk8 builtin.License.copyrightHolders : License -> [CopyrightHolder] - 487. -- #ucpi54l843bf1osaejl1cnn0jt3o89fak5c0120k8256in3m80ik836hnite0osl12m91utnpnt5n7pgm3oe1rv4r1hk8ai4033agvo + 501. -- #ucpi54l843bf1osaejl1cnn0jt3o89fak5c0120k8256in3m80ik836hnite0osl12m91utnpnt5n7pgm3oe1rv4r1hk8ai4033agvo builtin.License.copyrightHolders.modify : ([CopyrightHolder] ->{g} [CopyrightHolder]) -> License ->{g} License - 488. -- #9hbbfn61d2odn8jvtj5da9n1e9decsrheg6chg73uf94oituv3750b9hd6vp3ljhi54dkp5uqfg57j66i39bstfd8ivgav4p3si39ro + 502. -- #9hbbfn61d2odn8jvtj5da9n1e9decsrheg6chg73uf94oituv3750b9hd6vp3ljhi54dkp5uqfg57j66i39bstfd8ivgav4p3si39ro builtin.License.copyrightHolders.set : [CopyrightHolder] -> License -> License - 489. -- #68haromionghg6cvojngjrgc7t0ob658nkk8b20fpho6k6ltjtf6rfmr4ia1omige97hk34lu21qsj933vl1dkpbna7evbjfkh71r9g#0 + 503. -- #68haromionghg6cvojngjrgc7t0ob658nkk8b20fpho6k6ltjtf6rfmr4ia1omige97hk34lu21qsj933vl1dkpbna7evbjfkh71r9g#0 builtin.License.License : [CopyrightHolder] -> [Year] -> LicenseType -> License - 490. -- #aqi4h1bfq2rjnrrfanf4nut8jd1elkkc00u1tn0rmt9ocsrds8i8pha7q9cihvbiq7edpg21iqnfornimae2gad0ab8ih0bksjnoi4g + 504. -- #aqi4h1bfq2rjnrrfanf4nut8jd1elkkc00u1tn0rmt9ocsrds8i8pha7q9cihvbiq7edpg21iqnfornimae2gad0ab8ih0bksjnoi4g builtin.License.licenseType : License -> LicenseType - 491. -- #1rm8kpbv278t9tqj4jfssl8q3cn4hgu1mti7bp8lhcr5h7qmojujmt9de4c31p42to8mtav61u98oad3oen8q9im20sacs69psjpugo + 505. -- #1rm8kpbv278t9tqj4jfssl8q3cn4hgu1mti7bp8lhcr5h7qmojujmt9de4c31p42to8mtav61u98oad3oen8q9im20sacs69psjpugo builtin.License.licenseType.modify : (LicenseType ->{g} LicenseType) -> License ->{g} License - 492. -- #dv9jsg0ksrlp3g0uftvkutpa8matt039o7dhat9airnkto2b703mgoi5t412hdi95pdhp9g01luga13ihmp52nk6bgh788gts6elv2o + 506. -- #dv9jsg0ksrlp3g0uftvkutpa8matt039o7dhat9airnkto2b703mgoi5t412hdi95pdhp9g01luga13ihmp52nk6bgh788gts6elv2o builtin.License.licenseType.set : LicenseType -> License -> License - 493. -- #fh5qbeba2hg5c5k9uppi71rfghj8df37p4cg3hk23b9pv0hpm67ok807f05t368rn6v99v7kvf7cp984v8ipkjr1j1h095g6nd9jtig + 507. -- #fh5qbeba2hg5c5k9uppi71rfghj8df37p4cg3hk23b9pv0hpm67ok807f05t368rn6v99v7kvf7cp984v8ipkjr1j1h095g6nd9jtig builtin.License.years : License -> [Year] - 494. -- #2samr066hti71pf0fkvb4niemm7j3amvaap3sk1dqpihqp9g8f8lknhhmjq9atai6j5kcs4huvfokvpm15ebefmfggr4hd2cetf7co0 + 508. -- #2samr066hti71pf0fkvb4niemm7j3amvaap3sk1dqpihqp9g8f8lknhhmjq9atai6j5kcs4huvfokvpm15ebefmfggr4hd2cetf7co0 builtin.License.years.modify : ([Year] ->{g} [Year]) -> License ->{g} License - 495. -- #g3ap8lg6974au4meb2hl49k1k6f048det9uckmics3bkt9s571921ksqfdsch63k2pk3fij8pn697svniakkrueddh8nkflnmjk9ffo + 509. -- #g3ap8lg6974au4meb2hl49k1k6f048det9uckmics3bkt9s571921ksqfdsch63k2pk3fij8pn697svniakkrueddh8nkflnmjk9ffo builtin.License.years.set : [Year] -> License -> License - 496. -- #uj652rrb45urfnojgt1ssqoji7iiibu27uhrc1sfl68lm54hbr7r1dpgppsv0pvf0oile2uk2h2gn1h4vgng30fga66idihhen14qc0 + 510. -- #uj652rrb45urfnojgt1ssqoji7iiibu27uhrc1sfl68lm54hbr7r1dpgppsv0pvf0oile2uk2h2gn1h4vgng30fga66idihhen14qc0 type builtin.LicenseType - 497. -- #uj652rrb45urfnojgt1ssqoji7iiibu27uhrc1sfl68lm54hbr7r1dpgppsv0pvf0oile2uk2h2gn1h4vgng30fga66idihhen14qc0#0 + 511. -- #uj652rrb45urfnojgt1ssqoji7iiibu27uhrc1sfl68lm54hbr7r1dpgppsv0pvf0oile2uk2h2gn1h4vgng30fga66idihhen14qc0#0 builtin.LicenseType.LicenseType : Doc -> LicenseType - 498. -- #f4b37niu61dc517c32h3os36ig34fgnt7inaaoqdbecmscchthi14gdo0vj3eee1ru746ibvl9vnmm1pglrv3125qnhsbc0i1tqtic0 + 512. -- #f4b37niu61dc517c32h3os36ig34fgnt7inaaoqdbecmscchthi14gdo0vj3eee1ru746ibvl9vnmm1pglrv3125qnhsbc0i1tqtic0 type builtin.Link - 499. -- ##Link.Term + 513. -- ##Link.Term builtin type builtin.Link.Term - 500. -- #f4b37niu61dc517c32h3os36ig34fgnt7inaaoqdbecmscchthi14gdo0vj3eee1ru746ibvl9vnmm1pglrv3125qnhsbc0i1tqtic0#0 + 514. -- #f4b37niu61dc517c32h3os36ig34fgnt7inaaoqdbecmscchthi14gdo0vj3eee1ru746ibvl9vnmm1pglrv3125qnhsbc0i1tqtic0#0 builtin.Link.Term : Link.Term -> Link - 501. -- ##Link.Term.toText + 515. -- ##Link.Term.toText builtin.Link.Term.toText : Link.Term -> Text - 502. -- ##Link.Type + 516. -- ##Link.Type builtin type builtin.Link.Type - 503. -- #f4b37niu61dc517c32h3os36ig34fgnt7inaaoqdbecmscchthi14gdo0vj3eee1ru746ibvl9vnmm1pglrv3125qnhsbc0i1tqtic0#1 + 517. -- #f4b37niu61dc517c32h3os36ig34fgnt7inaaoqdbecmscchthi14gdo0vj3eee1ru746ibvl9vnmm1pglrv3125qnhsbc0i1tqtic0#1 builtin.Link.Type : Type -> Link - 504. -- ##Sequence + 518. -- ##Sequence builtin type builtin.List - 505. -- ##List.++ + 519. -- ##List.++ builtin.List.++ : [a] -> [a] -> [a] - 506. -- ##List.cons + 520. -- ##List.cons builtin.List.+:, builtin.List.cons : a -> [a] -> [a] - 507. -- ##List.snoc + 521. -- ##List.snoc builtin.List.:+, builtin.List.snoc : [a] -> a -> [a] - 508. -- ##List.at + 522. -- ##List.at builtin.List.at : Nat -> [a] -> Optional a - 509. -- ##List.cons + 523. -- ##List.cons builtin.List.cons, builtin.List.+: : a -> [a] -> [a] - 510. -- ##List.drop + 524. -- ##List.drop builtin.List.drop : Nat -> [a] -> [a] - 511. -- ##List.empty + 525. -- ##List.empty builtin.List.empty : [a] - 512. -- #6frvp5jfjtt7odi9769i0p5phuuuij1fi1d9l5ncpelh416ab3vceaphhaijh0ct0v9n793j7e4h78687oij6ai97085u63m264gj5o + 526. -- #6frvp5jfjtt7odi9769i0p5phuuuij1fi1d9l5ncpelh416ab3vceaphhaijh0ct0v9n793j7e4h78687oij6ai97085u63m264gj5o builtin.List.map : (a ->{e} b) -> [a] ->{e} [b] - 513. -- ##List.size + 527. -- ##List.size builtin.List.size : [a] -> Nat - 514. -- ##List.snoc + 528. -- ##List.snoc builtin.List.snoc, builtin.List.:+ : [a] -> a -> [a] - 515. -- ##List.take + 529. -- ##List.take builtin.List.take : Nat -> [a] -> [a] - 516. -- #cb9e3iosob3e4q0v96ifmserg27samv1lvi4dh0l0l19phvct4vbbvv19abngneb77b02h8cefr1o3ad8gnm3cn6mjgsub97gjlte8g + 530. -- ##ListenSocket + builtin type builtin.ListenSocket + + 531. -- #cb9e3iosob3e4q0v96ifmserg27samv1lvi4dh0l0l19phvct4vbbvv19abngneb77b02h8cefr1o3ad8gnm3cn6mjgsub97gjlte8g builtin.metadata.isPropagated : IsPropagated - 517. -- #lkpne3jg56pmqegv4jba6b5nnjg86qtfllnlmtvijql5lsf89rfu6tgb1s9ic0gsqs5si0v9agmj90lk0bhihbovd5o5ve023g4ocko + 532. -- #lkpne3jg56pmqegv4jba6b5nnjg86qtfllnlmtvijql5lsf89rfu6tgb1s9ic0gsqs5si0v9agmj90lk0bhihbovd5o5ve023g4ocko builtin.metadata.isTest : IsTest - 518. -- ##MutableArray + 533. -- ##MutableArray builtin type builtin.MutableArray - 519. -- ##MutableArray.copyTo! + 534. -- ##MutableArray.copyTo! builtin.MutableArray.copyTo! : MutableArray g a -> Nat -> MutableArray g a @@ -1816,34 +1882,34 @@ This transcript is intended to make visible accidental changes to the hashing al -> Nat ->{g, Exception} () - 520. -- ##MutableArray.freeze + 535. -- ##MutableArray.freeze builtin.MutableArray.freeze : MutableArray g a -> Nat -> Nat ->{g} ImmutableArray a - 521. -- ##MutableArray.freeze! + 536. -- ##MutableArray.freeze! builtin.MutableArray.freeze! : MutableArray g a ->{g} ImmutableArray a - 522. -- ##MutableArray.read + 537. -- ##MutableArray.read builtin.MutableArray.read : MutableArray g a -> Nat ->{g, Exception} a - 523. -- ##MutableArray.size + 538. -- ##MutableArray.size builtin.MutableArray.size : MutableArray g a -> Nat - 524. -- ##MutableArray.write + 539. -- ##MutableArray.write builtin.MutableArray.write : MutableArray g a -> Nat -> a ->{g, Exception} () - 525. -- ##MutableByteArray + 540. -- ##MutableByteArray builtin type builtin.MutableByteArray - 526. -- ##MutableByteArray.copyTo! + 541. -- ##MutableByteArray.copyTo! builtin.MutableByteArray.copyTo! : MutableByteArray g -> Nat -> MutableByteArray g @@ -1851,732 +1917,735 @@ This transcript is intended to make visible accidental changes to the hashing al -> Nat ->{g, Exception} () - 527. -- ##MutableByteArray.freeze + 542. -- ##MutableByteArray.freeze builtin.MutableByteArray.freeze : MutableByteArray g -> Nat -> Nat ->{g} ImmutableByteArray - 528. -- ##MutableByteArray.freeze! + 543. -- ##MutableByteArray.freeze! builtin.MutableByteArray.freeze! : MutableByteArray g ->{g} ImmutableByteArray - 529. -- ##MutableByteArray.read16be + 544. -- ##MutableByteArray.read16be builtin.MutableByteArray.read16be : MutableByteArray g -> Nat ->{g, Exception} Nat - 530. -- ##MutableByteArray.read24be + 545. -- ##MutableByteArray.read24be builtin.MutableByteArray.read24be : MutableByteArray g -> Nat ->{g, Exception} Nat - 531. -- ##MutableByteArray.read32be + 546. -- ##MutableByteArray.read32be builtin.MutableByteArray.read32be : MutableByteArray g -> Nat ->{g, Exception} Nat - 532. -- ##MutableByteArray.read40be + 547. -- ##MutableByteArray.read40be builtin.MutableByteArray.read40be : MutableByteArray g -> Nat ->{g, Exception} Nat - 533. -- ##MutableByteArray.read64be + 548. -- ##MutableByteArray.read64be builtin.MutableByteArray.read64be : MutableByteArray g -> Nat ->{g, Exception} Nat - 534. -- ##MutableByteArray.read8 + 549. -- ##MutableByteArray.read8 builtin.MutableByteArray.read8 : MutableByteArray g -> Nat ->{g, Exception} Nat - 535. -- ##MutableByteArray.size + 550. -- ##MutableByteArray.size builtin.MutableByteArray.size : MutableByteArray g -> Nat - 536. -- ##MutableByteArray.write16be + 551. -- ##MutableByteArray.write16be builtin.MutableByteArray.write16be : MutableByteArray g -> Nat -> Nat ->{g, Exception} () - 537. -- ##MutableByteArray.write32be + 552. -- ##MutableByteArray.write32be builtin.MutableByteArray.write32be : MutableByteArray g -> Nat -> Nat ->{g, Exception} () - 538. -- ##MutableByteArray.write64be + 553. -- ##MutableByteArray.write64be builtin.MutableByteArray.write64be : MutableByteArray g -> Nat -> Nat ->{g, Exception} () - 539. -- ##MutableByteArray.write8 + 554. -- ##MutableByteArray.write8 builtin.MutableByteArray.write8 : MutableByteArray g -> Nat -> Nat ->{g, Exception} () - 540. -- ##Nat + 555. -- ##Nat builtin type builtin.Nat - 541. -- ##Nat.* + 556. -- ##Nat.* builtin.Nat.* : Nat -> Nat -> Nat - 542. -- ##Nat.+ + 557. -- ##Nat.+ builtin.Nat.+ : Nat -> Nat -> Nat - 543. -- ##Nat./ + 558. -- ##Nat./ builtin.Nat./ : Nat -> Nat -> Nat - 544. -- ##Nat.and + 559. -- ##Nat.and builtin.Nat.and : Nat -> Nat -> Nat - 545. -- ##Nat.complement + 560. -- ##Nat.complement builtin.Nat.complement : Nat -> Nat - 546. -- ##Nat.drop + 561. -- ##Nat.drop builtin.Nat.drop : Nat -> Nat -> Nat - 547. -- ##Nat.== + 562. -- ##Nat.== builtin.Nat.eq : Nat -> Nat -> Boolean - 548. -- ##Nat.fromText + 563. -- ##Nat.fromText builtin.Nat.fromText : Text -> Optional Nat - 549. -- ##Nat.> + 564. -- ##Nat.> builtin.Nat.gt : Nat -> Nat -> Boolean - 550. -- ##Nat.>= + 565. -- ##Nat.>= builtin.Nat.gteq : Nat -> Nat -> Boolean - 551. -- ##Nat.increment + 566. -- ##Nat.increment builtin.Nat.increment : Nat -> Nat - 552. -- ##Nat.isEven + 567. -- ##Nat.isEven builtin.Nat.isEven : Nat -> Boolean - 553. -- ##Nat.isOdd + 568. -- ##Nat.isOdd builtin.Nat.isOdd : Nat -> Boolean - 554. -- ##Nat.leadingZeros + 569. -- ##Nat.leadingZeros builtin.Nat.leadingZeros : Nat -> Nat - 555. -- ##Nat.< + 570. -- ##Nat.< builtin.Nat.lt : Nat -> Nat -> Boolean - 556. -- ##Nat.<= + 571. -- ##Nat.<= builtin.Nat.lteq : Nat -> Nat -> Boolean - 557. -- ##Nat.mod + 572. -- ##Nat.mod builtin.Nat.mod : Nat -> Nat -> Nat - 558. -- ##Nat.or + 573. -- ##Nat.or builtin.Nat.or : Nat -> Nat -> Nat - 559. -- ##Nat.popCount + 574. -- ##Nat.popCount builtin.Nat.popCount : Nat -> Nat - 560. -- ##Nat.pow + 575. -- ##Nat.pow builtin.Nat.pow : Nat -> Nat -> Nat - 561. -- ##Nat.shiftLeft + 576. -- ##Nat.shiftLeft builtin.Nat.shiftLeft : Nat -> Nat -> Nat - 562. -- ##Nat.shiftRight + 577. -- ##Nat.shiftRight builtin.Nat.shiftRight : Nat -> Nat -> Nat - 563. -- ##Nat.sub + 578. -- ##Nat.sub builtin.Nat.sub : Nat -> Nat -> Int - 564. -- ##Nat.toFloat + 579. -- ##Nat.toFloat builtin.Nat.toFloat : Nat -> Float - 565. -- ##Nat.toInt + 580. -- ##Nat.toInt builtin.Nat.toInt : Nat -> Int - 566. -- ##Nat.toText + 581. -- ##Nat.toText builtin.Nat.toText : Nat -> Text - 567. -- ##Nat.trailingZeros + 582. -- ##Nat.trailingZeros builtin.Nat.trailingZeros : Nat -> Nat - 568. -- ##Nat.xor + 583. -- ##Nat.xor builtin.Nat.xor : Nat -> Nat -> Nat - 569. -- #nirp5os0q69o4e1u9p3t6mmq6l6otluefi3ksm7dhm0diidjvkkgl8o9bvnflbj0sanuvdusf34f1qrins3ktcaglpcqv9oums2slsg + 584. -- #nirp5os0q69o4e1u9p3t6mmq6l6otluefi3ksm7dhm0diidjvkkgl8o9bvnflbj0sanuvdusf34f1qrins3ktcaglpcqv9oums2slsg structural type builtin.Optional a - 570. -- #nirp5os0q69o4e1u9p3t6mmq6l6otluefi3ksm7dhm0diidjvkkgl8o9bvnflbj0sanuvdusf34f1qrins3ktcaglpcqv9oums2slsg#1 + 585. -- #nirp5os0q69o4e1u9p3t6mmq6l6otluefi3ksm7dhm0diidjvkkgl8o9bvnflbj0sanuvdusf34f1qrins3ktcaglpcqv9oums2slsg#1 builtin.Optional.None : Optional a - 571. -- #nirp5os0q69o4e1u9p3t6mmq6l6otluefi3ksm7dhm0diidjvkkgl8o9bvnflbj0sanuvdusf34f1qrins3ktcaglpcqv9oums2slsg#0 + 586. -- #nirp5os0q69o4e1u9p3t6mmq6l6otluefi3ksm7dhm0diidjvkkgl8o9bvnflbj0sanuvdusf34f1qrins3ktcaglpcqv9oums2slsg#0 builtin.Optional.Some : a -> Optional a - 572. -- ##Pattern + 587. -- ##Pattern builtin type builtin.Pattern - 573. -- ##Pattern.capture + 588. -- ##Pattern.capture builtin.Pattern.capture : Pattern a -> Pattern a - 574. -- ##Pattern.captureAs + 589. -- ##Pattern.captureAs builtin.Pattern.captureAs : a -> Pattern a -> Pattern a - 575. -- ##Pattern.isMatch + 590. -- ##Pattern.isMatch builtin.Pattern.isMatch : Pattern a -> a -> Boolean - 576. -- ##Pattern.join + 591. -- ##Pattern.join builtin.Pattern.join : [Pattern a] -> Pattern a - 577. -- ##Pattern.many + 592. -- ##Pattern.many builtin.Pattern.many : Pattern a -> Pattern a - 578. -- ##Pattern.many.corrected + 593. -- ##Pattern.many.corrected builtin.Pattern.many.corrected : Pattern a -> Pattern a - 579. -- ##Pattern.or + 594. -- ##Pattern.or builtin.Pattern.or : Pattern a -> Pattern a -> Pattern a - 580. -- ##Pattern.replicate + 595. -- ##Pattern.replicate builtin.Pattern.replicate : Nat -> Nat -> Pattern a -> Pattern a - 581. -- ##Pattern.run + 596. -- ##Pattern.run builtin.Pattern.run : Pattern a -> a -> Optional ([a], a) - 582. -- #cbo8de57n17pgc5iic1741jeiunhvhfcfd7gt79vd6516u64aplasdodqoouejbgovhge2le5jb6rje923fcrllhtu01t29cdrssgbg + 597. -- #cbo8de57n17pgc5iic1741jeiunhvhfcfd7gt79vd6516u64aplasdodqoouejbgovhge2le5jb6rje923fcrllhtu01t29cdrssgbg structural type builtin.Pretty txt - 583. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8 + 598. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8 type builtin.Pretty.Annotated w txt - 584. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8#1 + 599. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8#1 builtin.Pretty.Annotated.Append : w -> [Annotated w txt] -> Annotated w txt - 585. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8#6 + 600. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8#6 builtin.Pretty.Annotated.Empty : Annotated w txt - 586. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8#4 + 601. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8#4 builtin.Pretty.Annotated.Group : w -> Annotated w txt -> Annotated w txt - 587. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8#3 + 602. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8#3 builtin.Pretty.Annotated.Indent : w -> Annotated w txt -> Annotated w txt -> Annotated w txt -> Annotated w txt - 588. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8#7 + 603. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8#7 builtin.Pretty.Annotated.Lit : w -> txt -> Annotated w txt - 589. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8#2 + 604. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8#2 builtin.Pretty.Annotated.OrElse : w -> Annotated w txt -> Annotated w txt -> Annotated w txt - 590. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8#0 + 605. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8#0 builtin.Pretty.Annotated.Table : w -> [[Annotated w txt]] -> Annotated w txt - 591. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8#5 + 606. -- #fqfaur9v9v4fks5d0c74ouitpjp121c3fbu2l9t05km8otjcj43gk453vu668pg54rte6qmh4v3uao6vbfpntrtaq057jgni1jk8fj8#5 builtin.Pretty.Annotated.Wrap : w -> Annotated w txt -> Annotated w txt - 592. -- #loh4epguhqj73ut43b287p1272ko7ackkr544k9scurlsf6m6smpifp5ghdcscvqdofpf79req1pl4e7qni0hvo4m0gsi3f1jhn9nvo + 607. -- #loh4epguhqj73ut43b287p1272ko7ackkr544k9scurlsf6m6smpifp5ghdcscvqdofpf79req1pl4e7qni0hvo4m0gsi3f1jhn9nvo builtin.Pretty.append : Pretty txt -> Pretty txt -> Pretty txt - 593. -- #sonptakf85a3uklev4rq0pub00k56jdpaop4tcd9bmk0gmjjij5t16sf1knspku2hbp0uikiflbo0dtjv1i6r3t2rpjh86vo1rlaer8 + 608. -- #sonptakf85a3uklev4rq0pub00k56jdpaop4tcd9bmk0gmjjij5t16sf1knspku2hbp0uikiflbo0dtjv1i6r3t2rpjh86vo1rlaer8 builtin.Pretty.empty : Pretty txt - 594. -- #mlpplm1bhqkcif5j09204uuvfll7qte95msb0skjfd30nmei005kiich1ao39gm2j8687s14qvf5llu6i1a6fvt4vdmbp99jlfundfo + 609. -- #mlpplm1bhqkcif5j09204uuvfll7qte95msb0skjfd30nmei005kiich1ao39gm2j8687s14qvf5llu6i1a6fvt4vdmbp99jlfundfo builtin.Pretty.get : Pretty txt -> Annotated () txt - 595. -- #303bqopo0ditms2abmf35ikbgbb7gkcmqcd5g5eie85lvvmkpd89mi8v0etgm2508bejlgj9e7ffvpufj3v94mlks3ugvr3sjkbttq0 + 610. -- #303bqopo0ditms2abmf35ikbgbb7gkcmqcd5g5eie85lvvmkpd89mi8v0etgm2508bejlgj9e7ffvpufj3v94mlks3ugvr3sjkbttq0 builtin.Pretty.group : Pretty txt -> Pretty txt - 596. -- #o5dik2fg10998uep20m3du4iqqjbtap0apq4452g9emve8g3m655392u97iunphh90opvg92riaabbjsofc02bhr0qkcousvqgg2a78 + 611. -- #o5dik2fg10998uep20m3du4iqqjbtap0apq4452g9emve8g3m655392u97iunphh90opvg92riaabbjsofc02bhr0qkcousvqgg2a78 builtin.Pretty.indent : Pretty txt -> Pretty txt -> Pretty txt - 597. -- #evbq94p3dn4l8ugge1o2f8dk072gcfho082lm7j02ejjsnctb5inkfsasuplmu8a529jh4v0h6v8ti7koff23e58cceda0nlh98m530 + 612. -- #evbq94p3dn4l8ugge1o2f8dk072gcfho082lm7j02ejjsnctb5inkfsasuplmu8a529jh4v0h6v8ti7koff23e58cceda0nlh98m530 builtin.Pretty.indent' : Pretty txt -> Pretty txt -> Pretty txt -> Pretty txt - 598. -- #u5s76jh01asd7hbqaq466dp48v217o7tclphuk7gepc99vbv0fbfv5j2uq8o3n7lsvpiri5925o02j22a6tq7koc9t8tbcps4naetbg + 613. -- #u5s76jh01asd7hbqaq466dp48v217o7tclphuk7gepc99vbv0fbfv5j2uq8o3n7lsvpiri5925o02j22a6tq7koc9t8tbcps4naetbg builtin.Pretty.join : [Pretty txt] -> Pretty txt - 599. -- #uoti2ppnfp1l11obl8tto1m2h4r6n1i14cc3i45bjpjrhogh52cuoch1n6b1q0n3jf6blr9585stb1i155jjq17b4c2hvd4d3abmrpo + 614. -- #uoti2ppnfp1l11obl8tto1m2h4r6n1i14cc3i45bjpjrhogh52cuoch1n6b1q0n3jf6blr9585stb1i155jjq17b4c2hvd4d3abmrpo builtin.Pretty.lit : txt -> Pretty txt - 600. -- #mabh3q4gsoiao223a03t7voj937b3sefb7e1j5r33su5o5tqrkmenl2aeboq909vs3bh2snltuqrfcsd3liic1vma0f976h1eo63upg + 615. -- #mabh3q4gsoiao223a03t7voj937b3sefb7e1j5r33su5o5tqrkmenl2aeboq909vs3bh2snltuqrfcsd3liic1vma0f976h1eo63upg builtin.Pretty.map : (txt ->{g} txt2) -> Pretty txt ->{g} Pretty txt2 - 601. -- #i260pi6le5cdptpo78mbbi4r6qfc76kvb1g9r9d210b1altjtmoqi8b6psu3ag5hb8gq7crhgei406arn999c1dfrqt67j8vnls4gg8 + 616. -- #i260pi6le5cdptpo78mbbi4r6qfc76kvb1g9r9d210b1altjtmoqi8b6psu3ag5hb8gq7crhgei406arn999c1dfrqt67j8vnls4gg8 builtin.Pretty.orElse : Pretty txt -> Pretty txt -> Pretty txt - 602. -- #cbo8de57n17pgc5iic1741jeiunhvhfcfd7gt79vd6516u64aplasdodqoouejbgovhge2le5jb6rje923fcrllhtu01t29cdrssgbg#0 + 617. -- #cbo8de57n17pgc5iic1741jeiunhvhfcfd7gt79vd6516u64aplasdodqoouejbgovhge2le5jb6rje923fcrllhtu01t29cdrssgbg#0 builtin.Pretty.Pretty : Annotated () txt -> Pretty txt - 603. -- #bvuv0d49kosa6op5j54ln2h3vbs3209e4fjtb3kehvn76p92l8682qnp2r5e9t7sflnv3dfb0uf9p0f76qbobn562oqdusi9mo3ubjo + 618. -- #bvuv0d49kosa6op5j54ln2h3vbs3209e4fjtb3kehvn76p92l8682qnp2r5e9t7sflnv3dfb0uf9p0f76qbobn562oqdusi9mo3ubjo builtin.Pretty.sepBy : Pretty txt -> [Pretty txt] -> Pretty txt - 604. -- #rm3moq6nqvk1rs49lsshdtheqo72qv2fg1fqkk5m8tbqppik498otkrq6ppu7fu9p1kddldmpv0dig7bn82n0tj0ngnbu83fpb11upg + 619. -- #rm3moq6nqvk1rs49lsshdtheqo72qv2fg1fqkk5m8tbqppik498otkrq6ppu7fu9p1kddldmpv0dig7bn82n0tj0ngnbu83fpb11upg builtin.Pretty.table : [[Pretty txt]] -> Pretty txt - 605. -- #n01tnlfatb0lo6s762cfofhtdavui9j8ovljacdbn9bvrfoeimd0pkner0694d3lb1f4qa5gur4975lvopftk7jkrflmhjv6gbsifbo + 620. -- #n01tnlfatb0lo6s762cfofhtdavui9j8ovljacdbn9bvrfoeimd0pkner0694d3lb1f4qa5gur4975lvopftk7jkrflmhjv6gbsifbo builtin.Pretty.wrap : Pretty txt -> Pretty txt - 606. -- ##Ref + 621. -- ##Ref builtin type builtin.Ref - 607. -- ##Ref.read + 622. -- ##Ref.read builtin.Ref.read : Ref g a ->{g} a - 608. -- ##Ref.write + 623. -- ##Ref.write builtin.Ref.write : Ref g a -> a ->{g} () - 609. -- ##Effect + 624. -- ##Effect builtin type builtin.Request - 610. -- #bga77hj5p43epjosu36iero5ulpm7hqrct1slj5ivdcajsr52ksjam8d5smq2965netv9t43o3g0amgva26qoatt4qth29khkuds2t0 + 625. -- #bga77hj5p43epjosu36iero5ulpm7hqrct1slj5ivdcajsr52ksjam8d5smq2965netv9t43o3g0amgva26qoatt4qth29khkuds2t0 type builtin.RewriteCase a b - 611. -- #bga77hj5p43epjosu36iero5ulpm7hqrct1slj5ivdcajsr52ksjam8d5smq2965netv9t43o3g0amgva26qoatt4qth29khkuds2t0#0 + 626. -- #bga77hj5p43epjosu36iero5ulpm7hqrct1slj5ivdcajsr52ksjam8d5smq2965netv9t43o3g0amgva26qoatt4qth29khkuds2t0#0 builtin.RewriteCase.RewriteCase : a -> b -> RewriteCase a b - 612. -- #qcot4bpj2skgnui8hoignn6fl2gnn2nfrur451ft2egd5n1ndu6ti4uu7r1mvtc8r4p7iielfijk2mb7md9tt2m2rdvaikah4oluf7o + 627. -- #qcot4bpj2skgnui8hoignn6fl2gnn2nfrur451ft2egd5n1ndu6ti4uu7r1mvtc8r4p7iielfijk2mb7md9tt2m2rdvaikah4oluf7o type builtin.Rewrites a - 613. -- #qcot4bpj2skgnui8hoignn6fl2gnn2nfrur451ft2egd5n1ndu6ti4uu7r1mvtc8r4p7iielfijk2mb7md9tt2m2rdvaikah4oluf7o#0 + 628. -- #qcot4bpj2skgnui8hoignn6fl2gnn2nfrur451ft2egd5n1ndu6ti4uu7r1mvtc8r4p7iielfijk2mb7md9tt2m2rdvaikah4oluf7o#0 builtin.Rewrites.Rewrites : a -> Rewrites a - 614. -- #nu6eab37fl81lb5hfcainu83hph0ksqjsjgjbqvc3t8o13djtt5511qfa6tuggc5c3re06c5p6eto5o2cqme0jdlo31nnd13npqigjo + 629. -- #nu6eab37fl81lb5hfcainu83hph0ksqjsjgjbqvc3t8o13djtt5511qfa6tuggc5c3re06c5p6eto5o2cqme0jdlo31nnd13npqigjo type builtin.RewriteSignature a b - 615. -- #nu6eab37fl81lb5hfcainu83hph0ksqjsjgjbqvc3t8o13djtt5511qfa6tuggc5c3re06c5p6eto5o2cqme0jdlo31nnd13npqigjo#0 + 630. -- #nu6eab37fl81lb5hfcainu83hph0ksqjsjgjbqvc3t8o13djtt5511qfa6tuggc5c3re06c5p6eto5o2cqme0jdlo31nnd13npqigjo#0 builtin.RewriteSignature.RewriteSignature : (a -> b -> ()) -> RewriteSignature a b - 616. -- #bvffhraos4oatd3qmedt676dqul9c1oj8r4cqns36lsrue84kl0ote15iqbbmgu8joek3gce1h2raqas5b9nnvs2d79l9mrpmmi2sf0 + 631. -- #bvffhraos4oatd3qmedt676dqul9c1oj8r4cqns36lsrue84kl0ote15iqbbmgu8joek3gce1h2raqas5b9nnvs2d79l9mrpmmi2sf0 type builtin.RewriteTerm a b - 617. -- #bvffhraos4oatd3qmedt676dqul9c1oj8r4cqns36lsrue84kl0ote15iqbbmgu8joek3gce1h2raqas5b9nnvs2d79l9mrpmmi2sf0#0 + 632. -- #bvffhraos4oatd3qmedt676dqul9c1oj8r4cqns36lsrue84kl0ote15iqbbmgu8joek3gce1h2raqas5b9nnvs2d79l9mrpmmi2sf0#0 builtin.RewriteTerm.RewriteTerm : a -> b -> RewriteTerm a b - 618. -- ##Scope + 633. -- ##Scope builtin type builtin.Scope - 619. -- ##Scope.array + 634. -- ##Scope.array builtin.Scope.array : Nat ->{Scope s} MutableArray (Scope s) a - 620. -- ##Scope.arrayOf + 635. -- ##Scope.arrayOf builtin.Scope.arrayOf : a -> Nat ->{Scope s} MutableArray (Scope s) a - 621. -- ##Scope.bytearray + 636. -- ##Scope.bytearray builtin.Scope.bytearray : Nat ->{Scope s} MutableByteArray (Scope s) - 622. -- ##Scope.bytearrayOf + 637. -- ##Scope.bytearrayOf builtin.Scope.bytearrayOf : Nat -> Nat ->{Scope s} MutableByteArray (Scope s) - 623. -- ##Scope.ref + 638. -- ##Scope.ref builtin.Scope.ref : a ->{Scope s} Ref {Scope s} a - 624. -- ##Scope.run + 639. -- ##Scope.run builtin.Scope.run : (∀ s. '{g, Scope s} r) ->{g} r - 625. -- #6uigas14aqgd889s036hq9ssrlo22pju41009m0rktetcrbm97qniljjc1rv1u661r4f63oq6pupoevghs8a2hupvlbi6qi4ntn9320 + 640. -- #6uigas14aqgd889s036hq9ssrlo22pju41009m0rktetcrbm97qniljjc1rv1u661r4f63oq6pupoevghs8a2hupvlbi6qi4ntn9320 structural type builtin.SeqView a b - 626. -- #6uigas14aqgd889s036hq9ssrlo22pju41009m0rktetcrbm97qniljjc1rv1u661r4f63oq6pupoevghs8a2hupvlbi6qi4ntn9320#0 + 641. -- #6uigas14aqgd889s036hq9ssrlo22pju41009m0rktetcrbm97qniljjc1rv1u661r4f63oq6pupoevghs8a2hupvlbi6qi4ntn9320#0 builtin.SeqView.VElem : a -> b -> SeqView a b - 627. -- #6uigas14aqgd889s036hq9ssrlo22pju41009m0rktetcrbm97qniljjc1rv1u661r4f63oq6pupoevghs8a2hupvlbi6qi4ntn9320#1 + 642. -- #6uigas14aqgd889s036hq9ssrlo22pju41009m0rktetcrbm97qniljjc1rv1u661r4f63oq6pupoevghs8a2hupvlbi6qi4ntn9320#1 builtin.SeqView.VEmpty : SeqView a b - 628. -- ##Socket.toText + 643. -- ##Socket.toText builtin.Socket.toText : Socket -> Text - 629. -- #pfp0ajb4v2mb9tspp29v53dkacb76aa1t5kbk1dl0q354cjcg4egdpmvtr5d6t818ucon9eubf6r1vdvh926fgk8otvbkvbpn90levo + 644. -- #pfp0ajb4v2mb9tspp29v53dkacb76aa1t5kbk1dl0q354cjcg4egdpmvtr5d6t818ucon9eubf6r1vdvh926fgk8otvbkvbpn90levo builtin.syntax.docAside : Doc2 -> Doc2 - 630. -- #mvov9qf78ctohefjbmrgs8ussspo5juhf75pee4ikkg8asuos72unn4pjn3fdel8471soj2vaskd5ls103pb6nb8qf75sjn4igs7v48 + 645. -- #mvov9qf78ctohefjbmrgs8ussspo5juhf75pee4ikkg8asuos72unn4pjn3fdel8471soj2vaskd5ls103pb6nb8qf75sjn4igs7v48 builtin.syntax.docBlockquote : Doc2 -> Doc2 - 631. -- #cg64hg7dag89u80104kit2p40rhmo1k6h1j8obfhjolpogs705bt6hc92ct6rfj8h74m3ioug14u9pm1s7qqpmjda2srjojhi01nvf0 + 646. -- #cg64hg7dag89u80104kit2p40rhmo1k6h1j8obfhjolpogs705bt6hc92ct6rfj8h74m3ioug14u9pm1s7qqpmjda2srjojhi01nvf0 builtin.syntax.docBold : Doc2 -> Doc2 - 632. -- #3qd5kt9gjiggrb871al82n11jccedl3kb5p8ffemr703frn38tqajkett30fg7hef5orh7vl0obp3lap9qq2po3ufcnu4k3bik81rlg + 647. -- #3qd5kt9gjiggrb871al82n11jccedl3kb5p8ffemr703frn38tqajkett30fg7hef5orh7vl0obp3lap9qq2po3ufcnu4k3bik81rlg builtin.syntax.docBulletedList : [Doc2] -> Doc2 - 633. -- #el0rph43k5qg25qg20o5jdjukuful041r87v92tcb2339om0hp9u6vqtrcrfkvgj78hrpo2o1l39bbg1oier87pvgkli0lkgalgpo90 + 648. -- #el0rph43k5qg25qg20o5jdjukuful041r87v92tcb2339om0hp9u6vqtrcrfkvgj78hrpo2o1l39bbg1oier87pvgkli0lkgalgpo90 builtin.syntax.docCallout : Optional Doc2 -> Doc2 -> Doc2 - 634. -- #7jij106qpusbsbpqhmtgrk59qo8ss9e77rtrc1h9hbpnbab8sq717fe6hppmhhds9smqbv3k2q0irjgoe4mogatlp9e4k25kopt6rgo + 649. -- #7jij106qpusbsbpqhmtgrk59qo8ss9e77rtrc1h9hbpnbab8sq717fe6hppmhhds9smqbv3k2q0irjgoe4mogatlp9e4k25kopt6rgo builtin.syntax.docCode : Doc2 -> Doc2 - 635. -- #3paq4qqrk028tati33723c4aqi7ebgnjln12avbnf7eu8h8sflg0frlehb4lni4ru0pcfg9ftsurq3pb2q11cfebeki51vom697l7h0 + 650. -- #3paq4qqrk028tati33723c4aqi7ebgnjln12avbnf7eu8h8sflg0frlehb4lni4ru0pcfg9ftsurq3pb2q11cfebeki51vom697l7h0 builtin.syntax.docCodeBlock : Text -> Text -> Doc2 - 636. -- #1of955s8tqa74vu0ve863p8dn2mncc2anmms54aj084pkbdcpml6ckvs0qb4defi0df3b1e8inp29p60ac93hf2u7to0je4op9fum40 + 651. -- #1of955s8tqa74vu0ve863p8dn2mncc2anmms54aj084pkbdcpml6ckvs0qb4defi0df3b1e8inp29p60ac93hf2u7to0je4op9fum40 builtin.syntax.docColumn : [Doc2] -> Doc2 - 637. -- #ukv56cjchfao07qb08l7iimd2mmv09s5glmtljo5b71leaijtja04obd0u1hsr38itjnv85f7jvd37nr654bl4lfn4msr1one0hi4s0 + 652. -- #ukv56cjchfao07qb08l7iimd2mmv09s5glmtljo5b71leaijtja04obd0u1hsr38itjnv85f7jvd37nr654bl4lfn4msr1one0hi4s0 builtin.syntax.docEmbedAnnotation : tm -> Doc2.Term - 638. -- #uccvv8mn62ne8iqppsnpgbquqmhk4hk3n4tg7p6kttr20gov4698tu18jmmvdcs7ab455q7kklhb4uv1mtei4vbvq4qmbtbu1dbagmg + 653. -- #uccvv8mn62ne8iqppsnpgbquqmhk4hk3n4tg7p6kttr20gov4698tu18jmmvdcs7ab455q7kklhb4uv1mtei4vbvq4qmbtbu1dbagmg builtin.syntax.docEmbedAnnotations : tms -> tms - 639. -- #3r6c432d46j544g26chbfgfqrr79k7disfn41igdpe0thjar30lrjhqsuhipsr9rvg8jk6rpmnalc5iu8j842sq3svu1bo4c02og7to + 654. -- #3r6c432d46j544g26chbfgfqrr79k7disfn41igdpe0thjar30lrjhqsuhipsr9rvg8jk6rpmnalc5iu8j842sq3svu1bo4c02og7to builtin.syntax.docEmbedSignatureLink : '{g} t -> Doc2.Term - 640. -- #pjtf55viib2vgc4hp60e2bui7r8iij7kan0u6uq6d60d6d6ccpq81f9ngcrou2lob9maqsvcqsa85ev4171iml9elg5hbfaopijo6lo + 655. -- #pjtf55viib2vgc4hp60e2bui7r8iij7kan0u6uq6d60d6d6ccpq81f9ngcrou2lob9maqsvcqsa85ev4171iml9elg5hbfaopijo6lo builtin.syntax.docEmbedTermLink : '{g} t -> Either a Doc2.Term - 641. -- #7t98ois54isfkh31uefvdg4bg302s5q3sun4hfh0mqnosk4ded353jp0p2ij6b22vnvlcbipcv2jb91suh6qc33i7uqlfuto9f0r4n8 + 656. -- #7t98ois54isfkh31uefvdg4bg302s5q3sun4hfh0mqnosk4ded353jp0p2ij6b22vnvlcbipcv2jb91suh6qc33i7uqlfuto9f0r4n8 builtin.syntax.docEmbedTypeLink : typ -> Either typ b - 642. -- #ngon71rp4i6a3qd36pu015kk7d7il2i1491upfgernpm635hkjhcrm84oumfe6tvn193nb1lsrkulvvnmq5os0evm6sndlarquhe3i0 + 657. -- #ngon71rp4i6a3qd36pu015kk7d7il2i1491upfgernpm635hkjhcrm84oumfe6tvn193nb1lsrkulvvnmq5os0evm6sndlarquhe3i0 builtin.syntax.docEval : 'a -> Doc2 - 643. -- #hsmpfd41n9m02atorpvnj2gf7lcf04o51nrc8kohfddgq4vo18unk2c1ci8pfsam9f4i02babsu7urhvcek8fbfrilcusrgnaifp278 + 658. -- #hsmpfd41n9m02atorpvnj2gf7lcf04o51nrc8kohfddgq4vo18unk2c1ci8pfsam9f4i02babsu7urhvcek8fbfrilcusrgnaifp278 builtin.syntax.docEvalInline : 'a -> Doc2 - 644. -- #73m68mnahgud6dl9red3rcmd49qn80d0ptr2m1h163e1jr1fitibr2hf84o62cqs7dsqiuea578ge7en7kk290k6778lgo39btl5468 + 659. -- #73m68mnahgud6dl9red3rcmd49qn80d0ptr2m1h163e1jr1fitibr2hf84o62cqs7dsqiuea578ge7en7kk290k6778lgo39btl5468 builtin.syntax.docExample : Nat -> '{g} t -> Doc2 - 645. -- #62nif2cvq90cnds9eo95hdn6uvgqo6np4eku52ar4pnb18sfdetl9oo6cu99hbksfa0b4krlcvse5gr5uv5k5b0ukuovt75krhlp418 + 660. -- #62nif2cvq90cnds9eo95hdn6uvgqo6np4eku52ar4pnb18sfdetl9oo6cu99hbksfa0b4krlcvse5gr5uv5k5b0ukuovt75krhlp418 builtin.syntax.docExampleBlock : Nat -> '{g} t -> Doc2 - 646. -- #pomj7lft70jnnuk5job0pstih2mosva1oee4tediqbkhnm54tjqnfe6qs1mqt8os1ehg9ksgenb6veub2ngdpb1qat400vn0bj3fju0 + 661. -- #pomj7lft70jnnuk5job0pstih2mosva1oee4tediqbkhnm54tjqnfe6qs1mqt8os1ehg9ksgenb6veub2ngdpb1qat400vn0bj3fju0 builtin.syntax.docFoldedSource : [( Either Type Doc2.Term, [Doc2.Term])] -> Doc2 - 647. -- #dg44n9t54o1jkl3dtecsqh9vvs57jsvtvbfohkrtolqqgf2g7mf5el9i5jhg6qop1arms99c7s34d9h5rnrvf1fi4100lerjg3b38q8 + 662. -- #dg44n9t54o1jkl3dtecsqh9vvs57jsvtvbfohkrtolqqgf2g7mf5el9i5jhg6qop1arms99c7s34d9h5rnrvf1fi4100lerjg3b38q8 builtin.syntax.docFormatConsole : Doc2 -> Pretty (Either SpecialForm ConsoleText) - 648. -- #99qvifgs3u7nof50jbp5lhrf8cab0qiujr1tque2b7hfj56r39o8ot2fafhafuphoraddl1j142k994e22g5v2rhq98flc0954t5918 + 663. -- #99qvifgs3u7nof50jbp5lhrf8cab0qiujr1tque2b7hfj56r39o8ot2fafhafuphoraddl1j142k994e22g5v2rhq98flc0954t5918 builtin.syntax.docGroup : Doc2 -> Doc2 - 649. -- #gsratvk7mo273bqhivdv06f9rog2cj48u7ci0jp6ubt5oidf8cq0rjilimkas5801inbbsjcedh61jl40i3en1qu6r9vfe684ad6r08 + 664. -- #gsratvk7mo273bqhivdv06f9rog2cj48u7ci0jp6ubt5oidf8cq0rjilimkas5801inbbsjcedh61jl40i3en1qu6r9vfe684ad6r08 builtin.syntax.docItalic : Doc2 -> Doc2 - 650. -- #piohhscvm6lgpk6vfg91u2ndmlfv81nnkspihom77ucr4dev6s22rk2n9hp38nifh5p8vt7jfvep85vudpvlg2tt99e9s2qfjv5oau8 + 665. -- #piohhscvm6lgpk6vfg91u2ndmlfv81nnkspihom77ucr4dev6s22rk2n9hp38nifh5p8vt7jfvep85vudpvlg2tt99e9s2qfjv5oau8 builtin.syntax.docJoin : [Doc2] -> Doc2 - 651. -- #hjdqcolihf4obmnfoakl2t5hs1e39hpmpo9ijvc37fqgejog1ii7fpd4q2fe2rkm62tf81unmqlbud8uh63vaa9feaekg5a7uo3nq00 + 666. -- #hjdqcolihf4obmnfoakl2t5hs1e39hpmpo9ijvc37fqgejog1ii7fpd4q2fe2rkm62tf81unmqlbud8uh63vaa9feaekg5a7uo3nq00 builtin.syntax.docLink : Either Type Doc2.Term -> Doc2 - 652. -- #iv6urr76b0ohvr22qa6d05e7e01cd0re77g8c98cm0bqo0im345fotsevqnhk1igtutkrrqm562gtltofvku5mh0i87ru8tdf0i53bo + 667. -- #iv6urr76b0ohvr22qa6d05e7e01cd0re77g8c98cm0bqo0im345fotsevqnhk1igtutkrrqm562gtltofvku5mh0i87ru8tdf0i53bo builtin.syntax.docNamedLink : Doc2 -> Doc2 -> Doc2 - 653. -- #b5dvn0bqj3rc1rkmlep5f6cd6n3vp247hqku8lqndena5ocgcoae18iuq3985finagr919re4fvji011ved0g21i6o0je2jn8f7k1p0 + 668. -- #b5dvn0bqj3rc1rkmlep5f6cd6n3vp247hqku8lqndena5ocgcoae18iuq3985finagr919re4fvji011ved0g21i6o0je2jn8f7k1p0 builtin.syntax.docNumberedList : Nat -> [Doc2] -> Doc2 - 654. -- #fs8mho20fqj31ch5kpn8flm4geomotov7fb5ct8mtnh52ladorgp22vder3jgt1mr0u710e6s9gn4u36c9sp19vitvq1r0adtm3t1c0 + 669. -- #fs8mho20fqj31ch5kpn8flm4geomotov7fb5ct8mtnh52ladorgp22vder3jgt1mr0u710e6s9gn4u36c9sp19vitvq1r0adtm3t1c0 builtin.syntax.docParagraph : [Doc2] -> Doc2 - 655. -- #6dvkai3hc122e2h2h8c3jnijink5m20e27i640qvnt6smefpp2vna1rq4gbmulhb46tdabmkb5hsjeiuo4adtsutg4iu1vfmqhlueso + 670. -- #6dvkai3hc122e2h2h8c3jnijink5m20e27i640qvnt6smefpp2vna1rq4gbmulhb46tdabmkb5hsjeiuo4adtsutg4iu1vfmqhlueso builtin.syntax.docSection : Doc2 -> [Doc2] -> Doc2 - 656. -- #n0idf1bdrq5vgpk4pj9db5demk1es4jsnpodfoajftehvqjelsi0h5j2domdllq2peltdek4ptaqfpl4o8l6jpmqhcom9vq107ivdu0 + 671. -- #n0idf1bdrq5vgpk4pj9db5demk1es4jsnpodfoajftehvqjelsi0h5j2domdllq2peltdek4ptaqfpl4o8l6jpmqhcom9vq107ivdu0 builtin.syntax.docSignature : [Doc2.Term] -> Doc2 - 657. -- #git1povkck9jrptdmmpqrv1g17ptbq9hr17l52l8477ijk4cia24tr7cj36v1o22mvtk00qoo5jt4bs4e79sl3eh6is8ubh8aoc1pu0 + 672. -- #git1povkck9jrptdmmpqrv1g17ptbq9hr17l52l8477ijk4cia24tr7cj36v1o22mvtk00qoo5jt4bs4e79sl3eh6is8ubh8aoc1pu0 builtin.syntax.docSignatureInline : Doc2.Term -> Doc2 - 658. -- #47agivvofl1jegbqpdg0eeed72mdj29d623e4kdei0l10mhgckif7q2pd968ggribregcknra9u43mhehr1q86n0t4vbe4eestnu9l8 + 673. -- #47agivvofl1jegbqpdg0eeed72mdj29d623e4kdei0l10mhgckif7q2pd968ggribregcknra9u43mhehr1q86n0t4vbe4eestnu9l8 builtin.syntax.docSource : [( Either Type Doc2.Term, [Doc2.Term])] -> Doc2 - 659. -- #n6uk5tc4d8ipbga8boelh51ro24paveca9fijm1nkn3tlfddqludmlppb2ps8807v2kuou1a262sa59764mdhug2va69q4sls5jli10 + 674. -- #n6uk5tc4d8ipbga8boelh51ro24paveca9fijm1nkn3tlfddqludmlppb2ps8807v2kuou1a262sa59764mdhug2va69q4sls5jli10 builtin.syntax.docSourceElement : link -> annotations -> (link, annotations) - 660. -- #nurq288b5rfp1f5keccleh51ojgcpd2rp7cane6ftquf7gidtamffb8tr1r5h6luk1nsrqomn1k4as4kcpaskjjv35rnvoous457sag + 675. -- #nurq288b5rfp1f5keccleh51ojgcpd2rp7cane6ftquf7gidtamffb8tr1r5h6luk1nsrqomn1k4as4kcpaskjjv35rnvoous457sag builtin.syntax.docStrikethrough : Doc2 -> Doc2 - 661. -- #4ns2amu2njhvb5mtdvh3v7oljjb5ammnb41us4ekpbhb337b6mo2a4q0790cmrusko7omphtfdsaust2fn49hr5acl40ef8fkb9556g + 676. -- #4ns2amu2njhvb5mtdvh3v7oljjb5ammnb41us4ekpbhb337b6mo2a4q0790cmrusko7omphtfdsaust2fn49hr5acl40ef8fkb9556g builtin.syntax.docTable : [[Doc2]] -> Doc2 - 662. -- #i77kddfr68gbjt3767a091dtnqff9beltojh93md8peo28t59c6modeccsfd2tnrtmd75fa7dn0ie21kcv4me098q91h4ftg9eau5fo + 677. -- #i77kddfr68gbjt3767a091dtnqff9beltojh93md8peo28t59c6modeccsfd2tnrtmd75fa7dn0ie21kcv4me098q91h4ftg9eau5fo builtin.syntax.docTooltip : Doc2 -> Doc2 -> Doc2 - 663. -- #r0hdacbk2orcb2ate3uhd7ht05hmfa8643slm3u63nb3jaaim533up04lgt0pq97is43v2spkqble7mtu8f63hgcc0k2tb2jhpr2b68 + 678. -- #r0hdacbk2orcb2ate3uhd7ht05hmfa8643slm3u63nb3jaaim533up04lgt0pq97is43v2spkqble7mtu8f63hgcc0k2tb2jhpr2b68 builtin.syntax.docTransclude : d -> d - 664. -- #0nptdh40ngakd2rh92bl573a7vbdjcj2kc8rai39v8bb9dfpbj90i7nob381usjsott41c3cpo2m2q095fm0k0r68e8mrda135qa1k0 + 679. -- #0nptdh40ngakd2rh92bl573a7vbdjcj2kc8rai39v8bb9dfpbj90i7nob381usjsott41c3cpo2m2q095fm0k0r68e8mrda135qa1k0 builtin.syntax.docUntitledSection : [Doc2] -> Doc2 - 665. -- #krjm78blt08v52c52l4ubsnfidcrs0h6010j2v2h9ud38mgm6jj4vuqn4okp4g75039o7u78sbg6ghforucbfdf94f8am9kvt6875jo + 680. -- #krjm78blt08v52c52l4ubsnfidcrs0h6010j2v2h9ud38mgm6jj4vuqn4okp4g75039o7u78sbg6ghforucbfdf94f8am9kvt6875jo builtin.syntax.docVerbatim : Doc2 -> Doc2 - 666. -- #c14vgd4g1tkumf4jjd9vcoos1olb3f4gbc3hketf5l8h3i0efk8igbinh6gn018tr5075uo5nv1elva6tki6ofo3pdafidrkv9m0ot0 + 681. -- #c14vgd4g1tkumf4jjd9vcoos1olb3f4gbc3hketf5l8h3i0efk8igbinh6gn018tr5075uo5nv1elva6tki6ofo3pdafidrkv9m0ot0 builtin.syntax.docWord : Text -> Doc2 - 667. -- #aql7qk3iud6vs4cvu43aimopoosgk0fnipibdkc3so13adencmibgfn0u5c01r0adei55nkl3ttsjhl8gbj7tr4gnpj63g64ftbq6s0 + 682. -- #aql7qk3iud6vs4cvu43aimopoosgk0fnipibdkc3so13adencmibgfn0u5c01r0adei55nkl3ttsjhl8gbj7tr4gnpj63g64ftbq6s0 type builtin.Test.Result - 668. -- #aql7qk3iud6vs4cvu43aimopoosgk0fnipibdkc3so13adencmibgfn0u5c01r0adei55nkl3ttsjhl8gbj7tr4gnpj63g64ftbq6s0#0 + 683. -- #aql7qk3iud6vs4cvu43aimopoosgk0fnipibdkc3so13adencmibgfn0u5c01r0adei55nkl3ttsjhl8gbj7tr4gnpj63g64ftbq6s0#0 builtin.Test.Result.Fail : Text -> Result - 669. -- #aql7qk3iud6vs4cvu43aimopoosgk0fnipibdkc3so13adencmibgfn0u5c01r0adei55nkl3ttsjhl8gbj7tr4gnpj63g64ftbq6s0#1 + 684. -- #aql7qk3iud6vs4cvu43aimopoosgk0fnipibdkc3so13adencmibgfn0u5c01r0adei55nkl3ttsjhl8gbj7tr4gnpj63g64ftbq6s0#1 builtin.Test.Result.Ok : Text -> Result - 670. -- ##Text + 685. -- ##Text builtin type builtin.Text - 671. -- ##Text.!= + 686. -- ##Text.!= builtin.Text.!= : Text -> Text -> Boolean - 672. -- ##Text.++ + 687. -- ##Text.++ builtin.Text.++ : Text -> Text -> Text - 673. -- #nv11qo7s2lqirk3qb44jkm3q3fb6i3mn72ji2c52eubh3kufrdumanblh2bnql1o24efdhmue0v21gd7d1p5ec9j6iqrmekas0183do + 688. -- #nv11qo7s2lqirk3qb44jkm3q3fb6i3mn72ji2c52eubh3kufrdumanblh2bnql1o24efdhmue0v21gd7d1p5ec9j6iqrmekas0183do builtin.Text.alignLeftWith : Nat -> Char -> Text -> Text - 674. -- #ebeq250fdoigvu89fneb4c24f8f18eotc8kocdmosn4ri9shoeeg7ofkejts6clm5c6bifce66qtr0vpfkrhuup2en3khous41hp8rg + 689. -- #ebeq250fdoigvu89fneb4c24f8f18eotc8kocdmosn4ri9shoeeg7ofkejts6clm5c6bifce66qtr0vpfkrhuup2en3khous41hp8rg builtin.Text.alignRightWith : Nat -> Char -> Text -> Text - 675. -- ##Text.drop + 690. -- ##Text.drop builtin.Text.drop : Nat -> Text -> Text - 676. -- ##Text.empty + 691. -- ##Text.empty builtin.Text.empty : Text - 677. -- ##Text.== + 692. -- ##Text.== builtin.Text.eq : Text -> Text -> Boolean - 678. -- ##Text.fromCharList + 693. -- ##Text.fromCharList builtin.Text.fromCharList : [Char] -> Text - 679. -- ##Text.fromUtf8.impl.v3 + 694. -- ##Text.fromUtf8.impl.v3 builtin.Text.fromUtf8.impl : Bytes -> Either Failure Text - 680. -- ##Text.> + 695. -- ##Text.> builtin.Text.gt : Text -> Text -> Boolean - 681. -- ##Text.>= + 696. -- ##Text.>= builtin.Text.gteq : Text -> Text -> Boolean - 682. -- ##Text.indexOf + 697. -- ##Text.indexOf builtin.Text.indexOf : Text -> Text -> Optional Nat - 683. -- ##Text.< + 698. -- ##Text.< builtin.Text.lt : Text -> Text -> Boolean - 684. -- ##Text.<= + 699. -- ##Text.<= builtin.Text.lteq : Text -> Text -> Boolean - 685. -- ##Text.patterns.anyChar + 700. -- ##Text.patterns.anyChar builtin.Text.patterns.anyChar : Pattern Text - 686. -- ##Text.patterns.char + 701. -- ##Text.patterns.char builtin.Text.patterns.char : Class -> Pattern Text - 687. -- ##Text.patterns.charIn + 702. -- ##Text.patterns.charIn builtin.Text.patterns.charIn : [Char] -> Pattern Text - 688. -- ##Text.patterns.charRange + 703. -- ##Text.patterns.charRange builtin.Text.patterns.charRange : Char -> Char -> Pattern Text - 689. -- ##Text.patterns.digit + 704. -- ##Text.patterns.digit builtin.Text.patterns.digit : Pattern Text - 690. -- ##Text.patterns.eof + 705. -- ##Text.patterns.eof builtin.Text.patterns.eof : Pattern Text - 691. -- ##Text.patterns.letter + 706. -- ##Text.patterns.letter builtin.Text.patterns.letter : Pattern Text - 692. -- ##Text.patterns.literal + 707. -- ##Text.patterns.literal builtin.Text.patterns.literal : Text -> Pattern Text - 693. -- ##Text.patterns.notCharIn + 708. -- ##Text.patterns.notCharIn builtin.Text.patterns.notCharIn : [Char] -> Pattern Text - 694. -- ##Text.patterns.notCharRange + 709. -- ##Text.patterns.notCharRange builtin.Text.patterns.notCharRange : Char -> Char -> Pattern Text - 695. -- ##Text.patterns.punctuation + 710. -- ##Text.patterns.punctuation builtin.Text.patterns.punctuation : Pattern Text - 696. -- ##Text.patterns.space + 711. -- ##Text.patterns.space builtin.Text.patterns.space : Pattern Text - 697. -- ##Text.repeat + 712. -- ##Text.repeat builtin.Text.repeat : Nat -> Text -> Text - 698. -- ##Text.reverse + 713. -- ##Text.reverse builtin.Text.reverse : Text -> Text - 699. -- ##Text.size + 714. -- ##Text.size builtin.Text.size : Text -> Nat - 700. -- ##Text.take + 715. -- ##Text.take builtin.Text.take : Nat -> Text -> Text - 701. -- ##Text.toCharList + 716. -- ##Text.toCharList builtin.Text.toCharList : Text -> [Char] - 702. -- ##Text.toLowercase + 717. -- ##Text.toLowercase builtin.Text.toLowercase : Text -> Text - 703. -- ##Text.toUppercase + 718. -- ##Text.toUppercase builtin.Text.toUppercase : Text -> Text - 704. -- ##Text.toUtf8 + 719. -- ##Text.toUtf8 builtin.Text.toUtf8 : Text -> Bytes - 705. -- ##Text.uncons + 720. -- ##Text.uncons builtin.Text.uncons : Text -> Optional (Char, Text) - 706. -- ##Text.unsnoc + 721. -- ##Text.unsnoc builtin.Text.unsnoc : Text -> Optional (Text, Char) - 707. -- ##ThreadId.toText + 722. -- ##ThreadId.toText builtin.ThreadId.toText : ThreadId -> Text - 708. -- ##todo + 723. -- ##todo builtin.todo : a -> b - 709. -- #2lg4ah6ir6t129m33d7gssnigacral39qdamo20mn6r2vefliubpeqnjhejai9ekjckv0qnu9mlu3k9nbpfhl2schec4dohn7rjhjt8 + 724. -- #2lg4ah6ir6t129m33d7gssnigacral39qdamo20mn6r2vefliubpeqnjhejai9ekjckv0qnu9mlu3k9nbpfhl2schec4dohn7rjhjt8 structural type builtin.Tuple a b - 710. -- #2lg4ah6ir6t129m33d7gssnigacral39qdamo20mn6r2vefliubpeqnjhejai9ekjckv0qnu9mlu3k9nbpfhl2schec4dohn7rjhjt8#0 + 725. -- #2lg4ah6ir6t129m33d7gssnigacral39qdamo20mn6r2vefliubpeqnjhejai9ekjckv0qnu9mlu3k9nbpfhl2schec4dohn7rjhjt8#0 builtin.Tuple.Cons : a -> b -> Tuple a b - 711. -- #00nv2kob8fp11qdkr750rlppf81cda95m3q0niohj1pvljnjl4r3hqrhvp1un2p40ptgkhhsne7hocod90r3qdlus9guivh7j3qcq0g + 726. -- ##UDPSocket + builtin type builtin.UDPSocket + + 727. -- #00nv2kob8fp11qdkr750rlppf81cda95m3q0niohj1pvljnjl4r3hqrhvp1un2p40ptgkhhsne7hocod90r3qdlus9guivh7j3qcq0g structural type builtin.Unit - 712. -- #00nv2kob8fp11qdkr750rlppf81cda95m3q0niohj1pvljnjl4r3hqrhvp1un2p40ptgkhhsne7hocod90r3qdlus9guivh7j3qcq0g#0 + 728. -- #00nv2kob8fp11qdkr750rlppf81cda95m3q0niohj1pvljnjl4r3hqrhvp1un2p40ptgkhhsne7hocod90r3qdlus9guivh7j3qcq0g#0 builtin.Unit.Unit : () - 713. -- ##Universal.< + 729. -- ##Universal.< builtin.Universal.< : a -> a -> Boolean - 714. -- ##Universal.<= + 730. -- ##Universal.<= builtin.Universal.<= : a -> a -> Boolean - 715. -- ##Universal.== + 731. -- ##Universal.== builtin.Universal.== : a -> a -> Boolean - 716. -- ##Universal.> + 732. -- ##Universal.> builtin.Universal.> : a -> a -> Boolean - 717. -- ##Universal.>= + 733. -- ##Universal.>= builtin.Universal.>= : a -> a -> Boolean - 718. -- ##Universal.compare + 734. -- ##Universal.compare builtin.Universal.compare : a -> a -> Int - 719. -- ##Universal.murmurHash + 735. -- ##Universal.murmurHash builtin.Universal.murmurHash : a -> Nat - 720. -- ##unsafe.coerceAbilities + 736. -- ##unsafe.coerceAbilities builtin.unsafe.coerceAbilities : (a ->{e1} b) -> a -> b - 721. -- ##Value + 737. -- ##Value builtin type builtin.Value - 722. -- ##Value.dependencies + 738. -- ##Value.dependencies builtin.Value.dependencies : Value -> [Link.Term] - 723. -- ##Value.deserialize + 739. -- ##Value.deserialize builtin.Value.deserialize : Bytes -> Either Text Value - 724. -- ##Value.load + 740. -- ##Value.load builtin.Value.load : Value ->{IO} Either [Link.Term] a - 725. -- ##Value.serialize + 741. -- ##Value.serialize builtin.Value.serialize : Value -> Bytes - 726. -- ##Value.value + 742. -- ##Value.value builtin.Value.value : a -> Value - 727. -- #dem6aglnj8cppfrnq9qipl7geo5pim3auo9cmv1rhh5la9edalj19sspbpm1pd4vh0plokdh6qfo48gs034dqlg0s7j9fhr9p9ndtpo + 743. -- #dem6aglnj8cppfrnq9qipl7geo5pim3auo9cmv1rhh5la9edalj19sspbpm1pd4vh0plokdh6qfo48gs034dqlg0s7j9fhr9p9ndtpo type builtin.Year - 728. -- #dem6aglnj8cppfrnq9qipl7geo5pim3auo9cmv1rhh5la9edalj19sspbpm1pd4vh0plokdh6qfo48gs034dqlg0s7j9fhr9p9ndtpo#0 + 744. -- #dem6aglnj8cppfrnq9qipl7geo5pim3auo9cmv1rhh5la9edalj19sspbpm1pd4vh0plokdh6qfo48gs034dqlg0s7j9fhr9p9ndtpo#0 builtin.Year.Year : Nat -> Year - 729. -- #iur47o4jj4v554bfjsu95t8eru2vtko62d4jo4kvvt0mqnshtbleit15dlj1gkrpmokmf2pbegon8cof7600mv9s0m9229uk19bdvgg + 745. -- #iur47o4jj4v554bfjsu95t8eru2vtko62d4jo4kvvt0mqnshtbleit15dlj1gkrpmokmf2pbegon8cof7600mv9s0m9229uk19bdvgg cache : [(Link.Term, Code)] ->{IO, Exception} () - 730. -- #okolgrio28p1mbl1bfjfs9qtsr1m9upblcm3ul872gcir6epkcbq619vk5bdq1fnr371nelsof6jsp8469g4j6f0gg3007p79o4kf18 + 746. -- #okolgrio28p1mbl1bfjfs9qtsr1m9upblcm3ul872gcir6epkcbq619vk5bdq1fnr371nelsof6jsp8469g4j6f0gg3007p79o4kf18 check : Text -> Boolean ->{Stream Result} () - 731. -- #je42vk6rsefjlup01e1fmmdssf5i3ba9l6aka3bipggetfm8o4i8d1q5d7hddggu5jure1bu5ot8aq5in31to4788ctrtpb44ri83r8 + 747. -- #je42vk6rsefjlup01e1fmmdssf5i3ba9l6aka3bipggetfm8o4i8d1q5d7hddggu5jure1bu5ot8aq5in31to4788ctrtpb44ri83r8 checks : [Boolean] -> [Result] - 732. -- #jf82mm2gvoc3h5ibpejfeohkrl8022m38mi14r08v8s4np9187smglvtbk8u109ri427af2j5fuv1an6lq2k718vgtvr0c4rt9t32vg + 748. -- #jf82mm2gvoc3h5ibpejfeohkrl8022m38mi14r08v8s4np9187smglvtbk8u109ri427af2j5fuv1an6lq2k718vgtvr0c4rt9t32vg clientSocket : Text -> Text ->{IO, Exception} Socket - 733. -- #72auim6cvu5tl8ubmfj5m2p1a822m0jq6fmi8osd99ujbs9h20o3t9e47hcitdcku1e7d40r052sdmfgi1oktio9is8tf503f5unh7g + 749. -- #72auim6cvu5tl8ubmfj5m2p1a822m0jq6fmi8osd99ujbs9h20o3t9e47hcitdcku1e7d40r052sdmfgi1oktio9is8tf503f5unh7g closeFile : Handle ->{IO, Exception} () - 734. -- #nsvn5rj51knr3j62dp1ki0glb01bqj3ccq4537e1hgl2m89o9v7ghc54bu12r515mum791tcf4vgsrb6b1csa0tol1ldkiqrb8akkpo + 750. -- #nsvn5rj51knr3j62dp1ki0glb01bqj3ccq4537e1hgl2m89o9v7ghc54bu12r515mum791tcf4vgsrb6b1csa0tol1ldkiqrb8akkpo closeSocket : Socket ->{IO, Exception} () - 735. -- #ei73jot64ogu4q76rm3jecdn76vmrj0h7riqqecf1d439mjav7ehh0h7rol5s18nupv586ln3l0m4kmh99p5mhgv6qfcrfgilkgq1oo + 751. -- #ei73jot64ogu4q76rm3jecdn76vmrj0h7riqqecf1d439mjav7ehh0h7rol5s18nupv586ln3l0m4kmh99p5mhgv6qfcrfgilkgq1oo Code.transitiveDeps : Link.Term ->{IO} [(Link.Term, Code)] - 736. -- #srpc2uag5p1grvshbcm3urjntakgi3g3dthfse2cp38sd6uestd5neseces5ue7kum2ca0gsg9i0cilkl0gn8dn3q5dn86v4r8lbha0 + 752. -- #srpc2uag5p1grvshbcm3urjntakgi3g3dthfse2cp38sd6uestd5neseces5ue7kum2ca0gsg9i0cilkl0gn8dn3q5dn86v4r8lbha0 compose : (i1 ->{g1} o) -> (i ->{g} i1) -> i ->{g1, g} o - 737. -- #stnrk323b8mm7dknlonfl70epd9f9ede60iom7sgok31mmggnic7etgi0are2uccs9g429qo3ruaeb9tk90bh35obnce1038p5qe6co + 753. -- #stnrk323b8mm7dknlonfl70epd9f9ede60iom7sgok31mmggnic7etgi0are2uccs9g429qo3ruaeb9tk90bh35obnce1038p5qe6co compose2 : (i2 ->{g2} o) -> (i1 ->{g1} i ->{g} i2) -> i1 -> i ->{g2, g1, g} o - 738. -- #mrc183aovjcae3i03r1a0ia26crmmkcf2e723pda860ps6q11rancsenjoqhc3fn0eraih1mobcvt245jr77l27uoujqa452utq8p68 + 754. -- #mrc183aovjcae3i03r1a0ia26crmmkcf2e723pda860ps6q11rancsenjoqhc3fn0eraih1mobcvt245jr77l27uoujqa452utq8p68 compose3 : (i3 ->{g3} o) -> (i2 ->{g2} i1 ->{g1} i ->{g} i3) -> i2 @@ -2584,333 +2653,333 @@ This transcript is intended to make visible accidental changes to the hashing al -> i ->{g3, g2, g1, g} o - 739. -- #ilkeid6l866bmq90d2v1ilqp9dsjo6ucmf8udgrokq3nr3mo9skl2vao2mo7ish136as52rsf19u9v3jkmd85bl08gnmamo4e5v2fqo + 755. -- #ilkeid6l866bmq90d2v1ilqp9dsjo6ucmf8udgrokq3nr3mo9skl2vao2mo7ish136as52rsf19u9v3jkmd85bl08gnmamo4e5v2fqo contains : Text -> Text -> Boolean - 740. -- #tc40jeeetbig6vcl7j6v1n0o59r8ugmjkhi6tee6o5fmkkbhmttevg093b29637gb6p70trmh9lrje86hhuuiqq565qs20qmjg4kbk0 + 756. -- #tc40jeeetbig6vcl7j6v1n0o59r8ugmjkhi6tee6o5fmkkbhmttevg093b29637gb6p70trmh9lrje86hhuuiqq565qs20qmjg4kbk0 crawl : [(Link.Term, Code)] -> [Link.Term] ->{IO} [(Link.Term, Code)] - 741. -- #urivjjshp3j122vb412mr5rq7jbf21ij1grh4amk1jfd33nfbcgv4emnnas5ekmblc4j4gsncoofatcdtktv0tp1f8sk8p06occb0hg + 757. -- #urivjjshp3j122vb412mr5rq7jbf21ij1grh4amk1jfd33nfbcgv4emnnas5ekmblc4j4gsncoofatcdtktv0tp1f8sk8p06occb0hg createTempDirectory : Text ->{IO, Exception} Text - 742. -- #h4ob7r10rul2v0dekeqjdfctbqr943ut9fgln5jgdgk0reg5d7ha0nlr16vcgcusfncgmquf5pv048lt3l9k7m653i7m0odmrvl69t0 + 758. -- #h4ob7r10rul2v0dekeqjdfctbqr943ut9fgln5jgdgk0reg5d7ha0nlr16vcgcusfncgmquf5pv048lt3l9k7m653i7m0odmrvl69t0 decodeCert : Bytes ->{Exception} SignedCert - 743. -- #ihbmfc4r7o3391jocjm6v4mojpp3hvt84ivqigrmp34vb5l3d7mmdlvh3hkrtebi812npso7rqo203a59pbs7r2g78ig6jvsv0nva38 + 759. -- #ihbmfc4r7o3391jocjm6v4mojpp3hvt84ivqigrmp34vb5l3d7mmdlvh3hkrtebi812npso7rqo203a59pbs7r2g78ig6jvsv0nva38 delay : Nat ->{IO, Exception} () - 744. -- #donnstdrflrkve7cqi26cqd90kvpdht2gp1q7v5u816a2v0h8uhevh4o618d6cdafqcnia2uqdanpn62sb7nafp77rqavj258vvjdr0 + 760. -- #donnstdrflrkve7cqi26cqd90kvpdht2gp1q7v5u816a2v0h8uhevh4o618d6cdafqcnia2uqdanpn62sb7nafp77rqavj258vvjdr0 directoryContents : Text ->{IO, Exception} [Text] - 745. -- #ac6oh72pmu5gojdaff977lj48f83rr5cuquv2nhll3iiit0hu04dr2nflrvi5chbond10mnplq1d0uqu9i52uc7ebvn3dlqp1n504qg + 761. -- #ac6oh72pmu5gojdaff977lj48f83rr5cuquv2nhll3iiit0hu04dr2nflrvi5chbond10mnplq1d0uqu9i52uc7ebvn3dlqp1n504qg Either.isLeft : Either a b -> Boolean - 746. -- #5n8bp6bvja969upaa6l2l346hab5vhemoa9ehb0n7qjer0kfapvuc7bd5hcugrf2o2auu11e9hstlf2g8uv6h3fn3v8ggmeig4blfe8 + 762. -- #5n8bp6bvja969upaa6l2l346hab5vhemoa9ehb0n7qjer0kfapvuc7bd5hcugrf2o2auu11e9hstlf2g8uv6h3fn3v8ggmeig4blfe8 Either.mapLeft : (i ->{g} o) -> Either i b ->{g} Either o b - 747. -- #jp6itgd1nh1tjn2c7e0ebkskk7sgdooh48e023l1hhkvrkuhrklrdf4omr73jpvnodfbtt4tki495480n0bp54fd0o3hngj8k2knqs8 + 763. -- #jp6itgd1nh1tjn2c7e0ebkskk7sgdooh48e023l1hhkvrkuhrklrdf4omr73jpvnodfbtt4tki495480n0bp54fd0o3hngj8k2knqs8 Either.raiseMessage : v -> Either Text b ->{Exception} b - 748. -- #4pa382t5o39uapf9tncjra8parmg9rppsn9ob3qnnrvbvtqc1oq8g3u69uapbjee9d118v8or3suhc3vu82de7l0c0og5h01beqjnko + 764. -- #4pa382t5o39uapf9tncjra8parmg9rppsn9ob3qnnrvbvtqc1oq8g3u69uapbjee9d118v8or3suhc3vu82de7l0c0og5h01beqjnko evalTest : '{IO, TempDirs, Exception, Stream Result} a ->{IO, Exception} ([Result], a) - 749. -- #4n0fgs00hpsj3paqnm9bfm4nbt9cbrin3hl88i992m9tjiq1ik7eq72asu4hcg885uti36tbnj5rudt56eahhnut1nobofg86pk1bng + 765. -- #4n0fgs00hpsj3paqnm9bfm4nbt9cbrin3hl88i992m9tjiq1ik7eq72asu4hcg885uti36tbnj5rudt56eahhnut1nobofg86pk1bng structural ability Exception structural ability builtin.Exception - 750. -- #ilea09hgph2cdqsiaeup3o58met3e62m61nckvc89v20cq3g5e71pe19idi270o7i0jdfttra51lvi1vhs0g6oluvhavhdetpor74e0 + 766. -- #ilea09hgph2cdqsiaeup3o58met3e62m61nckvc89v20cq3g5e71pe19idi270o7i0jdfttra51lvi1vhs0g6oluvhavhdetpor74e0 Exception.catch : '{g, Exception} a ->{g} Either Failure a - 751. -- #hbhvk2e00l6o7qhn8e7p6dc36bjl7ljm0gn2df5clidlrdoufsig1gt5pjhg72kl67folgg2b892kh9jc1oh0l79h4p8dqhcf1tkde0 + 767. -- #hbhvk2e00l6o7qhn8e7p6dc36bjl7ljm0gn2df5clidlrdoufsig1gt5pjhg72kl67folgg2b892kh9jc1oh0l79h4p8dqhcf1tkde0 Exception.failure : Text -> a -> Failure - 752. -- #4n0fgs00hpsj3paqnm9bfm4nbt9cbrin3hl88i992m9tjiq1ik7eq72asu4hcg885uti36tbnj5rudt56eahhnut1nobofg86pk1bng#0 + 768. -- #4n0fgs00hpsj3paqnm9bfm4nbt9cbrin3hl88i992m9tjiq1ik7eq72asu4hcg885uti36tbnj5rudt56eahhnut1nobofg86pk1bng#0 Exception.raise, builtin.Exception.raise : Failure ->{Exception} x - 753. -- #5mqjoauctm02dlqdc10cc66relu40997d6o1u8fj7vv7g0i2mtacjc83afqhuekll1gkqr9vv4lq7aenanq4kf53kcce4l1srr6ip08 + 769. -- #5mqjoauctm02dlqdc10cc66relu40997d6o1u8fj7vv7g0i2mtacjc83afqhuekll1gkqr9vv4lq7aenanq4kf53kcce4l1srr6ip08 Exception.reraise : Either Failure a ->{Exception} a - 754. -- #eak26rh0k633mbfsj8stppgj1e4l6gest2dfb2ol538l2hcmn1gpspq4vf3g72f1g8jnokfk8uv614cbdvcof0hk21nk2e55jseo18g + 770. -- #eak26rh0k633mbfsj8stppgj1e4l6gest2dfb2ol538l2hcmn1gpspq4vf3g72f1g8jnokfk8uv614cbdvcof0hk21nk2e55jseo18g Exception.toEither : '{ε, Exception} a ->{ε} Either Failure a - 755. -- #g2qp63rds1msu1c3ejqfqnsbhsiigsneuij8eq3kfnv2gdmpqui5g7t0alo1cv6mqqgp36ihvst2jc9t1jp6tnumk18mn5v8m9r3n58 + 771. -- #g2qp63rds1msu1c3ejqfqnsbhsiigsneuij8eq3kfnv2gdmpqui5g7t0alo1cv6mqqgp36ihvst2jc9t1jp6tnumk18mn5v8m9r3n58 Exception.toEither.handler : Request {Exception} a -> Either Failure a - 756. -- #q1e3avumkdpbjalk4v7c5rog11ertc0ra5nlkpgd23n6jmbki58rkebl25cbfbn7i3t274srrpbgont7j12i80hkh3gnt713poo13c8 + 772. -- #q1e3avumkdpbjalk4v7c5rog11ertc0ra5nlkpgd23n6jmbki58rkebl25cbfbn7i3t274srrpbgont7j12i80hkh3gnt713poo13c8 Exception.unsafeRun! : '{g, Exception} a ->{g} a - 757. -- #b6eskvgfv4vr30obfnaegflsf0h8u2t8816d3qhl2hl3r0l794rqgqks67q5hd46qlm06pbgt01439hmmk8jvuu3adc45cra0ggeqhg + 773. -- #b6eskvgfv4vr30obfnaegflsf0h8u2t8816d3qhl2hl3r0l794rqgqks67q5hd46qlm06pbgt01439hmmk8jvuu3adc45cra0ggeqhg expect : Text -> (a -> a -> Boolean) -> a -> a ->{Stream Result} () - 758. -- #6oqh4j31ujgecbu9kionucdbv8mbiiuasqrt294trdbqaoqlm5milniomc2c8jej0e2hco809kdb856djrr12luck2onn5que7kp2eo + 774. -- #6oqh4j31ujgecbu9kionucdbv8mbiiuasqrt294trdbqaoqlm5milniomc2c8jej0e2hco809kdb856djrr12luck2onn5que7kp2eo expectU : Text -> a -> a ->{Stream Result} () - 759. -- #ug02c2qol2gp0af97nuceu59r3jm9f52lro04ahkandkin8sabseuckr6ep0lvuknjlfhhogj9k5m2epp15d0j8bipc8iljgg8at7ho + 775. -- #ug02c2qol2gp0af97nuceu59r3jm9f52lro04ahkandkin8sabseuckr6ep0lvuknjlfhhogj9k5m2epp15d0j8bipc8iljgg8at7ho fail : Text -> b ->{Exception} c - 760. -- #ri1irkdfcdg3a0c3orv23fk2vjda5n0mlp7ooi0hskvaloa8d8qs9i7essti135k0sfomqajspr9idhu2hgjpmmb6etfabj8jdo02a8 + 776. -- #ri1irkdfcdg3a0c3orv23fk2vjda5n0mlp7ooi0hskvaloa8d8qs9i7essti135k0sfomqajspr9idhu2hgjpmmb6etfabj8jdo02a8 fileExists : Text ->{IO, Exception} Boolean - 761. -- #urlf22mo1assv31k95beddq2ava91p953ueg8kdcddofc2ftogrt10jemg760mkcd8m3lnjc3keog8anop0r0kmo2k1lggbt2chse30 + 777. -- #urlf22mo1assv31k95beddq2ava91p953ueg8kdcddofc2ftogrt10jemg760mkcd8m3lnjc3keog8anop0r0kmo2k1lggbt2chse30 first : (a ->{g} b) -> (a, c) ->{g} (b, c) - 762. -- #4rfr9je7fbsithij70iaqofqu4hgl6ji7t06ok0k98a5ni1397di8d0mllef935mdvj0e57hbg6rm9nn6ok5gcnvqr0vmodelli9qqg + 778. -- #4rfr9je7fbsithij70iaqofqu4hgl6ji7t06ok0k98a5ni1397di8d0mllef935mdvj0e57hbg6rm9nn6ok5gcnvqr0vmodelli9qqg fromB32 : Bytes ->{Exception} Bytes - 763. -- #13fpchr37ua0pr38ssr7j22pudmseuedf490aok18upagh0f00kg40guj9pgl916v9qurqrvu53f3lpsvi0s82hg3dtjacanrpjvs38 + 779. -- #13fpchr37ua0pr38ssr7j22pudmseuedf490aok18upagh0f00kg40guj9pgl916v9qurqrvu53f3lpsvi0s82hg3dtjacanrpjvs38 fromHex : Text -> Bytes - 764. -- #od69b4q2upcvsdjhb7ra8unq1r8t7924mra5j5s8f7n173bmslp8dprhgt1mjdj49qj10h2gj91eflke1avj0qlecus1mdevufm3hho + 780. -- #od69b4q2upcvsdjhb7ra8unq1r8t7924mra5j5s8f7n173bmslp8dprhgt1mjdj49qj10h2gj91eflke1avj0qlecus1mdevufm3hho getBuffering : Handle ->{IO, Exception} BufferMode - 765. -- #fupr0p6pmt834qep0jp18h9jhf4uadmtrsndpfac3kpkf4q4foqnqi6dmc6u4mgs9aubl8issknu89taqhi1mvaeg1ctbt3uf2lidh8 + 781. -- #fupr0p6pmt834qep0jp18h9jhf4uadmtrsndpfac3kpkf4q4foqnqi6dmc6u4mgs9aubl8issknu89taqhi1mvaeg1ctbt3uf2lidh8 getBytes : Handle -> Nat ->{IO, Exception} Bytes - 766. -- #qgocu5n2e7urg44ch4m8upn24efh6jk4cmp8bjsvhnenhahq8nniauav0ihpqa31p57v8fhqdep4fh5dj7nj1uul7596us04dr6dqng + 782. -- #qgocu5n2e7urg44ch4m8upn24efh6jk4cmp8bjsvhnenhahq8nniauav0ihpqa31p57v8fhqdep4fh5dj7nj1uul7596us04dr6dqng getChar : Handle ->{IO, Exception} Char - 767. -- #t92if409jh848oifd8v6bbu6o0hd0916rc3rbdlj4vf46oll2tradqrilk6r28mmm19dao5sh8l349qrhc59qopv4u1hba3ndfiitq8 + 783. -- #t92if409jh848oifd8v6bbu6o0hd0916rc3rbdlj4vf46oll2tradqrilk6r28mmm19dao5sh8l349qrhc59qopv4u1hba3ndfiitq8 getEcho : Handle ->{IO, Exception} Boolean - 768. -- #5nc47o8abjut8sab84ltouhiv3mtid9poipn2b53q3bpceebdimb4sb1e7lkrmu3bn3ivgcqe568upqqh5clrqgkhfdsji58kcdrt4g + 784. -- #5nc47o8abjut8sab84ltouhiv3mtid9poipn2b53q3bpceebdimb4sb1e7lkrmu3bn3ivgcqe568upqqh5clrqgkhfdsji58kcdrt4g getLine : Handle ->{IO, Exception} Text - 769. -- #l9pfqiqb3u9o8qo7jnaajph1qh0jbodih4vtuqti53vjmtp4diddidt8r2qa826918bt7b1cf873oo511tkivfkg35fo5o4kh5j35r0 + 785. -- #l9pfqiqb3u9o8qo7jnaajph1qh0jbodih4vtuqti53vjmtp4diddidt8r2qa826918bt7b1cf873oo511tkivfkg35fo5o4kh5j35r0 getSomeBytes : Handle -> Nat ->{IO, Exception} Bytes - 770. -- #mdhva408l4fji5h23okmhk5t4dakt1lokuie28nsdspal45lbhe06vkmcu8hf8jplse56o576ogn72j7k5nbph06nl36o957qn25tvo + 786. -- #mdhva408l4fji5h23okmhk5t4dakt1lokuie28nsdspal45lbhe06vkmcu8hf8jplse56o576ogn72j7k5nbph06nl36o957qn25tvo getTempDirectory : '{IO, Exception} Text - 771. -- #vniqolukf0296u5dc6d68ngfvi9quuuklcsjodnfm0tm8atslq19sidso2uqnbf4g6h23qck69dpd0oceb9539ufoo12rhdcdd934lo + 787. -- #vniqolukf0296u5dc6d68ngfvi9quuuklcsjodnfm0tm8atslq19sidso2uqnbf4g6h23qck69dpd0oceb9539ufoo12rhdcdd934lo handlePosition : Handle ->{IO, Exception} Nat - 772. -- #85s6gvfbpv8lhgq8m36h7ebvan4lljiu2ffehbgese5c11h3vpqlcssts8svi2qo2c5d68oeke092puta1ng84982hiid972hss9m40 + 788. -- #85s6gvfbpv8lhgq8m36h7ebvan4lljiu2ffehbgese5c11h3vpqlcssts8svi2qo2c5d68oeke092puta1ng84982hiid972hss9m40 handshake : Tls ->{IO, Exception} () - 773. -- #128490j1tmitiu3vesv97sqspmefobg1am38vos9p0vt4s1bhki87l7kj4cctquffkp40eanmr9ummfglj9i7s25jrpb32ob5sf2tio + 789. -- #128490j1tmitiu3vesv97sqspmefobg1am38vos9p0vt4s1bhki87l7kj4cctquffkp40eanmr9ummfglj9i7s25jrpb32ob5sf2tio hex : Bytes -> Text - 774. -- #ttjui80dbufvf3vgaddmcr065dpgl0rtp68i5cdht6tq4t2vk3i2vg60hi77rug368qijgijf8oui27te7o5oq0t0osm6dg65c080i0 + 790. -- #ttjui80dbufvf3vgaddmcr065dpgl0rtp68i5cdht6tq4t2vk3i2vg60hi77rug368qijgijf8oui27te7o5oq0t0osm6dg65c080i0 id : a -> a - 775. -- #0lj5fufff9ocn6lfgc3sv23aup971joh61ei6llu7djblug7tmv2avijc91ing6jmm42hu3akdefl1ttdvepk69sc8jslih1g80npg8 + 791. -- #0lj5fufff9ocn6lfgc3sv23aup971joh61ei6llu7djblug7tmv2avijc91ing6jmm42hu3akdefl1ttdvepk69sc8jslih1g80npg8 isDirectory : Text ->{IO, Exception} Boolean - 776. -- #flakrb6iks7vgijtm8dhipj14v57tk96nq5uj3uluplpoamb1etufn7rsjrelaj3letaa0e2aivq95794nv2b8a8vqbqdumd6i0fvpo + 792. -- #flakrb6iks7vgijtm8dhipj14v57tk96nq5uj3uluplpoamb1etufn7rsjrelaj3letaa0e2aivq95794nv2b8a8vqbqdumd6i0fvpo isFileEOF : Handle ->{IO, Exception} Boolean - 777. -- #5qan8ssedn9pouru70v1a06tkivapiv0es8k6v3hjpmkmboekktnh30ia7asmevglf4pu8ujb0t9vsctjsjtam160o9bn9g02uciui8 + 793. -- #5qan8ssedn9pouru70v1a06tkivapiv0es8k6v3hjpmkmboekktnh30ia7asmevglf4pu8ujb0t9vsctjsjtam160o9bn9g02uciui8 isFileOpen : Handle ->{IO, Exception} Boolean - 778. -- #2a11371klrv2i8726knma0l3g14on4m2ucihpg65cjj9k930aefg65ovvg0ak4uv3i9evtnu0a5249q3i8ugheqd65cnmgquc1a88n0 + 794. -- #2a11371klrv2i8726knma0l3g14on4m2ucihpg65cjj9k930aefg65ovvg0ak4uv3i9evtnu0a5249q3i8ugheqd65cnmgquc1a88n0 isNone : Optional a -> Boolean - 779. -- #jsqdsol9g3qnkub2f2ogertbiieldlkqh859vn5qovub6halelfmpv1tc50u1n23kotgd9nnejnn0n6foef8aqfcp615ashd0cfi3j8 + 795. -- #jsqdsol9g3qnkub2f2ogertbiieldlkqh859vn5qovub6halelfmpv1tc50u1n23kotgd9nnejnn0n6foef8aqfcp615ashd0cfi3j8 isSeekable : Handle ->{IO, Exception} Boolean - 780. -- #gop2v9s6l24ii1v6bf1nks2h0h18pato0vbsf4u3el18s7mp1jfnp4c7fesdf9sunnlv5f5a9fjr1s952pte87mf63l1iqki9bp0mio + 796. -- #gop2v9s6l24ii1v6bf1nks2h0h18pato0vbsf4u3el18s7mp1jfnp4c7fesdf9sunnlv5f5a9fjr1s952pte87mf63l1iqki9bp0mio List.all : (a ->{ε} Boolean) -> [a] ->{ε} Boolean - 781. -- #thvdk6pgdi019on95nttjhg3rbqo7aq5lv9fqgehg00657utkitc1k5r9bfl7soqdrqd82tjmesn5ocb6d30ire6vkl0ad6rcppg5vo + 797. -- #thvdk6pgdi019on95nttjhg3rbqo7aq5lv9fqgehg00657utkitc1k5r9bfl7soqdrqd82tjmesn5ocb6d30ire6vkl0ad6rcppg5vo List.filter : (a ->{g} Boolean) -> [a] ->{g} [a] - 782. -- #ca71f74kmn16u76lch7ropsgou2t3lbtc5hr06858l97qkhk0b4ado1pnii4hqfannelbgv4qruv4f1iqn43kgkbsq8lpjmo3mnrp38 + 798. -- #ca71f74kmn16u76lch7ropsgou2t3lbtc5hr06858l97qkhk0b4ado1pnii4hqfannelbgv4qruv4f1iqn43kgkbsq8lpjmo3mnrp38 List.foldLeft : (b ->{g} a ->{g} b) -> b -> [a] ->{g} b - 783. -- #o1gssqn32qvl4pa79a0lko5ksvbn0rtv8u5g9jpd73ig94om2r4nlbcqa4nd968q74ios37eg0ol36776praolimpch8jsbohg47j2o + 799. -- #o1gssqn32qvl4pa79a0lko5ksvbn0rtv8u5g9jpd73ig94om2r4nlbcqa4nd968q74ios37eg0ol36776praolimpch8jsbohg47j2o List.forEach : [a] -> (a ->{e} ()) ->{e} () - 784. -- #atruig2897q7u699k1u4ruou8epfb9qsok7ojkm5om67fhhaqgdi597jr7dvr09h9qndupc49obo4cccir98ei1grfehrcd5qhnkcq0 + 800. -- #atruig2897q7u699k1u4ruou8epfb9qsok7ojkm5om67fhhaqgdi597jr7dvr09h9qndupc49obo4cccir98ei1grfehrcd5qhnkcq0 List.range : Nat -> Nat -> [Nat] - 785. -- #marlqbcbculvqjfro3iidf899g2ncob2f8ld3gosg7kas5t9hlh341d49uh57ff5litvrt0hlb2ms7tj0mkfqs9do67cm4msodt8dng + 801. -- #marlqbcbculvqjfro3iidf899g2ncob2f8ld3gosg7kas5t9hlh341d49uh57ff5litvrt0hlb2ms7tj0mkfqs9do67cm4msodt8dng List.reverse : [a] -> [a] - 786. -- #30hfqasco93u0oipi7irfoabh5uofuu2aeplo2c87p4dg0386si6gvv715dbr21s4ftfquev4baj5ost3h17mt8fajn64mbffp6c8c0 + 802. -- #30hfqasco93u0oipi7irfoabh5uofuu2aeplo2c87p4dg0386si6gvv715dbr21s4ftfquev4baj5ost3h17mt8fajn64mbffp6c8c0 List.unzip : [(a, b)] -> ([a], [b]) - 787. -- #s8l7maltpsr01naqadvs5ssttg7eim4ca2096lbo3f3he1i1b11kk95ahtgb5ukb8cjr6kg4r4c1qrvshk9e8dp5fkq87254gc1pk48 + 803. -- #s8l7maltpsr01naqadvs5ssttg7eim4ca2096lbo3f3he1i1b11kk95ahtgb5ukb8cjr6kg4r4c1qrvshk9e8dp5fkq87254gc1pk48 List.zip : [a] -> [b] -> [(a, b)] - 788. -- #g6g6lhj9upe46032doaeo0ndu8lh1krfkc56gvupeg4a16me5vghhi6bthphnsvgtve9ogl73qab6d69ju6uorpj029g97pjg3p2k2o + 804. -- #g6g6lhj9upe46032doaeo0ndu8lh1krfkc56gvupeg4a16me5vghhi6bthphnsvgtve9ogl73qab6d69ju6uorpj029g97pjg3p2k2o listen : Socket ->{IO, Exception} () - 789. -- #ilva5f9uoaia9l8suc3hl9kh2bg1lah1k7uvm8mlq3mt0b9krdh15kurbhb9pu7a8irmvk6m2lpulg75a5alf0a95u0rp0v0n9folmg + 805. -- #ilva5f9uoaia9l8suc3hl9kh2bg1lah1k7uvm8mlq3mt0b9krdh15kurbhb9pu7a8irmvk6m2lpulg75a5alf0a95u0rp0v0n9folmg loadCodeBytes : Bytes ->{Exception} Code - 790. -- #tjj9c7fbprd57jlnndl8huslhvfbhi1bt1mr45v1fvvr2b3bguhnjtll3lbsbnqqjb290tm9cnuafpbtlfev1csbtjjog0r2kfv0e50 + 806. -- #tjj9c7fbprd57jlnndl8huslhvfbhi1bt1mr45v1fvvr2b3bguhnjtll3lbsbnqqjb290tm9cnuafpbtlfev1csbtjjog0r2kfv0e50 loadSelfContained : Text ->{IO, Exception} a - 791. -- #1pkgu9vbcdl57d9pn9ses1htmfokjq6212ed5oo9jscjkf8t2s407j71287hd9nr1shgsjmn0eunm5e7h262id4hh3t4op6barrvc70 + 807. -- #1pkgu9vbcdl57d9pn9ses1htmfokjq6212ed5oo9jscjkf8t2s407j71287hd9nr1shgsjmn0eunm5e7h262id4hh3t4op6barrvc70 loadValueBytes : Bytes ->{IO, Exception} ([(Link.Term, Code)], Value) - 792. -- #nqodnhhovq1ilb5fstpc61l8omfto62r8s0qq8s4ij39ulorqpgtinef64mullq0ns4914gck6obeuu6so1hds09hh5o1ptpt4k909g + 808. -- #nqodnhhovq1ilb5fstpc61l8omfto62r8s0qq8s4ij39ulorqpgtinef64mullq0ns4914gck6obeuu6so1hds09hh5o1ptpt4k909g MVar.put : MVar i -> i ->{IO, Exception} () - 793. -- #4ck8hqiu4m7478q5p7osqd1g9piie53g2v6j89en9s90f3cnhb9jr2515f35605e18ohiod7nb93t03765cil0lecob3hcsht9870g0 + 809. -- #4ck8hqiu4m7478q5p7osqd1g9piie53g2v6j89en9s90f3cnhb9jr2515f35605e18ohiod7nb93t03765cil0lecob3hcsht9870g0 MVar.read : MVar o ->{IO, Exception} o - 794. -- #tchse01rs4t1e6bk9br5ofad23ahlb9eanlv9nqqlk5eh7rv7qtpd5jmdjrcksm1q3uji64kqblrqq0vgap9tmak3urkr3ok4kg2ci0 + 810. -- #tchse01rs4t1e6bk9br5ofad23ahlb9eanlv9nqqlk5eh7rv7qtpd5jmdjrcksm1q3uji64kqblrqq0vgap9tmak3urkr3ok4kg2ci0 MVar.swap : MVar o -> o ->{IO, Exception} o - 795. -- #23nq5mshk51uktsg3su3mnkr9s4fe3sktf4q388bpsluiik64l8h060qptgfv48r25fcskecmc9t4gdsm8im9fhjf70i1klp34epksg + 811. -- #23nq5mshk51uktsg3su3mnkr9s4fe3sktf4q388bpsluiik64l8h060qptgfv48r25fcskecmc9t4gdsm8im9fhjf70i1klp34epksg MVar.take : MVar o ->{IO, Exception} o - 796. -- #18pqussken2f5u9vuall7ds58cf4fajoc4trf7p93vk4640ia88vsh2lgq9kgu8fvpr86518443ecvn7eo5tessq2hmgs55aiftui8g + 812. -- #18pqussken2f5u9vuall7ds58cf4fajoc4trf7p93vk4640ia88vsh2lgq9kgu8fvpr86518443ecvn7eo5tessq2hmgs55aiftui8g newClient : ClientConfig -> Socket ->{IO, Exception} Tls - 797. -- #mmoj281h8bimgcfqfpfg6mfriu8cta5vva4ppo41ioc6phegdfii26ic2s5sh0lf5tc6o15o7v79ui8eeh2mbicup07tl6hkrq9q34o + 813. -- #mmoj281h8bimgcfqfpfg6mfriu8cta5vva4ppo41ioc6phegdfii26ic2s5sh0lf5tc6o15o7v79ui8eeh2mbicup07tl6hkrq9q34o newServer : ServerConfig -> Socket ->{IO, Exception} Tls - 798. -- #r6l6s6ni7ut1b9le2d84el9dkhqjcjhodhd0l1qsksahm4cbgdk0odjck9jnku08v0pn909kabe2v88p43jisavkariomtgmtrrtbu8 + 814. -- #r6l6s6ni7ut1b9le2d84el9dkhqjcjhodhd0l1qsksahm4cbgdk0odjck9jnku08v0pn909kabe2v88p43jisavkariomtgmtrrtbu8 openFile : Text -> FileMode ->{IO, Exception} Handle - 799. -- #c58qbcgd90d965dokk7bu82uehegkbe8jttm7lv4j0ohgi2qm3e3p4v1qfr8vc2dlsmsl9tv0v71kco8c18mneule0ntrhte4ks1090 + 815. -- #c58qbcgd90d965dokk7bu82uehegkbe8jttm7lv4j0ohgi2qm3e3p4v1qfr8vc2dlsmsl9tv0v71kco8c18mneule0ntrhte4ks1090 printLine : Text ->{IO, Exception} () - 800. -- #dck7pb7qv05ol3b0o76l88a22bc7enl781ton5qbs2umvgsua3p16n22il02m29592oohsnbt3cr7hnlumpdhv2ibjp6iji9te4iot0 + 816. -- #dck7pb7qv05ol3b0o76l88a22bc7enl781ton5qbs2umvgsua3p16n22il02m29592oohsnbt3cr7hnlumpdhv2ibjp6iji9te4iot0 printText : Text ->{IO} Either Failure () - 801. -- #5si7baedo99eap6jgd9krvt7q4ak8s98t4ushnno8mgjp7u9li137ferm3dn11g4k3mds1m8n33sbuodrohstbm9hcqm1937tfj7iq8 + 817. -- #5si7baedo99eap6jgd9krvt7q4ak8s98t4ushnno8mgjp7u9li137ferm3dn11g4k3mds1m8n33sbuodrohstbm9hcqm1937tfj7iq8 putBytes : Handle -> Bytes ->{IO, Exception} () - 802. -- #gkd4pi7uossfe12b19s0mrr0a04v5vvhnfmq3qer3cu7jr24m5v4e1qu59mktrornbrrqgihsvkj1f29je971oqimpngiqgebkr9i58 + 818. -- #gkd4pi7uossfe12b19s0mrr0a04v5vvhnfmq3qer3cu7jr24m5v4e1qu59mktrornbrrqgihsvkj1f29je971oqimpngiqgebkr9i58 readFile : Text ->{IO, Exception} Bytes - 803. -- #ak95mrmd6jhaiikkr42qsvd5lu7au0mpveqm1e347mkr7s4f846apqhh203ei1p3pqi18dcuhuotf53l8p2ivsjs8octc1eenjdqb48 + 819. -- #ak95mrmd6jhaiikkr42qsvd5lu7au0mpveqm1e347mkr7s4f846apqhh203ei1p3pqi18dcuhuotf53l8p2ivsjs8octc1eenjdqb48 ready : Handle ->{IO, Exception} Boolean - 804. -- #gpogpcuoc1dsktoh5t50ofl6dc4vulm0fsqoeevuuoivbrin87ah166b8k8vq3s3977ha0p7np5mn198gglqkjj1gh7nbv31eb7dbqo + 820. -- #gpogpcuoc1dsktoh5t50ofl6dc4vulm0fsqoeevuuoivbrin87ah166b8k8vq3s3977ha0p7np5mn198gglqkjj1gh7nbv31eb7dbqo receive : Tls ->{IO, Exception} Bytes - 805. -- #7rctbhido3s7lm9tjb6dit94cg2jofasr6div31976q840e5va5j6tu6p0pugkt106mcjrtiqndimaknakrnssdo6ul0jef6a9nf1qo + 821. -- #7rctbhido3s7lm9tjb6dit94cg2jofasr6div31976q840e5va5j6tu6p0pugkt106mcjrtiqndimaknakrnssdo6ul0jef6a9nf1qo removeDirectory : Text ->{IO, Exception} () - 806. -- #710k006oln987ch4k1c986sb0jfqtpusp0a235te6cejhns51um6umr311ltgfiv80kt0s8sb8r0ic63gj2nvgbi66vq10s4ilkk5ng + 822. -- #710k006oln987ch4k1c986sb0jfqtpusp0a235te6cejhns51um6umr311ltgfiv80kt0s8sb8r0ic63gj2nvgbi66vq10s4ilkk5ng renameDirectory : Text -> Text ->{IO, Exception} () - 807. -- #vb50tjb967ic3mr4brs0pro9819ftcj4q48eoeal8gmk02f05isuqhn0accbi7rv07g3i4hjgntu2b2r8b9bn15mjc59v10u9c3gjdo + 823. -- #vb50tjb967ic3mr4brs0pro9819ftcj4q48eoeal8gmk02f05isuqhn0accbi7rv07g3i4hjgntu2b2r8b9bn15mjc59v10u9c3gjdo runTest : '{IO, TempDirs, Exception, Stream Result} a ->{IO} [Result] - 808. -- #ub9vp3rs8gh7kj9ksq0dbpoj22r61iq179co8tpgsj9m52n36qha52rm5hlht4hesgqfb8917cp1tk8jhgcft6sufgis6bgemmd57ag + 824. -- #ub9vp3rs8gh7kj9ksq0dbpoj22r61iq179co8tpgsj9m52n36qha52rm5hlht4hesgqfb8917cp1tk8jhgcft6sufgis6bgemmd57ag saveSelfContained : a -> Text ->{IO, Exception} () - 809. -- #6jriif58nb7gbb576kcabft4k4qaa74prd4dpsomokbqceust7p0gu0jlpar4o70qt987lkki2sj1pknkr0ggoif8fcvu2jg2uenqe8 + 825. -- #6jriif58nb7gbb576kcabft4k4qaa74prd4dpsomokbqceust7p0gu0jlpar4o70qt987lkki2sj1pknkr0ggoif8fcvu2jg2uenqe8 saveTestCase : Text -> Text -> (a -> Text) -> a ->{IO, Exception} () - 810. -- #uq87p0r1djq5clhkbimp3fc325e5kp3bv33dc8fpphotdqp95a0ps2c2ch8d2ftdpdualpq2oo9dmnka6kvnc9kvugs2538q62up4t0 + 826. -- #uq87p0r1djq5clhkbimp3fc325e5kp3bv33dc8fpphotdqp95a0ps2c2ch8d2ftdpdualpq2oo9dmnka6kvnc9kvugs2538q62up4t0 seekHandle : Handle -> SeekMode -> Int ->{IO, Exception} () - 811. -- #ftkuro0u0et9ahigdr1k38tl2sl7i0plm7cv5nciccdd71t6a64icla66ss0ufu7llfuj7cuvg3ms4ieel6penfi8gkahb9tm3sfhjo + 827. -- #ftkuro0u0et9ahigdr1k38tl2sl7i0plm7cv5nciccdd71t6a64icla66ss0ufu7llfuj7cuvg3ms4ieel6penfi8gkahb9tm3sfhjo send : Tls -> Bytes ->{IO, Exception} () - 812. -- #k6gmcn3qg50h49gealh8o7j7tp74rvhgn040kftsavd2cldqopcv9945olnooe04cqitgpvekpcbr5ccqjosg7r9gb1lagju5v9ln0o + 828. -- #k6gmcn3qg50h49gealh8o7j7tp74rvhgn040kftsavd2cldqopcv9945olnooe04cqitgpvekpcbr5ccqjosg7r9gb1lagju5v9ln0o serverSocket : Optional Text -> Text ->{IO, Exception} Socket - 813. -- #umje4ibrfv3c6vsjrdkbne1u7c8hg4ll9185m3frqr2rsr8738hp5fq12kepa28h63u9qi23stsegjp1hv0incr5djbl7ulp2s12d8g + 829. -- #umje4ibrfv3c6vsjrdkbne1u7c8hg4ll9185m3frqr2rsr8738hp5fq12kepa28h63u9qi23stsegjp1hv0incr5djbl7ulp2s12d8g setBuffering : Handle -> BufferMode ->{IO, Exception} () - 814. -- #je6s0pdkrg3mvphpg535pubchjd40mepki6ipum7498sma7pll9l89h6de65063bufihf2jb5ihepth2jahir8rs757ggfrnpp7fs7o + 830. -- #je6s0pdkrg3mvphpg535pubchjd40mepki6ipum7498sma7pll9l89h6de65063bufihf2jb5ihepth2jahir8rs757ggfrnpp7fs7o setEcho : Handle -> Boolean ->{IO, Exception} () - 815. -- #in06o7cfgnlmm6pvdtv0jv9hniahcli0fvh27o01ork1p77ro2v51rc05ts1h6p9mtffqld4ufs8klcc4bse1tsj93cu0na0bbiuqb0 + 831. -- #in06o7cfgnlmm6pvdtv0jv9hniahcli0fvh27o01ork1p77ro2v51rc05ts1h6p9mtffqld4ufs8klcc4bse1tsj93cu0na0bbiuqb0 snd : (a1, a) -> a - 816. -- #km3cpkvcnvcos0isfbnb7pb3s45ri5q42n74jmm9c4v1bcu8nlk63353u4ohfr7av4k00s4s180ddnqbam6a01thhlt2tie1hm5a9bo + 832. -- #km3cpkvcnvcos0isfbnb7pb3s45ri5q42n74jmm9c4v1bcu8nlk63353u4ohfr7av4k00s4s180ddnqbam6a01thhlt2tie1hm5a9bo socketAccept : Socket ->{IO, Exception} Socket - 817. -- #ubteu6e7h7om7o40e8mm1rcmp8uur7qn7p5d92gtp3q92rtr459nn3rff4i9q46o2o60tmh77i9vgu0pub768s9kvn9egtcds30nk88 + 833. -- #ubteu6e7h7om7o40e8mm1rcmp8uur7qn7p5d92gtp3q92rtr459nn3rff4i9q46o2o60tmh77i9vgu0pub768s9kvn9egtcds30nk88 socketPort : Socket ->{IO, Exception} Nat - 818. -- #3rp8h0dt7g60nrjdehuhqga9dmomti5rdqho7r1rm5rg5moet7kt3ieempo7c9urur752njachq6k48ggbic4ugbbv75jl2mfbk57a0 + 834. -- #3rp8h0dt7g60nrjdehuhqga9dmomti5rdqho7r1rm5rg5moet7kt3ieempo7c9urur752njachq6k48ggbic4ugbbv75jl2mfbk57a0 startsWith : Text -> Text -> Boolean - 819. -- #elsab3sc7p4c6bj73pgvklv0j7qu268rn5isv6micfp7ib8grjoustpqdq0pkd4a379mr5ijb8duu2q0n040osfurppp8pt8vaue2fo + 835. -- #elsab3sc7p4c6bj73pgvklv0j7qu268rn5isv6micfp7ib8grjoustpqdq0pkd4a379mr5ijb8duu2q0n040osfurppp8pt8vaue2fo stdout : Handle - 820. -- #rfi1v9429f9qluv533l2iba77aadttilrpmnhljfapfnfa6sru2nr8ibpqvib9nc4s4nb9s1as45upsfqfqe6ivqi2p82b2vd866it8 + 836. -- #rfi1v9429f9qluv533l2iba77aadttilrpmnhljfapfnfa6sru2nr8ibpqvib9nc4s4nb9s1as45upsfqfqe6ivqi2p82b2vd866it8 structural ability Stream a - 821. -- #s76vfp9t00khf3bvrg01h9u7gnqj5m62sere8ac97un79ojd82b71q2e0cllj002jn4r2g3qhjft40gkqotgor74v0iogkt3lfftlug + 837. -- #s76vfp9t00khf3bvrg01h9u7gnqj5m62sere8ac97un79ojd82b71q2e0cllj002jn4r2g3qhjft40gkqotgor74v0iogkt3lfftlug Stream.collect : '{e, Stream a} r ->{e} ([a], r) - 822. -- #abc5m7k74em3fk9et4lrj0ee2lsbvp8vp826josen26l1g3lh9ansb47b68efe1vhhi8f6l6kaircd5t4ihlbt0pq4nlipgde9rq8v8 + 838. -- #abc5m7k74em3fk9et4lrj0ee2lsbvp8vp826josen26l1g3lh9ansb47b68efe1vhhi8f6l6kaircd5t4ihlbt0pq4nlipgde9rq8v8 Stream.collect.handler : Request {Stream a} r -> ([a], r) - 823. -- #rfi1v9429f9qluv533l2iba77aadttilrpmnhljfapfnfa6sru2nr8ibpqvib9nc4s4nb9s1as45upsfqfqe6ivqi2p82b2vd866it8#0 + 839. -- #rfi1v9429f9qluv533l2iba77aadttilrpmnhljfapfnfa6sru2nr8ibpqvib9nc4s4nb9s1as45upsfqfqe6ivqi2p82b2vd866it8#0 Stream.emit : a ->{Stream a} () - 824. -- #mrhqdu5he7p8adejmvt4ss09apkbnu8jn66g4lpf0uas9dvm8goa6g65bo2u7s0175hrrofd6uqg7ogmduf928knfpkd12042k6o860 + 840. -- #mrhqdu5he7p8adejmvt4ss09apkbnu8jn66g4lpf0uas9dvm8goa6g65bo2u7s0175hrrofd6uqg7ogmduf928knfpkd12042k6o860 Stream.toList : '{Stream a} r -> [a] - 825. -- #t3klufmrq2bk8gg0o4lukenlmu0dkkcssq9l80m4p3dm6rqesrt51nrebfujfgco9h47f4e5nplmj7rvc3salvs65labd7nvj2fkne8 + 841. -- #t3klufmrq2bk8gg0o4lukenlmu0dkkcssq9l80m4p3dm6rqesrt51nrebfujfgco9h47f4e5nplmj7rvc3salvs65labd7nvj2fkne8 Stream.toList.handler : Request {Stream a} r -> [a] - 826. -- #pus3urtj4e1bhv5p5l16d7vnv4g2hso78pcfussnufkt3d53j7oaqde1ajvijr1g6f0cv2c4ice34g8g8n17hd7hql6hvl8sgcgu6s8 + 842. -- #pus3urtj4e1bhv5p5l16d7vnv4g2hso78pcfussnufkt3d53j7oaqde1ajvijr1g6f0cv2c4ice34g8g8n17hd7hql6hvl8sgcgu6s8 systemTime : '{IO, Exception} Nat - 827. -- #11mhfqj6rts8lm3im7saf44tn3km5bboqtu1td0udnaiit4qqg6ar1ecmccosl6gufsnp6sug3vcmgapsc58sgj7dh7rg8msq2qkj18 + 843. -- #11mhfqj6rts8lm3im7saf44tn3km5bboqtu1td0udnaiit4qqg6ar1ecmccosl6gufsnp6sug3vcmgapsc58sgj7dh7rg8msq2qkj18 structural ability TempDirs - 828. -- #11mhfqj6rts8lm3im7saf44tn3km5bboqtu1td0udnaiit4qqg6ar1ecmccosl6gufsnp6sug3vcmgapsc58sgj7dh7rg8msq2qkj18#0 + 844. -- #11mhfqj6rts8lm3im7saf44tn3km5bboqtu1td0udnaiit4qqg6ar1ecmccosl6gufsnp6sug3vcmgapsc58sgj7dh7rg8msq2qkj18#0 TempDirs.newTempDir : Text ->{TempDirs} Text - 829. -- #11mhfqj6rts8lm3im7saf44tn3km5bboqtu1td0udnaiit4qqg6ar1ecmccosl6gufsnp6sug3vcmgapsc58sgj7dh7rg8msq2qkj18#1 + 845. -- #11mhfqj6rts8lm3im7saf44tn3km5bboqtu1td0udnaiit4qqg6ar1ecmccosl6gufsnp6sug3vcmgapsc58sgj7dh7rg8msq2qkj18#1 TempDirs.removeDir : Text ->{TempDirs} () - 830. -- #ibj0sc16l6bd7r6ptft93jeocitrjod98g210beogdk30t3tb127fbe33vau29j0j4gt8mbs2asfs5rslgk0fl3o4did2t9oa8o5kf8 + 846. -- #ibj0sc16l6bd7r6ptft93jeocitrjod98g210beogdk30t3tb127fbe33vau29j0j4gt8mbs2asfs5rslgk0fl3o4did2t9oa8o5kf8 terminate : Tls ->{IO, Exception} () - 831. -- #iis8ph5ljlq8ijd9jsdlsga91fh1354fii7955l4v52mnvn71cd76maculs0eathrmtfjqh0knbc600kmvq6abj4k2ntnbh5ee10m2o + 847. -- #iis8ph5ljlq8ijd9jsdlsga91fh1354fii7955l4v52mnvn71cd76maculs0eathrmtfjqh0knbc600kmvq6abj4k2ntnbh5ee10m2o testAutoClean : '{IO} [Result] - 832. -- #k1prgid1t9d4fu6f60rct978khcuinkpq49ps95aqaimt2tfoa77fc0c8i3pmc8toeth1s98al3nosaa1mhbh2j2k2nvqivm0ks963o + 848. -- #k1prgid1t9d4fu6f60rct978khcuinkpq49ps95aqaimt2tfoa77fc0c8i3pmc8toeth1s98al3nosaa1mhbh2j2k2nvqivm0ks963o Text.fromUtf8 : Bytes ->{Exception} Text - 833. -- #32q9jqhmi8f08pec3hj0je4u7k52f9f1hdfsmn9ncg2kpki5da9dabigplvdcot3a00k7s5npc4n78psd6ojaumqjla259e9pqd4ov8 + 849. -- #32q9jqhmi8f08pec3hj0je4u7k52f9f1hdfsmn9ncg2kpki5da9dabigplvdcot3a00k7s5npc4n78psd6ojaumqjla259e9pqd4ov8 structural ability Throw e - 834. -- #32q9jqhmi8f08pec3hj0je4u7k52f9f1hdfsmn9ncg2kpki5da9dabigplvdcot3a00k7s5npc4n78psd6ojaumqjla259e9pqd4ov8#0 + 850. -- #32q9jqhmi8f08pec3hj0je4u7k52f9f1hdfsmn9ncg2kpki5da9dabigplvdcot3a00k7s5npc4n78psd6ojaumqjla259e9pqd4ov8#0 Throw.throw : e ->{Throw e} a - 835. -- #f6pkvs6ukf8ngh2j8lm935p1bqadso76o7e3t0j1ukupjh1rg0m1rhtp7u492sq17p3bkbintbnjehc1cqs33qlhnfkoihf5uee4ug0 + 851. -- #f6pkvs6ukf8ngh2j8lm935p1bqadso76o7e3t0j1ukupjh1rg0m1rhtp7u492sq17p3bkbintbnjehc1cqs33qlhnfkoihf5uee4ug0 uncurry : (i1 ->{g1} i ->{g} o) -> (i1, i) ->{g1, g} o - 836. -- #u1o44hd0cdlfa8racf458sahdmgea409k8baajgc5k7bqukf2ak5ggs2ped0u3h85v99pgefgb9r7ct2dv4nn9eihjghnqf30p4l57g + 852. -- #u1o44hd0cdlfa8racf458sahdmgea409k8baajgc5k7bqukf2ak5ggs2ped0u3h85v99pgefgb9r7ct2dv4nn9eihjghnqf30p4l57g Value.transitiveDeps : Value ->{IO} [(Link.Term, Code)] - 837. -- #o5bg5el7ckak28ib98j5b6rt26bqbprpddd1brrg3s18qahhbbe3uohufjjnt5eenvtjg0hrvnvpra95jmdppqrovvmcfm1ih2k7guo + 853. -- #o5bg5el7ckak28ib98j5b6rt26bqbprpddd1brrg3s18qahhbbe3uohufjjnt5eenvtjg0hrvnvpra95jmdppqrovvmcfm1ih2k7guo void : x -> () - 838. -- #b4pssu6mf30r4irqj43vvgbc6geq8pp7eg4o2erl948qp3nskp6io5damjj54o2eq9q76mrhsijr1q1d0bna4soed3oggddfvdajaj8 + 854. -- #b4pssu6mf30r4irqj43vvgbc6geq8pp7eg4o2erl948qp3nskp6io5damjj54o2eq9q76mrhsijr1q1d0bna4soed3oggddfvdajaj8 writeFile : Text -> Bytes ->{IO, Exception} () - 839. -- #lcmj2envm11lrflvvcl290lplhvbccv82utoej0lg0eomhmsf2vrv8af17k6if7ff98fp1b13rkseng3fng4stlr495c8dn3gn4k400 + 855. -- #lcmj2envm11lrflvvcl290lplhvbccv82utoej0lg0eomhmsf2vrv8af17k6if7ff98fp1b13rkseng3fng4stlr495c8dn3gn4k400 |> : a -> (a ->{g} t) ->{g} t diff --git a/unison-src/transcripts-using-base/base.u b/unison-src/transcripts-using-base/base.u index 7996407ba..b1023f558 100644 --- a/unison-src/transcripts-using-base/base.u +++ b/unison-src/transcripts-using-base/base.u @@ -178,21 +178,21 @@ Stream.collect s = handle !s with Stream.collect.handler --- An ability that facilitates creating temoporary directories that can be +-- An ability that facilitates creating temoporary directories that can be -- automatically cleaned up structural ability TempDirs where newTempDir: Text -> Text removeDir: Text -> () -- A handler for TempDirs which cleans up temporary directories --- This will be useful for IO tests which need to interact with +-- This will be useful for IO tests which need to interact with -- the filesystem autoCleaned.handler: '{io2.IO} (Request {TempDirs} r -> r) autoCleaned.handler _ = remover : [Text] -> {io2.IO} () remover = cases - a +: as -> match removeDirectory.impl a with + a +: as -> match removeDirectory.impl a with Left (Failure _ e _) -> watch e () _ -> () remover as @@ -277,12 +277,12 @@ putBytes = compose2 reraise putBytes.impl getLine = compose reraise getLine.impl systemTime = compose reraise systemTime.impl decodeCert = compose reraise decodeCert.impl -serverSocket = compose2 reraise serverSocket.impl +serverSocket = compose2 reraise IO.serverSocket.impl listen = compose reraise listen.impl -handshake = compose reraise handshake.impl -send = compose2 reraise send.impl +handshake = compose reraise handshake.impl +send = compose2 reraise Tls.send.impl closeSocket = compose reraise closeSocket.impl -clientSocket = compose2 reraise clientSocket.impl +clientSocket = compose2 reraise IO.clientSocket.impl receive = compose reraise receive.impl terminate = compose reraise terminate.impl newServer = compose2 reraise newServer.impl @@ -451,4 +451,3 @@ saveTestCase name ver f i = saveSelfContained (f, i) sfile writeFile ofile (toUtf8 output) writeFile hfile (Bytes.toBase32 (crypto.hash Sha3_512 (f, i))) - diff --git a/unison-src/transcripts-using-base/hashing.output.md b/unison-src/transcripts-using-base/hashing.output.md index 43331b369..fee4fa0a2 100644 --- a/unison-src/transcripts-using-base/hashing.output.md +++ b/unison-src/transcripts-using-base/hashing.output.md @@ -145,6 +145,11 @@ And here's the full API: 15. hashBytes : HashAlgorithm -> Bytes -> Bytes 16. hmac : HashAlgorithm -> Bytes -> a -> Bytes 17. hmacBytes : HashAlgorithm -> Bytes -> Bytes -> Bytes + 18. Rsa.sign.impl : Bytes -> Bytes -> Either Failure Bytes + 19. Rsa.verify.impl : Bytes + -> Bytes + -> Bytes + -> Either Failure Boolean ``` diff --git a/unison-src/transcripts-using-base/net.md b/unison-src/transcripts-using-base/net.md index 1460e7255..b1125f701 100644 --- a/unison-src/transcripts-using-base/net.md +++ b/unison-src/transcripts-using-base/net.md @@ -1,9 +1,9 @@ ```unison:hide -serverSocket = compose2 reraise serverSocket.impl +serverSocket = compose2 reraise IO.serverSocket.impl socketPort = compose reraise socketPort.impl listen = compose reraise listen.impl closeSocket = compose reraise closeSocket.impl -clientSocket = compose2 reraise clientSocket.impl +clientSocket = compose2 reraise IO.clientSocket.impl socketSend = compose2 reraise socketSend.impl socketReceive = compose2 reraise socketReceive.impl socketAccept = compose reraise socketAccept.impl @@ -36,11 +36,11 @@ stored in `/etc/services` and queried with the `getent` tool: # map number to name $ getent services 22 ssh 22/tcp - + # map name to number $ getent services finger finger 79/tcp - + # get a list of all known names $ getent services | head tcpmux 1/tcp @@ -58,35 +58,35 @@ Below shows different examples of how we might specify the server coordinates. ``` unison testExplicitHost : '{io2.IO} [Result] -testExplicitHost _ = +testExplicitHost _ = test = 'let sock = serverSocket (Some "127.0.0.1") "1028" emit (Ok "successfully created socket") port = socketPort sock putBytes (stdHandle StdOut) (toUtf8 (toText port)) - expectU "should have bound to port 1028" 1028 port + expectU "should have bound to port 1028" 1028 port runTest test testDefaultHost : '{io2.IO} [Result] -testDefaultHost _ = +testDefaultHost _ = test = 'let sock = serverSocket None "1028" emit (Ok "successfully created socket") port = socketPort sock putBytes (stdHandle StdOut) (toUtf8 (toText port)) - expectU "should have bound to port 1028" 1028 port + expectU "should have bound to port 1028" 1028 port runTest test testDefaultPort : '{io2.IO} [Result] -testDefaultPort _ = +testDefaultPort _ = test = 'let sock = serverSocket None "0" emit (Ok "successfully created socket") port = socketPort sock putBytes (stdHandle StdOut) (toUtf8 (toText port)) - + check "port should be > 1024" (1024 < port) check "port should be < 65536" (65536 > port) @@ -113,7 +113,7 @@ serverThread portVar toSend = 'let socketSend sock' (toUtf8 toSend) closeSocket sock' - match (toEither go) with + match (toEither go) with Left (Failure _ t _) -> watch t () _ -> () @@ -130,24 +130,24 @@ clientThread portVar resultVar = 'let _ -> () testTcpConnect : '{io2.IO}[Result] -testTcpConnect = 'let +testTcpConnect = 'let test = 'let portVar = !MVar.newEmpty resultVar = !MVar.newEmpty - + toSend = "12345" void (forkComp (serverThread portVar toSend)) void (forkComp (clientThread portVar resultVar)) - + received = take resultVar expectU "should have reaped what we've sown" toSend received - + runTest test - + ``` -```ucm +```ucm .> add .> io.test testTcpConnect diff --git a/unison-src/transcripts-using-base/net.output.md b/unison-src/transcripts-using-base/net.output.md index 50f1f4c09..572ef0fbf 100644 --- a/unison-src/transcripts-using-base/net.output.md +++ b/unison-src/transcripts-using-base/net.output.md @@ -1,9 +1,9 @@ ```unison -serverSocket = compose2 reraise serverSocket.impl +serverSocket = compose2 reraise IO.serverSocket.impl socketPort = compose reraise socketPort.impl listen = compose reraise listen.impl closeSocket = compose reraise closeSocket.impl -clientSocket = compose2 reraise clientSocket.impl +clientSocket = compose2 reraise IO.clientSocket.impl socketSend = compose2 reraise socketSend.impl socketReceive = compose2 reraise socketReceive.impl socketAccept = compose reraise socketAccept.impl @@ -34,11 +34,11 @@ stored in `/etc/services` and queried with the `getent` tool: # map number to name $ getent services 22 ssh 22/tcp - + # map name to number $ getent services finger finger 79/tcp - + # get a list of all known names $ getent services | head tcpmux 1/tcp @@ -56,35 +56,35 @@ Below shows different examples of how we might specify the server coordinates. ```unison testExplicitHost : '{io2.IO} [Result] -testExplicitHost _ = +testExplicitHost _ = test = 'let sock = serverSocket (Some "127.0.0.1") "1028" emit (Ok "successfully created socket") port = socketPort sock putBytes (stdHandle StdOut) (toUtf8 (toText port)) - expectU "should have bound to port 1028" 1028 port + expectU "should have bound to port 1028" 1028 port runTest test testDefaultHost : '{io2.IO} [Result] -testDefaultHost _ = +testDefaultHost _ = test = 'let sock = serverSocket None "1028" emit (Ok "successfully created socket") port = socketPort sock putBytes (stdHandle StdOut) (toUtf8 (toText port)) - expectU "should have bound to port 1028" 1028 port + expectU "should have bound to port 1028" 1028 port runTest test testDefaultPort : '{io2.IO} [Result] -testDefaultPort _ = +testDefaultPort _ = test = 'let sock = serverSocket None "0" emit (Ok "successfully created socket") port = socketPort sock putBytes (stdHandle StdOut) (toUtf8 (toText port)) - + check "port should be > 1024" (1024 < port) check "port should be < 65536" (65536 > port) @@ -143,7 +143,7 @@ serverThread portVar toSend = 'let socketSend sock' (toUtf8 toSend) closeSocket sock' - match (toEither go) with + match (toEither go) with Left (Failure _ t _) -> watch t () _ -> () @@ -160,22 +160,22 @@ clientThread portVar resultVar = 'let _ -> () testTcpConnect : '{io2.IO}[Result] -testTcpConnect = 'let +testTcpConnect = 'let test = 'let portVar = !MVar.newEmpty resultVar = !MVar.newEmpty - + toSend = "12345" void (forkComp (serverThread portVar toSend)) void (forkComp (clientThread portVar resultVar)) - + received = take resultVar expectU "should have reaped what we've sown" toSend received - + runTest test - + ``` ```ucm diff --git a/unison-src/transcripts/builtins-merge.output.md b/unison-src/transcripts/builtins-merge.output.md index 9aeb9abc0..7bcf4910e 100644 --- a/unison-src/transcripts/builtins-merge.output.md +++ b/unison-src/transcripts/builtins-merge.output.md @@ -17,74 +17,77 @@ The `builtins.merge` command adds the known builtins to a `builtin` subnamespace 6. Bytes/ (34 terms) 7. Char (builtin type) 8. Char/ (22 terms, 1 type) - 9. Code (builtin type) - 10. Code/ (9 terms) - 11. Debug/ (3 terms) - 12. Doc (type) - 13. Doc/ (6 terms) - 14. Either (type) - 15. Either/ (2 terms) - 16. Exception (type) - 17. Exception/ (1 term) - 18. Float (builtin type) - 19. Float/ (38 terms) - 20. Handle/ (1 term) - 21. ImmutableArray (builtin type) - 22. ImmutableArray/ (3 terms) - 23. ImmutableByteArray (builtin type) - 24. ImmutableByteArray/ (8 terms) - 25. Int (builtin type) - 26. Int/ (31 terms) - 27. IsPropagated (type) - 28. IsPropagated/ (1 term) - 29. IsTest (type) - 30. IsTest/ (1 term) - 31. Link (type) - 32. Link/ (3 terms, 2 types) - 33. List (builtin type) - 34. List/ (10 terms) - 35. MutableArray (builtin type) - 36. MutableArray/ (6 terms) - 37. MutableByteArray (builtin type) - 38. MutableByteArray/ (14 terms) - 39. Nat (builtin type) - 40. Nat/ (28 terms) - 41. Optional (type) - 42. Optional/ (2 terms) - 43. Pattern (builtin type) - 44. Pattern/ (9 terms) - 45. Ref (builtin type) - 46. Ref/ (2 terms) - 47. Request (builtin type) - 48. RewriteCase (type) - 49. RewriteCase/ (1 term) - 50. RewriteSignature (type) - 51. RewriteSignature/ (1 term) - 52. RewriteTerm (type) - 53. RewriteTerm/ (1 term) - 54. Rewrites (type) - 55. Rewrites/ (1 term) - 56. Scope (builtin type) - 57. Scope/ (6 terms) - 58. SeqView (type) - 59. SeqView/ (2 terms) - 60. Socket/ (1 term) - 61. Test/ (2 terms, 1 type) - 62. Text (builtin type) - 63. Text/ (34 terms) - 64. ThreadId/ (1 term) - 65. Tuple (type) - 66. Tuple/ (1 term) - 67. Unit (type) - 68. Unit/ (1 term) - 69. Universal/ (7 terms) - 70. Value (builtin type) - 71. Value/ (5 terms) - 72. bug (a -> b) - 73. crypto/ (15 terms, 2 types) - 74. io2/ (135 terms, 32 types) - 75. metadata/ (2 terms) - 76. todo (a -> b) - 77. unsafe/ (1 term) + 9. ClientSockAddr (builtin type) + 10. Code (builtin type) + 11. Code/ (9 terms) + 12. Debug/ (3 terms) + 13. Doc (type) + 14. Doc/ (6 terms) + 15. Either (type) + 16. Either/ (2 terms) + 17. Exception (type) + 18. Exception/ (1 term) + 19. Float (builtin type) + 20. Float/ (38 terms) + 21. Handle/ (1 term) + 22. ImmutableArray (builtin type) + 23. ImmutableArray/ (3 terms) + 24. ImmutableByteArray (builtin type) + 25. ImmutableByteArray/ (8 terms) + 26. Int (builtin type) + 27. Int/ (31 terms) + 28. IsPropagated (type) + 29. IsPropagated/ (1 term) + 30. IsTest (type) + 31. IsTest/ (1 term) + 32. Link (type) + 33. Link/ (3 terms, 2 types) + 34. List (builtin type) + 35. List/ (10 terms) + 36. ListenSocket (builtin type) + 37. MutableArray (builtin type) + 38. MutableArray/ (6 terms) + 39. MutableByteArray (builtin type) + 40. MutableByteArray/ (14 terms) + 41. Nat (builtin type) + 42. Nat/ (28 terms) + 43. Optional (type) + 44. Optional/ (2 terms) + 45. Pattern (builtin type) + 46. Pattern/ (9 terms) + 47. Ref (builtin type) + 48. Ref/ (2 terms) + 49. Request (builtin type) + 50. RewriteCase (type) + 51. RewriteCase/ (1 term) + 52. RewriteSignature (type) + 53. RewriteSignature/ (1 term) + 54. RewriteTerm (type) + 55. RewriteTerm/ (1 term) + 56. Rewrites (type) + 57. Rewrites/ (1 term) + 58. Scope (builtin type) + 59. Scope/ (6 terms) + 60. SeqView (type) + 61. SeqView/ (2 terms) + 62. Socket/ (1 term) + 63. Test/ (2 terms, 1 type) + 64. Text (builtin type) + 65. Text/ (34 terms) + 66. ThreadId/ (1 term) + 67. Tuple (type) + 68. Tuple/ (1 term) + 69. UDPSocket (builtin type) + 70. Unit (type) + 71. Unit/ (1 term) + 72. Universal/ (7 terms) + 73. Value (builtin type) + 74. Value/ (5 terms) + 75. bug (a -> b) + 76. crypto/ (17 terms, 2 types) + 77. io2/ (146 terms, 32 types) + 78. metadata/ (2 terms) + 79. todo (a -> b) + 80. unsafe/ (1 term) ``` diff --git a/unison-src/transcripts/emptyCodebase.output.md b/unison-src/transcripts/emptyCodebase.output.md index 92ac8555c..672ac4857 100644 --- a/unison-src/transcripts/emptyCodebase.output.md +++ b/unison-src/transcripts/emptyCodebase.output.md @@ -23,7 +23,7 @@ Technically, the definitions all exist, but they have no names. `builtins.merge` .foo> ls - 1. builtin/ (456 terms, 71 types) + 1. builtin/ (469 terms, 74 types) ``` And for a limited time, you can get even more builtin goodies: @@ -35,7 +35,7 @@ And for a limited time, you can get even more builtin goodies: .foo> ls - 1. builtin/ (630 terms, 89 types) + 1. builtin/ (643 terms, 92 types) ``` More typically, you'd start out by pulling `base. diff --git a/unison-src/transcripts/fix2027.md b/unison-src/transcripts/fix2027.md index 665ee6f21..bcc082456 100644 --- a/unison-src/transcripts/fix2027.md +++ b/unison-src/transcripts/fix2027.md @@ -37,7 +37,7 @@ Exception.unsafeRun! e _ = socketSend s bytes = reraise (socketSend.impl s bytes) closeSocket s = reraise (closeSocket.impl s) -serverSocket host port = reraise (serverSocket.impl host port) +serverSocket host port = reraise (IO.serverSocket.impl host port) hello : Text -> Text -> {IO, Exception} () hello host port = diff --git a/unison-src/transcripts/fix2027.output.md b/unison-src/transcripts/fix2027.output.md index 84c996c64..b69a8b31b 100644 --- a/unison-src/transcripts/fix2027.output.md +++ b/unison-src/transcripts/fix2027.output.md @@ -33,7 +33,7 @@ Exception.unsafeRun! e _ = socketSend s bytes = reraise (socketSend.impl s bytes) closeSocket s = reraise (closeSocket.impl s) -serverSocket host port = reraise (serverSocket.impl host port) +serverSocket host port = reraise (IO.serverSocket.impl host port) hello : Text -> Text -> {IO, Exception} () hello host port = diff --git a/unison-src/transcripts/merges.output.md b/unison-src/transcripts/merges.output.md index fe9756736..73c8a3931 100644 --- a/unison-src/transcripts/merges.output.md +++ b/unison-src/transcripts/merges.output.md @@ -119,13 +119,13 @@ it's still in the `history` of the parent namespace and can be resurrected at an Note: The most recent namespace hash is immediately below this message. - ⊙ 1. #mqis95ft23 + ⊙ 1. #6j9omad7mv - Deletes: feature1.y - ⊙ 2. #5ro9c9692q + ⊙ 2. #59u4sdgodu + Adds / updates: @@ -136,26 +136,26 @@ it's still in the `history` of the parent namespace and can be resurrected at an Original name New name(s) feature1.y master.y - ⊙ 3. #da33td9rni + ⊙ 3. #0je96at36h + Adds / updates: feature1.y - ⊙ 4. #ks6rftepdv + ⊙ 4. #cnv4gjntbl > Moves: Original name New name x master.x - ⊙ 5. #dgcqc7jftr + ⊙ 5. #tp0bn8ulih + Adds / updates: x - □ 6. #ms344fdodl (start of history) + □ 6. #cujaete914 (start of history) ``` To resurrect an old version of a namespace, you can learn its hash via the `history` command, then use `fork #namespacehash .newname`. diff --git a/unison-src/transcripts/move-all.output.md b/unison-src/transcripts/move-all.output.md index a8ad0ece6..f5fefba06 100644 --- a/unison-src/transcripts/move-all.output.md +++ b/unison-src/transcripts/move-all.output.md @@ -80,7 +80,7 @@ Should be able to move the term, type, and namespace, including its types, terms 1. Bar (Nat) 2. Bar (type) 3. Bar/ (4 terms, 1 type) - 4. builtin/ (456 terms, 71 types) + 4. builtin/ (469 terms, 74 types) .> ls Bar @@ -145,7 +145,7 @@ bonk = 5 .z> ls - 1. builtin/ (456 terms, 71 types) + 1. builtin/ (469 terms, 74 types) 2. zonk (Nat) ``` @@ -188,7 +188,7 @@ bonk.zonk = 5 .a> ls - 1. builtin/ (456 terms, 71 types) + 1. builtin/ (469 terms, 74 types) 2. zonk/ (1 term) .a> view zonk.zonk diff --git a/unison-src/transcripts/move-namespace.output.md b/unison-src/transcripts/move-namespace.output.md index a86fd4c98..9b63baeb6 100644 --- a/unison-src/transcripts/move-namespace.output.md +++ b/unison-src/transcripts/move-namespace.output.md @@ -277,7 +277,7 @@ I should be able to move the root into a sub-namespace .> ls - 1. root/ (1373 terms, 214 types) + 1. root/ (1412 terms, 223 types) .> history @@ -286,22 +286,22 @@ I should be able to move the root into a sub-namespace - □ 1. #vrn80pdffk (start of history) + □ 1. #o7cku9c0t9 (start of history) ``` ```ucm .> ls .root.at.path - 1. existing/ (457 terms, 71 types) - 2. happy/ (459 terms, 72 types) - 3. history/ (457 terms, 71 types) + 1. existing/ (470 terms, 74 types) + 2. happy/ (472 terms, 75 types) + 3. history/ (470 terms, 74 types) .> history .root.at.path Note: The most recent namespace hash is immediately below this message. - ⊙ 1. #g3ri07hi09 + ⊙ 1. #fv72cqfto4 - Deletes: @@ -312,7 +312,7 @@ I should be able to move the root into a sub-namespace Original name New name existing.a.termInA existing.b.termInA - ⊙ 2. #ifjg1bj57v + ⊙ 2. #12iqsb3l9g + Adds / updates: @@ -324,26 +324,26 @@ I should be able to move the root into a sub-namespace happy.b.termInA existing.a.termInA history.b.termInA existing.a.termInA - ⊙ 3. #bdn8f7vhg1 + ⊙ 3. #r9jmgtco5u + Adds / updates: existing.a.termInA existing.b.termInB - ⊙ 4. #5dqmgnr0lt + ⊙ 4. #1k6kae1vn4 > Moves: Original name New name history.a.termInA history.b.termInA - ⊙ 5. #vd3d37rn3c + ⊙ 5. #ua9re7leg7 - Deletes: history.b.termInB - ⊙ 6. #gi32sh566a + ⊙ 6. #3k8ouql6cc + Adds / updates: @@ -354,13 +354,13 @@ I should be able to move the root into a sub-namespace Original name New name(s) happy.b.termInA history.a.termInA - ⊙ 7. #u2bs53f2hl + ⊙ 7. #fp2331i1ek + Adds / updates: history.a.termInA history.b.termInB - ⊙ 8. #48hsm89mgl + ⊙ 8. #5sj5jefgcu > Moves: @@ -370,7 +370,7 @@ I should be able to move the root into a sub-namespace happy.a.T.T2 happy.b.T.T2 happy.a.termInA happy.b.termInA - ⊙ 9. #pqd79g3q7l + ⊙ 9. #ell48pttus + Adds / updates: @@ -380,7 +380,7 @@ I should be able to move the root into a sub-namespace happy.a.T.T - ⊙ 10. #allrjqq7ga + ⊙ 10. #al8eguoh70 + Adds / updates: @@ -392,7 +392,7 @@ I should be able to move the root into a sub-namespace ⠇ - ⊙ 11. #ohd0a9rim1 + ⊙ 11. #okceqk39nf ``` @@ -414,26 +414,26 @@ I should be able to move a sub namespace _over_ the root. .> ls 1. b/ (3 terms, 1 type) - 2. builtin/ (456 terms, 71 types) + 2. builtin/ (469 terms, 74 types) .> history Note: The most recent namespace hash is immediately below this message. - ⊙ 1. #lf3m1s2e7i + ⊙ 1. #0rvi5q5une + Adds / updates: b.T b.T.T1 b.T.T2 b.termInA - ⊙ 2. #b1cg22v7s1 + ⊙ 2. #oaa8ltdusf - Deletes: a.T a.T.T1 a.T.T2 a.termInA - ⊙ 3. #r83v608ifd + ⊙ 3. #t1c91ou7ri + Adds / updates: @@ -443,13 +443,13 @@ I should be able to move a sub namespace _over_ the root. a.T.T - ⊙ 4. #pmm6a0f6fj + ⊙ 4. #hovh08jep4 + Adds / updates: a.T a.T.T a.termInA - □ 5. #nmcjvlnbk1 (start of history) + □ 5. #4bigcpnl7t (start of history) ``` ```ucm diff --git a/unison-src/transcripts/reflog.output.md b/unison-src/transcripts/reflog.output.md index de15d58cd..96e68114f 100644 --- a/unison-src/transcripts/reflog.output.md +++ b/unison-src/transcripts/reflog.output.md @@ -63,17 +63,17 @@ y = 2 most recent, along with the command that got us there. Try: `fork 2 .old` - `fork #mq4oqhiuuq .old` to make an old namespace + `fork #p611n6o5ve .old` to make an old namespace accessible again, - `reset-root #mq4oqhiuuq` to reset the root namespace and + `reset-root #p611n6o5ve` to reset the root namespace and its history to that of the specified namespace. When Root Hash Action - 1. now #1n5tjujeu7 add - 2. now #mq4oqhiuuq add - 3. now #nmcjvlnbk1 builtins.merge + 1. now #rmu2vgm86a add + 2. now #p611n6o5ve add + 3. now #4bigcpnl7t builtins.merge 4. #sg60bvjo91 history starts here Tip: Use `diff.namespace 1 7` to compare namespaces between diff --git a/unison-src/transcripts/reset.output.md b/unison-src/transcripts/reset.output.md index 8bd84f5f7..d4035c925 100644 --- a/unison-src/transcripts/reset.output.md +++ b/unison-src/transcripts/reset.output.md @@ -28,13 +28,13 @@ a = 5 Note: The most recent namespace hash is immediately below this message. - ⊙ 1. #0nv4t3770d + ⊙ 1. #d079vet1oj + Adds / updates: a - □ 2. #nmcjvlnbk1 (start of history) + □ 2. #4bigcpnl7t (start of history) .> reset 2 @@ -47,7 +47,7 @@ a = 5 - □ 1. #nmcjvlnbk1 (start of history) + □ 1. #4bigcpnl7t (start of history) ``` ```unison @@ -83,13 +83,13 @@ foo.a = 5 Note: The most recent namespace hash is immediately below this message. - ⊙ 1. #3s91aop8k9 + ⊙ 1. #tfg7r9359n + Adds / updates: foo.a - □ 2. #nmcjvlnbk1 (start of history) + □ 2. #4bigcpnl7t (start of history) .> reset 1 foo diff --git a/unison-src/transcripts/rsa.md b/unison-src/transcripts/rsa.md new file mode 100644 index 000000000..6b9ed33b5 --- /dev/null +++ b/unison-src/transcripts/rsa.md @@ -0,0 +1,37 @@ + +```ucm:hide +.> builtins.merge +``` + +```unison + +up = 0xs0123456789abcdef +down = 0xsfedcba9876543210 + +-- | Generated with: +-- openssl genrsa -out private_key.pem 1024 +-- openssl rsa -in private_key.pem -outform DER | xxd -p +secret = 0xs30820276020100300d06092a864886f70d0101010500048202603082025c02010002818100a7104b2f20725896076e629ccedbcd6907b16694c6e3d8768b5e0e685670b49616e796c588e5aafb92ef986c1a42c021fed0bdc99212c969cdab98087a0ee4c2f4acd4b6049a87a96afc45668329a3cf21a86fb13b488bbe9fefa1cd5a459014f0d0101378e9661e11b73acf54c8a91141ac90309e7fb6ed69b4e63230ab291502030100010281807cdc23a4fc3619d93f8293b728af848d0c0fdd603269d5bd7b99f760a9c22065d08693dbdcddf1f5863306133d694819e04d789aef4e95343b601507b8d9eac4492e6d7031b035c5d84eceaa9686b292712632d33b3303af84314d7920bc3d45f90d7818fc2587b129196d378ee4ed3e6b8d9010d504bb6470ff53e7c5fb17a1024100d67cbcf113d24325fcef12a778dc47c7060055290b68287649ef092558daccb61c4e7bc290740b75a29d4356dcbd66d18b0860dbff394cc8ff3d94d57617adbd024100c765d8261dd3d8e0d3caf11ab7b212eed181354215687ca6387283e4f0be16e79c8f298be0a70c7734dea78ea65128517d693cabfa4c0ff5328f2abb85d2023902403ca41dc347285e65c22251b2d9bfe5e7463217e1b7e0e5f7b3a58a7f6da4c6d60220ca6ad2ee8c42e10bf77afa83ee2af6551315800e52404db1ba7fb398b43d02410084877d85c0177933ddb12a554eb8edfa8b872c85d2c2d2ee8be019280696e19469ab81bab5c371f69d4e4be1f54b45d7fbda017870f1333e0eafb78051ee8689024061f694c12e934c44b7734f62d1b2a3d3624a4980e1b8e066d78dbabd2436654fbb9d9701425900daaafa1e031310e8a580520bb9e1c1288c669fce252bad1e65 + +-- | Generated with: +-- openssl rsa -in private_key.pem -outform DER -pubout | xxd -p +publicKey = 0xs30819f300d06092a864886f70d010101050003818d0030818902818100a7104b2f20725896076e629ccedbcd6907b16694c6e3d8768b5e0e685670b49616e796c588e5aafb92ef986c1a42c021fed0bdc99212c969cdab98087a0ee4c2f4acd4b6049a87a96afc45668329a3cf21a86fb13b488bbe9fefa1cd5a459014f0d0101378e9661e11b73acf54c8a91141ac90309e7fb6ed69b4e63230ab29150203010001 + +incorrectPublicKey = 0xs30819f300d06092a864886f70d010101050003818d0030818902818100a7104b2f20725896076e629ccedbcd6907b16694c6e3d8768b5e0e685670b49616e796c588e5aafb92ef986c1a42c021fed0bdc99212c969cdab98087a0ee4c2f4acd4b6049a87a96afc45668329a3cf21a86fb13b488bbe9fefa1cd5a459014f0d0101378e9661e11b73acf54c8a91141ac90309e7fb6ed69b4e63230ab29150203010002 + +message = up ++ down ++ up ++ down ++ down ++ up ++ down ++ up + +signature = crypto.Rsa.sign.impl secret message + +sigOkay = match signature with + Left err -> Left err + Right sg -> crypto.Rsa.verify.impl publicKey message sg + +sigKo = match signature with + Left err -> Left err + Right sg -> crypto.Rsa.verify.impl incorrectPublicKey message sg + +> signature +> sigOkay +> sigKo +``` diff --git a/unison-src/transcripts/rsa.output.md b/unison-src/transcripts/rsa.output.md new file mode 100644 index 000000000..b81a16bec --- /dev/null +++ b/unison-src/transcripts/rsa.output.md @@ -0,0 +1,70 @@ + +```unison +up = 0xs0123456789abcdef +down = 0xsfedcba9876543210 + +-- | Generated with: +-- openssl genrsa -out private_key.pem 1024 +-- openssl rsa -in private_key.pem -outform DER | xxd -p +secret = 0xs30820276020100300d06092a864886f70d0101010500048202603082025c02010002818100a7104b2f20725896076e629ccedbcd6907b16694c6e3d8768b5e0e685670b49616e796c588e5aafb92ef986c1a42c021fed0bdc99212c969cdab98087a0ee4c2f4acd4b6049a87a96afc45668329a3cf21a86fb13b488bbe9fefa1cd5a459014f0d0101378e9661e11b73acf54c8a91141ac90309e7fb6ed69b4e63230ab291502030100010281807cdc23a4fc3619d93f8293b728af848d0c0fdd603269d5bd7b99f760a9c22065d08693dbdcddf1f5863306133d694819e04d789aef4e95343b601507b8d9eac4492e6d7031b035c5d84eceaa9686b292712632d33b3303af84314d7920bc3d45f90d7818fc2587b129196d378ee4ed3e6b8d9010d504bb6470ff53e7c5fb17a1024100d67cbcf113d24325fcef12a778dc47c7060055290b68287649ef092558daccb61c4e7bc290740b75a29d4356dcbd66d18b0860dbff394cc8ff3d94d57617adbd024100c765d8261dd3d8e0d3caf11ab7b212eed181354215687ca6387283e4f0be16e79c8f298be0a70c7734dea78ea65128517d693cabfa4c0ff5328f2abb85d2023902403ca41dc347285e65c22251b2d9bfe5e7463217e1b7e0e5f7b3a58a7f6da4c6d60220ca6ad2ee8c42e10bf77afa83ee2af6551315800e52404db1ba7fb398b43d02410084877d85c0177933ddb12a554eb8edfa8b872c85d2c2d2ee8be019280696e19469ab81bab5c371f69d4e4be1f54b45d7fbda017870f1333e0eafb78051ee8689024061f694c12e934c44b7734f62d1b2a3d3624a4980e1b8e066d78dbabd2436654fbb9d9701425900daaafa1e031310e8a580520bb9e1c1288c669fce252bad1e65 + +-- | Generated with: +-- openssl rsa -in private_key.pem -outform DER -pubout | xxd -p +publicKey = 0xs30819f300d06092a864886f70d010101050003818d0030818902818100a7104b2f20725896076e629ccedbcd6907b16694c6e3d8768b5e0e685670b49616e796c588e5aafb92ef986c1a42c021fed0bdc99212c969cdab98087a0ee4c2f4acd4b6049a87a96afc45668329a3cf21a86fb13b488bbe9fefa1cd5a459014f0d0101378e9661e11b73acf54c8a91141ac90309e7fb6ed69b4e63230ab29150203010001 + +incorrectPublicKey = 0xs30819f300d06092a864886f70d010101050003818d0030818902818100a7104b2f20725896076e629ccedbcd6907b16694c6e3d8768b5e0e685670b49616e796c588e5aafb92ef986c1a42c021fed0bdc99212c969cdab98087a0ee4c2f4acd4b6049a87a96afc45668329a3cf21a86fb13b488bbe9fefa1cd5a459014f0d0101378e9661e11b73acf54c8a91141ac90309e7fb6ed69b4e63230ab29150203010002 + +message = up ++ down ++ up ++ down ++ down ++ up ++ down ++ up + +signature = crypto.Rsa.sign.impl secret message + +sigOkay = match signature with + Left err -> Left err + Right sg -> crypto.Rsa.verify.impl publicKey message sg + +sigKo = match signature with + Left err -> Left err + Right sg -> crypto.Rsa.verify.impl incorrectPublicKey message sg + +> signature +> sigOkay +> sigKo +``` + +```ucm + + Loading changes detected in scratch.u. + + I found and typechecked these definitions in scratch.u. If you + do an `add` or `update`, here's how your codebase would + change: + + ⍟ These new definitions are ok to `add`: + + down : Bytes + incorrectPublicKey : Bytes + message : Bytes + publicKey : Bytes + secret : Bytes + sigKo : Either Failure Boolean + sigOkay : Either Failure Boolean + signature : Either Failure Bytes + up : Bytes + + Now evaluating any watch expressions (lines starting with + `>`)... Ctrl+C cancels. + + 27 | > signature + ⧩ + Right + 0xs84b02b6bb0e1196b65378cb12b727f7b4b38e5979f0632e8a51cfab088827f6d3da4221788029f75a0a5f4d740372cfa590462888a1189bbd9de9b084f26116640e611af5a1a17229beec7fb2570887181bbdced8f0ebfec6cad6bdd318a616ba4f01c90e1436efe44b18417d18ce712a0763be834f8c76e0c39b2119b061373 + + 28 | > sigOkay + ⧩ + Right true + + 29 | > sigKo + ⧩ + Right false + +``` diff --git a/unison-src/transcripts/squash.output.md b/unison-src/transcripts/squash.output.md index 1adc03474..3698fdfe6 100644 --- a/unison-src/transcripts/squash.output.md +++ b/unison-src/transcripts/squash.output.md @@ -13,7 +13,7 @@ Let's look at some examples. We'll start with a namespace with just the builtins - □ 1. #3pq2vvggng (start of history) + □ 1. #i3vp9o9btm (start of history) .> fork builtin builtin2 @@ -42,21 +42,21 @@ Now suppose we `fork` a copy of builtin, then rename `Nat.+` to `frobnicate`, th Note: The most recent namespace hash is immediately below this message. - ⊙ 1. #4g884gq7lc + ⊙ 1. #tpkjb488ei > Moves: Original name New name Nat.frobnicate Nat.+ - ⊙ 2. #hnah4l7s0j + ⊙ 2. #334ak3epqt > Moves: Original name New name Nat.+ Nat.frobnicate - □ 3. #3pq2vvggng (start of history) + □ 3. #i3vp9o9btm (start of history) ``` If we merge that back into `builtin`, we get that same chain of history: @@ -73,21 +73,21 @@ If we merge that back into `builtin`, we get that same chain of history: Note: The most recent namespace hash is immediately below this message. - ⊙ 1. #4g884gq7lc + ⊙ 1. #tpkjb488ei > Moves: Original name New name Nat.frobnicate Nat.+ - ⊙ 2. #hnah4l7s0j + ⊙ 2. #334ak3epqt > Moves: Original name New name Nat.+ Nat.frobnicate - □ 3. #3pq2vvggng (start of history) + □ 3. #i3vp9o9btm (start of history) ``` Let's try again, but using a `merge.squash` (or just `squash`) instead. The history will be unchanged: @@ -108,7 +108,7 @@ Let's try again, but using a `merge.squash` (or just `squash`) instead. The hist - □ 1. #3pq2vvggng (start of history) + □ 1. #i3vp9o9btm (start of history) ``` The churn that happened in `mybuiltin` namespace ended up back in the same spot, so the squash merge of that namespace with our original namespace had no effect. @@ -493,13 +493,13 @@ This checks to see that squashing correctly preserves deletions: Note: The most recent namespace hash is immediately below this message. - ⊙ 1. #jdptkosbfp + ⊙ 1. #dv00hf6vmg - Deletes: Nat.* Nat.+ - □ 2. #3pq2vvggng (start of history) + □ 2. #i3vp9o9btm (start of history) ``` Notice that `Nat.+` and `Nat.*` are deleted by the squash, and we see them deleted in one atomic step in the history. diff --git a/unison-src/transcripts/upgrade-happy-path.output.md b/unison-src/transcripts/upgrade-happy-path.output.md index b627974ef..5e487a572 100644 --- a/unison-src/transcripts/upgrade-happy-path.output.md +++ b/unison-src/transcripts/upgrade-happy-path.output.md @@ -57,7 +57,7 @@ proj/main> upgrade old new proj/main> ls lib - 1. builtin/ (456 terms, 71 types) + 1. builtin/ (469 terms, 74 types) 2. new/ (1 term) proj/main> view thingy