From 040ef56c4239ceaad510d8427df32a3a3a28b11b Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Tue, 7 Apr 2020 18:34:08 +0200 Subject: [PATCH 01/50] Draft version constraint generation --- compiler/daml-lf-verify/BUILD.bazel | 41 ++++ compiler/daml-lf-verify/daml-lf-verify.cabal | 57 ++++++ .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 22 ++ .../src/DA/Daml/LF/Verify/Context.hs | 138 +++++++++++++ .../src/DA/Daml/LF/Verify/Generate.hs | 192 ++++++++++++++++++ .../src/DA/Daml/LF/Verify/Read.hs | 57 ++++++ .../src/DA/Daml/LF/Verify/Subst.hs | 35 ++++ 7 files changed, 542 insertions(+) create mode 100644 compiler/daml-lf-verify/BUILD.bazel create mode 100644 compiler/daml-lf-verify/daml-lf-verify.cabal create mode 100644 compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs create mode 100644 compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs create mode 100644 compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs create mode 100644 compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Read.hs create mode 100644 compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs diff --git a/compiler/daml-lf-verify/BUILD.bazel b/compiler/daml-lf-verify/BUILD.bazel new file mode 100644 index 000000000000..61e5dc126fbf --- /dev/null +++ b/compiler/daml-lf-verify/BUILD.bazel @@ -0,0 +1,41 @@ +# Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +load("//bazel_tools:haskell.bzl", "da_haskell_library") + +da_haskell_library( + name = "daml-lf-verify", + srcs = glob(["src/**/*.hs"]), + hackage_deps = [ + "aeson", + "base", + "bytestring", + "containers", + "deepseq", + "Decimal", + "extra", + "filepath", + "ghc-lib-parser", + "hashable", + "lens", + "mtl", + "optparse-applicative", + "recursion-schemes", + "safe", + "scientific", + "template-haskell", + "text", + "time", + "unordered-containers", + "zip-archive", + ], + src_strip_prefix = "src", + visibility = ["//visibility:public"], + deps = [ + "//compiler/daml-lf-ast", + "//compiler/daml-lf-tools", + "//compiler/daml-lf-proto", + "//compiler/daml-lf-reader", + "//libs-haskell/da-hs-base", + ], +) diff --git a/compiler/daml-lf-verify/daml-lf-verify.cabal b/compiler/daml-lf-verify/daml-lf-verify.cabal new file mode 100644 index 000000000000..c8a99662c8ac --- /dev/null +++ b/compiler/daml-lf-verify/daml-lf-verify.cabal @@ -0,0 +1,57 @@ +cabal-version: 2.4 +name: daml-lf-verify +build-type: Simple +version: 0.1.0 +synopsis: DAML-LF Verification +license: Apache-2.0 +author: Digital Asset +maintainer: Digital Asset +copyright: Digital Asset 2020 +homepage: https://github.com/digital-asset/daml#readme +bug-reports: https://github.com/digital-asset/daml/issues + +source-repository head + type: git + location: https://github.com/digital-asset/daml.git + +library + default-language: Haskell2010 + hs-source-dirs: src + build-depends: + base, + containers, + da-hs-base, + daml-lf-ast, + deepseq, + extra, + hashable, + lens, + mtl, + recursion-schemes, + safe, + scientific, + template-haskell, + text, + time, + unordered-containers + exposed-modules: + DA.Daml.LF.Verify + DA.Daml.LF.Verify.Generate + default-extensions: + BangPatterns + DeriveDataTypeable + DeriveFoldable + DeriveFunctor + DeriveGeneric + DeriveTraversable + FlexibleContexts + GeneralizedNewtypeDeriving + LambdaCase + NamedFieldPuns + PackageImports + OverloadedStrings + RecordWildCards + ScopedTypeVariables + StandaloneDeriving + TypeApplications + ViewPatterns diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs new file mode 100644 index 000000000000..f96553e2c2de --- /dev/null +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -0,0 +1,22 @@ +-- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + +-- | Static verification of DAML packages. +module DA.Daml.LF.Verify + ( module LF + , main + ) where + +import Options.Applicative + +import DA.Daml.LF.Verify.Generate as LF +import DA.Daml.LF.Verify.Read as LF +import DA.Daml.LF.Verify.Context as LF + +main :: IO () +main = do + Options{..} <- execParser optionsParserInfo + pkgs <- readPackages optInputDars + let _delta = runDelta $ genPackages pkgs + putStrLn "Constraints generated." + diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs new file mode 100644 index 000000000000..14adf2c2312d --- /dev/null +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -0,0 +1,138 @@ +-- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + +{-# LANGUAGE ConstraintKinds #-} +{-# LANGUAGE RankNTypes #-} +{-# LANGUAGE TemplateHaskell #-} + +-- | Contexts for DAML LF static verification +module DA.Daml.LF.Verify.Context + ( Delta + , MonadDelta, devars, devals + , UpdateSet(..) + , UpdCreate(..), usCre, usArc, usCho + , UpdArchive(..) + , UpdChoice(..) + , runDelta + , emptyDelta + , introDelta, extVarDelta + , lookupDExprVar, lookupDVal, lookupDChoice + , concatDelta + , emptyUpdateSet + , concatUpdateSet + ) where + +import Control.Lens hiding (Context) +import Control.Monad.Error.Class (MonadError (..)) +import Control.Monad.Reader +import Data.HashMap.Strict (HashMap, union, empty) + +import DA.Daml.LF.Ast +import DA.Daml.LF.TypeChecker.Error + +data UpdCreate = UpdCreate + { _creTemp :: !(Qualified TypeConName) + -- ^ Qualified type constructor corresponding to the contract template. + , _creField :: ![(FieldName, Expr)] + -- ^ The fields to be verified, together with their value. + } +data UpdArchive = UpdArchive + { _arcTemp :: !(Qualified TypeConName) + -- ^ Qualified type constructor corresponding to the contract template. + , _arcField :: ![(FieldName, Expr)] + -- ^ The fields to be verified, together with their value. + } +data UpdChoice = UpdChoice + { _choTemp :: !(Qualified TypeConName) + -- ^ Qualified type constructor corresponding to the contract template. + , _choName :: !ChoiceName + -- ^ The name of the choice. + } + +-- | The List of updates being performed +data UpdateSet = UpdateSet + { _usCre :: ![UpdCreate] + -- ^ The list of create updates. + , _usArc :: ![UpdArchive] + -- ^ The list of archive updates. + , _usCho :: ![UpdChoice] + -- ^ The list of choice updates. + } + +makeLenses ''UpdateSet + +emptyUpdateSet :: UpdateSet +emptyUpdateSet = UpdateSet [] [] [] + +concatUpdateSet :: UpdateSet -> UpdateSet -> UpdateSet +concatUpdateSet (UpdateSet cres1 arcs1 chos1) (UpdateSet cres2 arcs2 chos2) = + UpdateSet (cres1 ++ cres2) (arcs1 ++ arcs2) (chos1 ++ chos2) + +-- | The environment for the DAML-LF verifier +data Delta = Delta + { _devars :: ![ExprVarName] + -- ^ The skolemised term variables. + , _devals :: !(HashMap (Qualified ExprValName) (Expr, UpdateSet)) + -- ^ The bound values. + , _dchs :: !(HashMap ((Qualified TypeConName), ChoiceName) UpdateSet) + -- ^ The set of relevant choices. + -- TODO: split this off into data types for readability? + } + +makeLenses ''Delta + +emptyDelta :: Delta +emptyDelta = Delta [] empty empty + +concatDelta :: Delta -> Delta -> Delta +concatDelta (Delta vars1 vals1 chs1) (Delta vars2 vals2 chs2) = + Delta (vars1 ++ vars2) (union vals1 vals2) (union chs1 chs2) + -- TODO: union makes me slightly nervous, as it allows overlapping keys + -- (and just uses the first) + +-- | Type class constraint with the required monadic effects for functions +-- manipulating the verification environment. +type MonadDelta m = (MonadError Error m, MonadReader Delta m) + +runDelta :: ReaderT Delta (Either Error) a -> Either Error a +runDelta act = runReaderT act emptyDelta + +-- | Run a computation in the current environment, with an additional +-- environment extension. +introDelta :: MonadDelta m => Delta -> m a -> m a +introDelta delta = local (concatDelta delta) + +extVarDelta :: MonadDelta m => ExprVarName -> m a -> m a +extVarDelta x = local (over devars ((:) x)) + +lookupDExprVar :: MonadDelta m => ExprVarName -> m () +lookupDExprVar x = ask >>= \ del -> unless (elem x $ del ^. devars) + $ throwError $ EUnknownExprVar x + +lookupDVal :: MonadDelta m => (Qualified ExprValName) -> m (Expr, UpdateSet) +lookupDVal w = view (devals . at w) >>= match _Just (EEmptyCase) +-- TODO: This is a random error. The thing we really want to write is: +-- lookupDVal w = view (devals . at w) >>= match _Just (EUnknownDefinition $ LEValue w) +-- The issue here is that our values are currently stored in Delta instead +-- of in the world like in the type checker. +-- This means that we can't throw the error we want to throw here. +-- 2 options: +-- + either define our own errors, as they don't correspond 100% to the type +-- checking errors anyway. +-- + or create our own world environment to store values. This also makes +-- sense as these values work similar to how they work in the type checker, +-- except that we need to store a partially evaluated definition as well. +-- Both approaches make sense, but both imply a lot of code duplication, so they +-- don't sound that enticing... + +lookupDChoice :: MonadDelta m => (Qualified TypeConName) -> ChoiceName + -> m UpdateSet +lookupDChoice tem ch = view (dchs . at (tem, ch)) >>= match _Just EEmptyCase +-- TODO: Random error. + +-- | Helper functions mirrored from Env. +-- TODO: Reduce duplication by abstracting over MonadGamma and MonadDelta? +match :: MonadDelta m => Prism' a b -> Error -> a -> m b +match p e x = either (const (throwError e)) pure (matching p x) +-- TODO: no context, like in Gamma + diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs new file mode 100644 index 000000000000..b00fbcf999d9 --- /dev/null +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -0,0 +1,192 @@ +-- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + +{-# LANGUAGE TemplateHaskell #-} + +-- | Constraint generator for DAML LF static verification +module DA.Daml.LF.Verify.Generate + ( genPackages + , genChoice -- Added export to suppress the unused warning. + ) where + +import Control.Lens hiding (Context) +import Control.Monad.Error.Class (MonadError (..)) +import Data.HashMap.Strict (singleton) +import Control.Monad.Reader +import qualified Data.NameMap as NM + +import DA.Daml.LF.Ast +import DA.Daml.LF.Verify.Context +import DA.Daml.LF.Verify.Subst +import DA.Daml.LF.TypeChecker.Error + +data GenOutput = GenOutput + { _goExp :: Expr + -- ^ The expression, evaluated as far as possible. + , _goUpd :: UpdateSet + -- ^ The updates, performed by this expression. + , _goDel :: Delta + -- ^ The context extension, made by this expression. + } + +makeLenses ''GenOutput + +-- | Extend a generator output with the updates and the context extensions of a +-- second generator output. Note that the end result will contain the first +-- expression. +combineGO :: GenOutput -> GenOutput + -- ^ The two generator outputs to combine. + -> GenOutput +combineGO genOut1 genOut2 + = extendGOUpds (genOut2 ^. goUpd) + $ extendGODelta (genOut2 ^. goDel) + genOut1 + +updateGOExpr :: Expr + -- ^ The new output expression. + -> GenOutput + -- ^ The current generator output. + -> GenOutput +updateGOExpr expr = set goExp expr + +extendGOUpds :: UpdateSet + -- ^ The extension of the update set. + -> GenOutput + -- ^ The current generator output. + -> GenOutput +extendGOUpds upds = over goUpd (concatUpdateSet upds) + +extendGODelta :: Delta + -- ^ The additional context extension. + -> GenOutput + -- ^ The current generator output. + -> GenOutput +extendGODelta delta = over goDel (concatDelta delta) + +genPackages :: MonadDelta m => [(PackageId, (Package, Maybe PackageName))] + -> m Delta +genPackages inp = ask >>= \del0 -> foldM genPackage' del0 inp + where + -- TODO: These prime definitions are bit silly. Merge with the regular + -- functions. + -- TODO: This >>= return . concatDelta returns a lot. Figure out a way to + -- abstract over it. Same for this returning foldM. + genPackage' :: MonadDelta m => Delta + -> (PackageId, (Package, Maybe PackageName)) -> m Delta + genPackage' deli (idi, (paci, _)) = + -- TODO: This is getting quite unreadable. + foldM (\deli' modi -> genModule' deli' (PRImport idi, modi)) + deli (NM.toList $ packageModules paci) + >>= return . (concatDelta deli) + genModule' :: MonadDelta m => Delta -> (PackageRef, Module) -> m Delta + genModule' deli (paci, modi) = introDelta deli (genModule paci modi) + >>= return . (concatDelta deli) + +-- TODO: Type synonyms and data types are ignored for now. +genModule :: MonadDelta m => PackageRef -> Module -> m Delta +genModule pac mod = do + del0 <- ask + del1 <- foldM genValue' del0 (NM.toList $ moduleValues mod) + del2 <- foldM genTemplate' del1 (NM.toList $ moduleTemplates mod) + return $ concatDelta del1 del2 + where + genValue' :: MonadDelta m => Delta -> DefValue -> m Delta + genValue' deli vali = introDelta deli (genValue pac (moduleName mod) vali) + >>= return . (concatDelta deli) + genTemplate' :: MonadDelta m => Delta -> Template -> m Delta + genTemplate' deli temi = introDelta deli (genTemplate temi) + >>= return . (concatDelta deli) + +genValue :: MonadDelta m => PackageRef -> ModuleName -> DefValue -> m Delta +genValue pac mod val = do + expOut <- genExpr (dvalBody val) + let qname = Qualified pac mod (fst $ dvalBinder val) + return $ set devals (singleton qname (expOut ^. goExp, expOut ^. goUpd)) emptyDelta + +-- TODO: Handle annotated choices, by returning a set of annotations. +genChoice :: MonadDelta m => (Qualified TypeConName) -> TemplateChoice + -> m GenOutput +genChoice tem cho = do + expOut <- extVarDelta (fst $ chcArgBinder cho) $ genExpr (chcUpdate cho) + let updSet = if chcConsuming cho + -- TODO: Convert the `ExprVarName`s to `FieldName`s + then over usArc ((:) (UpdArchive tem [])) (expOut ^. goUpd) + else expOut ^. goUpd + return $ set goUpd updSet + $ over (goDel . devars) ((:) (fst $ chcArgBinder cho)) + expOut + +genTemplate :: MonadDelta m => Template -> m Delta +genTemplate = undefined -- TODO + +genExpr :: MonadDelta m => Expr -> m GenOutput +genExpr = \case + ETmApp fun arg -> genForTmApp fun arg + ETyApp expr typ -> genForTyApp expr typ + EVar name -> genForVar name + EVal w -> genForVal w + EUpdate (UCreate tem arg) -> genForCreate tem arg + EUpdate (UExercise tem ch cid par arg) -> genForExercise tem ch cid par arg + _ -> error "Not implemented" + +genForTmApp :: MonadDelta m => Expr -> Expr -> m GenOutput +genForTmApp fun arg = do + funOut <- genExpr fun + argOut <- genExpr arg + case funOut ^. goExp of + ETmLam bndr body -> do + let updDelta = concatDelta (funOut ^. goDel) (argOut ^. goDel) + subst = singleExprSubst (fst bndr) (argOut ^. goExp) + resExpr = substituteTmTm subst body + resOut <- introDelta updDelta $ genExpr resExpr + return $ combineGO resOut + $ combineGO funOut argOut + fun' -> return $ updateGOExpr (ETmApp fun' (argOut ^. goExp)) + $ combineGO funOut argOut + +genForTyApp :: MonadDelta m => Expr -> Type -> m GenOutput +genForTyApp expr typ = do + exprOut <- genExpr expr + case exprOut ^. goExp of + ETyLam bndr body -> do + let subst = singleTypeSubst (fst bndr) typ + resExpr = substituteTyTm subst body + resOut <- introDelta (exprOut ^. goDel) $ genExpr resExpr + return $ combineGO resOut exprOut + expr' -> return $ updateGOExpr (ETyApp expr' typ) exprOut + +genForVar :: MonadDelta m => ExprVarName -> m GenOutput +genForVar name = lookupDExprVar name + >> return (GenOutput (EVar name) emptyUpdateSet emptyDelta) + +genForVal :: MonadDelta m => (Qualified ExprValName) -> m GenOutput +genForVal w = lookupDVal w + >>= \ (expr, upds) -> return (GenOutput expr upds emptyDelta) + +genForCreate :: MonadDelta m => (Qualified TypeConName) -> Expr -> m GenOutput +genForCreate tem arg = do + argOut <- genExpr arg + case argOut ^. goExp of + argExpr@(ERecCon _ fs) -> return (GenOutput (EUpdate (UCreate tem argExpr)) + -- TODO: We could potentially filter here + -- to only store the interesting fields? + (set usCre [UpdCreate tem fs] emptyUpdateSet) + (argOut ^. goDel)) + _ -> throwError EEnumTypeWithParams + -- TODO: This is a random error, as we do not have access to the expected + -- type, which we need to constructed the error we really want. + -- Perhaps we do need to define our own set of errors. + -- _ -> throwError (EExpectedRecordType ty) + +genForExercise :: MonadDelta m => (Qualified TypeConName) -> ChoiceName + -> Expr -> Maybe Expr -> Expr + -> m GenOutput +genForExercise tem ch cid par arg = do + cidOut <- genExpr cid + argOut <- genExpr arg + -- TODO: Take possibility into account that the choice is not found? + updSet <- lookupDChoice tem ch + return (GenOutput (EUpdate (UExercise tem ch (cidOut ^. goExp) par (argOut ^. goExp))) + updSet + (concatDelta (cidOut ^. goDel) (argOut ^. goDel))) + diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Read.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Read.hs new file mode 100644 index 000000000000..12c3eeed556c --- /dev/null +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Read.hs @@ -0,0 +1,57 @@ + +-- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + +-- TODO: There is a lot of copying going on here from TsCodeGenMain.hs. +-- A nicer alternative would be to just change the exports from this module. + +-- | Reading dar files for DAML LF verification. +module DA.Daml.LF.Verify.Read + ( readPackages + , optionsParserInfo + , Options(..) + ) where + +import qualified DA.Daml.LF.Proto3.Archive as Archive +import qualified DA.Daml.LF.Reader as DAR +import qualified Data.ByteString as B +import qualified Data.ByteString.Lazy as BSL +import qualified Data.Text.Extended as T +import qualified "zip-archive" Codec.Archive.Zip as Zip +import Control.Monad.Extra +import Options.Applicative + +import DA.Daml.LF.Ast + +data Options = Options + { optInputDars :: [FilePath] + } + +optionsParser :: Parser Options +optionsParser = Options + <$> some ( argument str + ( metavar "DAR-FILES" + <> help "DAR files to analyse" + ) ) + +optionsParserInfo :: ParserInfo Options +optionsParserInfo = info (optionsParser <**> helper) + ( fullDesc + <> progDesc "Perform static analysis on a DAR" + ) + +-- Build a list of packages from a list of DAR file paths. +readPackages :: [FilePath] -> IO [(PackageId, (Package, Maybe PackageName))] +readPackages dars = concatMapM darToPackages dars + where + darToPackages :: FilePath -> IO [(PackageId, (Package, Maybe PackageName))] + darToPackages dar = do + dar <- B.readFile dar + let archive = Zip.toArchive $ BSL.fromStrict dar + dalfs <- either fail pure $ DAR.readDalfs archive + DAR.DalfManifest{packageName} <- either fail pure $ DAR.readDalfManifest archive + packageName <- pure (PackageName . T.pack <$> packageName) + forM ((DAR.mainDalf dalfs, packageName) : map (, Nothing) (DAR.dalfs dalfs)) $ + \(dalf, mbPkgName) -> do + (pkgId, pkg) <- either (fail . show) pure $ Archive.decodeArchive Archive.DecodeAsMain (BSL.toStrict dalf) + pure (pkgId, (pkg, mbPkgName)) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs new file mode 100644 index 000000000000..9fbcf3a537f7 --- /dev/null +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs @@ -0,0 +1,35 @@ +-- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + +-- | Term substitions for DAML LF static verification +module DA.Daml.LF.Verify.Subst + ( ExprSubst + , singleExprSubst + , singleTypeSubst + , substituteTmTm + , substituteTyTm + ) where + +import qualified Data.Map.Strict as Map +import DA.Daml.LF.Ast + +-- | Substitution of expressions for expression variables. +type ExprSubst = Map.Map ExprVarName Expr +-- TODO: This already exists. remove duplication? +-- | Substitution of types for type variables. +type TypeSubst = Map.Map TypeVarName Type + +singleExprSubst :: ExprVarName -> Expr -> ExprSubst +singleExprSubst = Map.singleton + +singleTypeSubst :: TypeVarName -> Type -> TypeSubst +singleTypeSubst = Map.singleton + +-- | Apply an expression substitution to an expression. +substituteTmTm :: ExprSubst -> Expr -> Expr +substituteTmTm = undefined -- TODO + +-- | Apply a type substitution to an expression. +substituteTyTm :: TypeSubst -> Expr -> Expr +substituteTyTm = undefined -- TODO + From 020550781acc44d1a006efd641e96a58eadb38bd Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Wed, 8 Apr 2020 09:44:18 +0200 Subject: [PATCH 02/50] Some code cleanup --- compiler/daml-lf-verify/daml-lf-verify.cabal | 57 ------------- .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 11 +-- .../src/DA/Daml/LF/Verify/Context.hs | 21 +++-- .../src/DA/Daml/LF/Verify/Generate.hs | 84 ++++++++----------- 4 files changed, 54 insertions(+), 119 deletions(-) delete mode 100644 compiler/daml-lf-verify/daml-lf-verify.cabal diff --git a/compiler/daml-lf-verify/daml-lf-verify.cabal b/compiler/daml-lf-verify/daml-lf-verify.cabal deleted file mode 100644 index c8a99662c8ac..000000000000 --- a/compiler/daml-lf-verify/daml-lf-verify.cabal +++ /dev/null @@ -1,57 +0,0 @@ -cabal-version: 2.4 -name: daml-lf-verify -build-type: Simple -version: 0.1.0 -synopsis: DAML-LF Verification -license: Apache-2.0 -author: Digital Asset -maintainer: Digital Asset -copyright: Digital Asset 2020 -homepage: https://github.com/digital-asset/daml#readme -bug-reports: https://github.com/digital-asset/daml/issues - -source-repository head - type: git - location: https://github.com/digital-asset/daml.git - -library - default-language: Haskell2010 - hs-source-dirs: src - build-depends: - base, - containers, - da-hs-base, - daml-lf-ast, - deepseq, - extra, - hashable, - lens, - mtl, - recursion-schemes, - safe, - scientific, - template-haskell, - text, - time, - unordered-containers - exposed-modules: - DA.Daml.LF.Verify - DA.Daml.LF.Verify.Generate - default-extensions: - BangPatterns - DeriveDataTypeable - DeriveFoldable - DeriveFunctor - DeriveGeneric - DeriveTraversable - FlexibleContexts - GeneralizedNewtypeDeriving - LambdaCase - NamedFieldPuns - PackageImports - OverloadedStrings - RecordWildCards - ScopedTypeVariables - StandaloneDeriving - TypeApplications - ViewPatterns diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index f96553e2c2de..8bbdb78061fa 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -2,16 +2,13 @@ -- SPDX-License-Identifier: Apache-2.0 -- | Static verification of DAML packages. -module DA.Daml.LF.Verify - ( module LF - , main - ) where +module DA.Daml.LF.Verify ( main ) where import Options.Applicative -import DA.Daml.LF.Verify.Generate as LF -import DA.Daml.LF.Verify.Read as LF -import DA.Daml.LF.Verify.Context as LF +import DA.Daml.LF.Verify.Generate +import DA.Daml.LF.Verify.Read +import DA.Daml.LF.Verify.Context main :: IO () main = do diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 14adf2c2312d..5a9c8bc72ef5 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -8,13 +8,13 @@ -- | Contexts for DAML LF static verification module DA.Daml.LF.Verify.Context ( Delta - , MonadDelta, devars, devals + , MonadDelta, devars, _devals , UpdateSet(..) , UpdCreate(..), usCre, usArc, usCho , UpdArchive(..) , UpdChoice(..) , runDelta - , emptyDelta + , emptyDelta, setDelta , introDelta, extVarDelta , lookupDExprVar, lookupDVal, lookupDChoice , concatDelta @@ -74,7 +74,7 @@ data Delta = Delta -- ^ The skolemised term variables. , _devals :: !(HashMap (Qualified ExprValName) (Expr, UpdateSet)) -- ^ The bound values. - , _dchs :: !(HashMap ((Qualified TypeConName), ChoiceName) UpdateSet) + , _dchs :: !(HashMap (Qualified TypeConName, ChoiceName) UpdateSet) -- ^ The set of relevant choices. -- TODO: split this off into data types for readability? } @@ -86,7 +86,7 @@ emptyDelta = Delta [] empty empty concatDelta :: Delta -> Delta -> Delta concatDelta (Delta vars1 vals1 chs1) (Delta vars2 vals2 chs2) = - Delta (vars1 ++ vars2) (union vals1 vals2) (union chs1 chs2) + Delta (vars1 ++ vars2) (vals1 `union` vals2) (chs1 `union` chs2) -- TODO: union makes me slightly nervous, as it allows overlapping keys -- (and just uses the first) @@ -102,15 +102,20 @@ runDelta act = runReaderT act emptyDelta introDelta :: MonadDelta m => Delta -> m a -> m a introDelta delta = local (concatDelta delta) +-- TODO: This is a bit strange in a reader monad. +-- Figure out a way to extend, instead of overwrite every time. +setDelta :: MonadDelta m => Delta -> m a -> m a +setDelta delta = local (const delta) + extVarDelta :: MonadDelta m => ExprVarName -> m a -> m a extVarDelta x = local (over devars ((:) x)) lookupDExprVar :: MonadDelta m => ExprVarName -> m () -lookupDExprVar x = ask >>= \ del -> unless (elem x $ del ^. devars) +lookupDExprVar x = ask >>= \ del -> unless (elem x $ _devars del) $ throwError $ EUnknownExprVar x -lookupDVal :: MonadDelta m => (Qualified ExprValName) -> m (Expr, UpdateSet) -lookupDVal w = view (devals . at w) >>= match _Just (EEmptyCase) +lookupDVal :: MonadDelta m => Qualified ExprValName -> m (Expr, UpdateSet) +lookupDVal w = view (devals . at w) >>= match _Just EEmptyCase -- TODO: This is a random error. The thing we really want to write is: -- lookupDVal w = view (devals . at w) >>= match _Just (EUnknownDefinition $ LEValue w) -- The issue here is that our values are currently stored in Delta instead @@ -125,7 +130,7 @@ lookupDVal w = view (devals . at w) >>= match _Just (EEmptyCase) -- Both approaches make sense, but both imply a lot of code duplication, so they -- don't sound that enticing... -lookupDChoice :: MonadDelta m => (Qualified TypeConName) -> ChoiceName +lookupDChoice :: MonadDelta m => Qualified TypeConName -> ChoiceName -> m UpdateSet lookupDChoice tem ch = view (dchs . at (tem, ch)) >>= match _Just EEmptyCase -- TODO: Random error. diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index b00fbcf999d9..44c3fe369883 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -38,8 +38,8 @@ combineGO :: GenOutput -> GenOutput -- ^ The two generator outputs to combine. -> GenOutput combineGO genOut1 genOut2 - = extendGOUpds (genOut2 ^. goUpd) - $ extendGODelta (genOut2 ^. goDel) + = extendGOUpds (_goUpd genOut2) + $ extendGODelta (_goDel genOut2) genOut1 updateGOExpr :: Expr @@ -63,55 +63,45 @@ extendGODelta :: Delta -> GenOutput extendGODelta delta = over goDel (concatDelta delta) -genPackages :: MonadDelta m => [(PackageId, (Package, Maybe PackageName))] - -> m Delta -genPackages inp = ask >>= \del0 -> foldM genPackage' del0 inp +-- | Builds up the Delta environment by recursively extending the environment +-- for each computation, and combining the output environments. +buildDelta :: MonadDelta m => Delta -> (a -> m Delta) -> [a] -> m Delta +buildDelta del op args = foldM step del args where - -- TODO: These prime definitions are bit silly. Merge with the regular - -- functions. - -- TODO: This >>= return . concatDelta returns a lot. Figure out a way to - -- abstract over it. Same for this returning foldM. - genPackage' :: MonadDelta m => Delta - -> (PackageId, (Package, Maybe PackageName)) -> m Delta - genPackage' deli (idi, (paci, _)) = - -- TODO: This is getting quite unreadable. - foldM (\deli' modi -> genModule' deli' (PRImport idi, modi)) - deli (NM.toList $ packageModules paci) - >>= return . (concatDelta deli) - genModule' :: MonadDelta m => Delta -> (PackageRef, Module) -> m Delta - genModule' deli (paci, modi) = introDelta deli (genModule paci modi) - >>= return . (concatDelta deli) + step d x = concatDelta d <$> setDelta d (op x) + +genPackages :: MonadDelta m => [(PackageId, (Package, Maybe PackageName))] -> m Delta +genPackages inp = do + del0 <- ask + buildDelta del0 genPackage inp + +genPackage :: MonadDelta m => (PackageId, (Package, Maybe PackageName)) -> m Delta +genPackage (id, (pac, _)) = do + del0 <- ask + buildDelta del0 (genModule (PRImport id)) (NM.toList $ packageModules pac) -- TODO: Type synonyms and data types are ignored for now. genModule :: MonadDelta m => PackageRef -> Module -> m Delta genModule pac mod = do del0 <- ask - del1 <- foldM genValue' del0 (NM.toList $ moduleValues mod) - del2 <- foldM genTemplate' del1 (NM.toList $ moduleTemplates mod) - return $ concatDelta del1 del2 - where - genValue' :: MonadDelta m => Delta -> DefValue -> m Delta - genValue' deli vali = introDelta deli (genValue pac (moduleName mod) vali) - >>= return . (concatDelta deli) - genTemplate' :: MonadDelta m => Delta -> Template -> m Delta - genTemplate' deli temi = introDelta deli (genTemplate temi) - >>= return . (concatDelta deli) + del1 <- buildDelta del0 (genValue pac (moduleName mod)) (NM.toList $ moduleValues mod) + buildDelta del1 genTemplate (NM.toList $ moduleTemplates mod) genValue :: MonadDelta m => PackageRef -> ModuleName -> DefValue -> m Delta genValue pac mod val = do expOut <- genExpr (dvalBody val) let qname = Qualified pac mod (fst $ dvalBinder val) - return $ set devals (singleton qname (expOut ^. goExp, expOut ^. goUpd)) emptyDelta + return emptyDelta{_devals = singleton qname (_goExp expOut, _goUpd expOut)} -- TODO: Handle annotated choices, by returning a set of annotations. -genChoice :: MonadDelta m => (Qualified TypeConName) -> TemplateChoice +genChoice :: MonadDelta m => Qualified TypeConName -> TemplateChoice -> m GenOutput genChoice tem cho = do expOut <- extVarDelta (fst $ chcArgBinder cho) $ genExpr (chcUpdate cho) let updSet = if chcConsuming cho -- TODO: Convert the `ExprVarName`s to `FieldName`s - then over usArc ((:) (UpdArchive tem [])) (expOut ^. goUpd) - else expOut ^. goUpd + then over usArc ((:) (UpdArchive tem [])) (_goUpd expOut) + else _goUpd expOut return $ set goUpd updSet $ over (goDel . devars) ((:) (fst $ chcArgBinder cho)) expOut @@ -133,25 +123,25 @@ genForTmApp :: MonadDelta m => Expr -> Expr -> m GenOutput genForTmApp fun arg = do funOut <- genExpr fun argOut <- genExpr arg - case funOut ^. goExp of + case _goExp funOut of ETmLam bndr body -> do - let updDelta = concatDelta (funOut ^. goDel) (argOut ^. goDel) - subst = singleExprSubst (fst bndr) (argOut ^. goExp) + let updDelta = concatDelta (_goDel funOut) (_goDel argOut) + subst = singleExprSubst (fst bndr) (_goExp argOut) resExpr = substituteTmTm subst body resOut <- introDelta updDelta $ genExpr resExpr return $ combineGO resOut $ combineGO funOut argOut - fun' -> return $ updateGOExpr (ETmApp fun' (argOut ^. goExp)) + fun' -> return $ updateGOExpr (ETmApp fun' (_goExp argOut)) $ combineGO funOut argOut genForTyApp :: MonadDelta m => Expr -> Type -> m GenOutput genForTyApp expr typ = do exprOut <- genExpr expr - case exprOut ^. goExp of + case _goExp exprOut of ETyLam bndr body -> do let subst = singleTypeSubst (fst bndr) typ resExpr = substituteTyTm subst body - resOut <- introDelta (exprOut ^. goDel) $ genExpr resExpr + resOut <- introDelta (_goDel exprOut) $ genExpr resExpr return $ combineGO resOut exprOut expr' -> return $ updateGOExpr (ETyApp expr' typ) exprOut @@ -159,26 +149,26 @@ genForVar :: MonadDelta m => ExprVarName -> m GenOutput genForVar name = lookupDExprVar name >> return (GenOutput (EVar name) emptyUpdateSet emptyDelta) -genForVal :: MonadDelta m => (Qualified ExprValName) -> m GenOutput +genForVal :: MonadDelta m => Qualified ExprValName -> m GenOutput genForVal w = lookupDVal w >>= \ (expr, upds) -> return (GenOutput expr upds emptyDelta) -genForCreate :: MonadDelta m => (Qualified TypeConName) -> Expr -> m GenOutput +genForCreate :: MonadDelta m => Qualified TypeConName -> Expr -> m GenOutput genForCreate tem arg = do argOut <- genExpr arg - case argOut ^. goExp of + case _goExp argOut of argExpr@(ERecCon _ fs) -> return (GenOutput (EUpdate (UCreate tem argExpr)) -- TODO: We could potentially filter here -- to only store the interesting fields? - (set usCre [UpdCreate tem fs] emptyUpdateSet) - (argOut ^. goDel)) + emptyUpdateSet{_usCre = [UpdCreate tem fs]} + (_goDel argOut)) _ -> throwError EEnumTypeWithParams -- TODO: This is a random error, as we do not have access to the expected -- type, which we need to constructed the error we really want. -- Perhaps we do need to define our own set of errors. -- _ -> throwError (EExpectedRecordType ty) -genForExercise :: MonadDelta m => (Qualified TypeConName) -> ChoiceName +genForExercise :: MonadDelta m => Qualified TypeConName -> ChoiceName -> Expr -> Maybe Expr -> Expr -> m GenOutput genForExercise tem ch cid par arg = do @@ -186,7 +176,7 @@ genForExercise tem ch cid par arg = do argOut <- genExpr arg -- TODO: Take possibility into account that the choice is not found? updSet <- lookupDChoice tem ch - return (GenOutput (EUpdate (UExercise tem ch (cidOut ^. goExp) par (argOut ^. goExp))) + return (GenOutput (EUpdate (UExercise tem ch (_goExp cidOut) par (_goExp argOut))) updSet - (concatDelta (cidOut ^. goDel) (argOut ^. goDel))) + (concatDelta (_goDel cidOut) (_goDel argOut))) From 3476a5e21c11d4d803b967749d01944794cb80c6 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Thu, 9 Apr 2020 14:26:50 +0200 Subject: [PATCH 03/50] Substitution functions --- .../src/DA/Daml/LF/Verify/Subst.hs | 95 +++++++++++++++++-- 1 file changed, 88 insertions(+), 7 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs index 9fbcf3a537f7..1e0397d3f25e 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs @@ -10,26 +10,107 @@ module DA.Daml.LF.Verify.Subst , substituteTyTm ) where +import Control.Lens hiding (Context) import qualified Data.Map.Strict as Map import DA.Daml.LF.Ast +import DA.Daml.LF.Ast.Type -- | Substitution of expressions for expression variables. type ExprSubst = Map.Map ExprVarName Expr --- TODO: This already exists. remove duplication? --- | Substitution of types for type variables. -type TypeSubst = Map.Map TypeVarName Type singleExprSubst :: ExprVarName -> Expr -> ExprSubst singleExprSubst = Map.singleton -singleTypeSubst :: TypeVarName -> Type -> TypeSubst +singleTypeSubst :: TypeVarName -> Type -> Subst singleTypeSubst = Map.singleton -- | Apply an expression substitution to an expression. +-- TODO: We assume that for any substitution x |-> e : x notin e +-- and a |-> t : a notin t. +-- TODO: I can't help but feel there has to be a nicer way to write this function substituteTmTm :: ExprSubst -> Expr -> Expr -substituteTmTm = undefined -- TODO +substituteTmTm s = \case + EVar x + | Just e <- Map.lookup x s -> e + | otherwise -> EVar x + ERecCon t fs -> ERecCon t $ map (over _2 (substituteTmTm s)) fs + ERecProj t f e -> ERecProj t f $ substituteTmTm s e + ERecUpd t f e1 e2 -> ERecUpd t f (substituteTmTm s e1) (substituteTmTm s e2) + EVariantCon t v e -> EVariantCon t v (substituteTmTm s e) + EStructCon fs -> EStructCon $ map (over _2 (substituteTmTm s)) fs + EStructProj f e -> EStructProj f (substituteTmTm s e) + EStructUpd f e1 e2 -> EStructUpd f (substituteTmTm s e1) (substituteTmTm s e2) + ETmApp e1 e2 -> ETmApp (substituteTmTm s e1) (substituteTmTm s e2) + ETyApp e t -> ETyApp (substituteTmTm s e) t + ETmLam xs e -> ETmLam xs (substituteTmTm s e) + ETyLam as e -> ETyLam as (substituteTmTm s e) + ECase e cs -> ECase (substituteTmTm s e) + $ map (\CaseAlternative{..} -> CaseAlternative altPattern (substituteTmTm s altExpr)) cs + ELet Binding{..} e -> ELet (Binding bindingBinder $ substituteTmTm s bindingBound) + (substituteTmTm s e) + ECons t e1 e2 -> ECons t (substituteTmTm s e1) (substituteTmTm s e2) + ESome t e -> ESome t (substituteTmTm s e) + EToAny t e -> EToAny t (substituteTmTm s e) + EFromAny t e -> EFromAny t (substituteTmTm s e) + EUpdate u -> EUpdate $ substituteTmUpd s u + ELocation l e -> ELocation l (substituteTmTm s e) + e -> e + +-- | Apply an expression substitution to an update. +substituteTmUpd :: ExprSubst -> Update -> Update +substituteTmUpd s = \case + UPure t e -> UPure t $ substituteTmTm s e + UBind Binding{..} e -> UBind (Binding bindingBinder $ substituteTmTm s bindingBound) + (substituteTmTm s e) + UCreate t e -> UCreate t $ substituteTmTm s e + UExercise t c e1 a e2 -> UExercise t c (substituteTmTm s e1) a (substituteTmTm s e2) + UFetch t e -> UFetch t $ substituteTmTm s e + UEmbedExpr t e -> UEmbedExpr t $ substituteTmTm s e + u -> u -- | Apply a type substitution to an expression. -substituteTyTm :: TypeSubst -> Expr -> Expr -substituteTyTm = undefined -- TODO +substituteTyTm :: Subst -> Expr -> Expr +substituteTyTm s = \case + ERecCon t fs -> ERecCon (substituteTyTCApp s t) $ map (over _2 (substituteTyTm s)) fs + ERecProj t f e -> ERecProj (substituteTyTCApp s t) f $ substituteTyTm s e + ERecUpd t f e1 e2 -> ERecUpd (substituteTyTCApp s t) f (substituteTyTm s e1) + (substituteTyTm s e2) + EVariantCon t v e -> EVariantCon (substituteTyTCApp s t) v (substituteTyTm s e) + EStructCon fs -> EStructCon $ map (over _2 (substituteTyTm s)) fs + EStructProj f e -> EStructProj f $ substituteTyTm s e + EStructUpd f e1 e2 -> EStructUpd f (substituteTyTm s e1) (substituteTyTm s e2) + ETmApp e1 e2 -> ETmApp (substituteTyTm s e1) (substituteTyTm s e2) + ETyApp e t -> ETyApp (substituteTyTm s e) (substitute s t) + ETmLam (n, t) e -> ETmLam (n, substitute s t) (substituteTyTm s e) + ETyLam b e -> ETyLam b $ substituteTyTm s e + ECase e cs -> ECase (substituteTyTm s e) (map (substituteTyCaseAlt s) cs) + ELet Binding{..} e -> ELet (Binding (over _2 (substitute s) bindingBinder) (substituteTyTm s bindingBound)) + (substituteTyTm s e) + ENil t -> ENil (substitute s t) + ECons t e1 e2 -> ECons (substitute s t) (substituteTyTm s e1) (substituteTyTm s e2) + ESome t e -> ESome (substitute s t) (substituteTyTm s e) + ENone t -> ENone (substitute s t) + EToAny t e -> EToAny (substitute s t) (substituteTyTm s e) + EFromAny t e -> EFromAny (substitute s t) (substituteTyTm s e) + ETypeRep t -> ETypeRep (substitute s t) + EUpdate u -> EUpdate (substituteTyUpd s u) + ELocation l e -> ELocation l (substituteTyTm s e) + e -> e + +-- | Apply a type substitution to an update. +substituteTyUpd :: Subst -> Update -> Update +substituteTyUpd s = \case + UPure t e -> UPure (substitute s t) (substituteTyTm s e) + UBind Binding{..} e -> UBind (Binding (over _2 (substitute s) bindingBinder) (substituteTyTm s bindingBound)) + (substituteTyTm s e) + UCreate n e -> UCreate n (substituteTyTm s e) + UExercise n c e1 a e2 -> UExercise n c (substituteTyTm s e1) a (substituteTyTm s e2) + UFetch n e -> UFetch n (substituteTyTm s e) + UEmbedExpr t e -> UEmbedExpr (substitute s t) (substituteTyTm s e) + u -> u + +substituteTyTCApp :: Subst -> TypeConApp -> TypeConApp +substituteTyTCApp s (TypeConApp n ts) = TypeConApp n (map (substitute s) ts) +substituteTyCaseAlt :: Subst -> CaseAlternative -> CaseAlternative +substituteTyCaseAlt s (CaseAlternative p e) = CaseAlternative p (substituteTyTm s e) From 4675fdd884906d6b21e5d4fa89b7a54fd764b645 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Thu, 9 Apr 2020 17:08:08 +0200 Subject: [PATCH 04/50] Template generation --- compiler/daml-lf-verify/BUILD.bazel | 12 ++++++++++-- compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs | 5 ++++- .../src/DA/Daml/LF/Verify/Context.hs | 2 +- .../src/DA/Daml/LF/Verify/Generate.hs | 15 ++++++++++----- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/compiler/daml-lf-verify/BUILD.bazel b/compiler/daml-lf-verify/BUILD.bazel index 61e5dc126fbf..5bb63d56ed15 100644 --- a/compiler/daml-lf-verify/BUILD.bazel +++ b/compiler/daml-lf-verify/BUILD.bazel @@ -1,9 +1,10 @@ # Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. # SPDX-License-Identifier: Apache-2.0 -load("//bazel_tools:haskell.bzl", "da_haskell_library") +load("//bazel_tools:haskell.bzl", "da_haskell_binary") +load("//bazel_tools/packaging:packaging.bzl", "package_app") -da_haskell_library( +da_haskell_binary( name = "daml-lf-verify", srcs = glob(["src/**/*.hs"]), hackage_deps = [ @@ -29,6 +30,7 @@ da_haskell_library( "unordered-containers", "zip-archive", ], + main_function = "DA.Daml.LF.Verify.main", src_strip_prefix = "src", visibility = ["//visibility:public"], deps = [ @@ -39,3 +41,9 @@ da_haskell_library( "//libs-haskell/da-hs-base", ], ) + +package_app( + name = "daml-lf-verify-dist", + binary = ":damlverify", + visibility = ["//visibility:public"], +) \ No newline at end of file diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index 8bbdb78061fa..922ec7f1c5c3 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -14,6 +14,9 @@ main :: IO () main = do Options{..} <- execParser optionsParserInfo pkgs <- readPackages optInputDars - let _delta = runDelta $ genPackages pkgs + let delta = runDelta $ genPackages pkgs putStrLn "Constraints generated." + case delta of + Left _ -> return () + Right _ -> return () diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 5a9c8bc72ef5..21387bbdba69 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -8,7 +8,7 @@ -- | Contexts for DAML LF static verification module DA.Daml.LF.Verify.Context ( Delta - , MonadDelta, devars, _devals + , MonadDelta, dchs, devars, _devals , UpdateSet(..) , UpdCreate(..), usCre, usArc, usCho , UpdArchive(..) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index 44c3fe369883..dfde7e353680 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -6,12 +6,11 @@ -- | Constraint generator for DAML LF static verification module DA.Daml.LF.Verify.Generate ( genPackages - , genChoice -- Added export to suppress the unused warning. ) where import Control.Lens hiding (Context) import Control.Monad.Error.Class (MonadError (..)) -import Data.HashMap.Strict (singleton) +import Data.HashMap.Strict (singleton, fromList, union) import Control.Monad.Reader import qualified Data.NameMap as NM @@ -85,7 +84,7 @@ genModule :: MonadDelta m => PackageRef -> Module -> m Delta genModule pac mod = do del0 <- ask del1 <- buildDelta del0 (genValue pac (moduleName mod)) (NM.toList $ moduleValues mod) - buildDelta del1 genTemplate (NM.toList $ moduleTemplates mod) + buildDelta del1 (genTemplate pac (moduleName mod)) (NM.toList $ moduleTemplates mod) genValue :: MonadDelta m => PackageRef -> ModuleName -> DefValue -> m Delta genValue pac mod val = do @@ -106,8 +105,14 @@ genChoice tem cho = do $ over (goDel . devars) ((:) (fst $ chcArgBinder cho)) expOut -genTemplate :: MonadDelta m => Template -> m Delta -genTemplate = undefined -- TODO +genTemplate :: MonadDelta m => PackageRef -> ModuleName -> Template -> m Delta +-- TODO: lookup the data type and skolemise all fieldnames +genTemplate pac mod Template{..} = do + let name = Qualified pac mod tplTypeCon + choOuts <- mapM (genChoice name) (NM.toList tplChoices) + let delta = foldl concatDelta emptyDelta (map _goDel choOuts) + choices = fromList $ zip (zip (repeat name) (map chcName $ NM.toList tplChoices)) (map _goUpd choOuts) + return $ over dchs (union choices) delta genExpr :: MonadDelta m => Expr -> m GenOutput genExpr = \case From afc3766ee429ed374283b099d54749c90e707ccd Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Thu, 9 Apr 2020 17:12:54 +0200 Subject: [PATCH 05/50] Reformatted --- compiler/daml-lf-verify/BUILD.bazel | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler/daml-lf-verify/BUILD.bazel b/compiler/daml-lf-verify/BUILD.bazel index 5bb63d56ed15..e2fd76a97018 100644 --- a/compiler/daml-lf-verify/BUILD.bazel +++ b/compiler/daml-lf-verify/BUILD.bazel @@ -35,9 +35,9 @@ da_haskell_binary( visibility = ["//visibility:public"], deps = [ "//compiler/daml-lf-ast", - "//compiler/daml-lf-tools", "//compiler/daml-lf-proto", "//compiler/daml-lf-reader", + "//compiler/daml-lf-tools", "//libs-haskell/da-hs-base", ], ) @@ -46,4 +46,4 @@ package_app( name = "daml-lf-verify-dist", binary = ":damlverify", visibility = ["//visibility:public"], -) \ No newline at end of file +) From c329b375b0f06a06722c9a3f0033ca0b745fe9a3 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Thu, 9 Apr 2020 17:22:32 +0200 Subject: [PATCH 06/50] Attempt to fix failing check --- compiler/daml-lf-verify/BUILD.bazel | 7 ------- 1 file changed, 7 deletions(-) diff --git a/compiler/daml-lf-verify/BUILD.bazel b/compiler/daml-lf-verify/BUILD.bazel index e2fd76a97018..02a22d3de681 100644 --- a/compiler/daml-lf-verify/BUILD.bazel +++ b/compiler/daml-lf-verify/BUILD.bazel @@ -2,7 +2,6 @@ # SPDX-License-Identifier: Apache-2.0 load("//bazel_tools:haskell.bzl", "da_haskell_binary") -load("//bazel_tools/packaging:packaging.bzl", "package_app") da_haskell_binary( name = "daml-lf-verify", @@ -41,9 +40,3 @@ da_haskell_binary( "//libs-haskell/da-hs-base", ], ) - -package_app( - name = "daml-lf-verify-dist", - binary = ":damlverify", - visibility = ["//visibility:public"], -) From f3e4d17a49c0c22196439fa5eca2c502b849eba9 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Wed, 15 Apr 2020 14:33:05 +0200 Subject: [PATCH 07/50] Rework generation for value definitions into 2 phase approach --- .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 12 +- .../src/DA/Daml/LF/Verify/Context.hs | 119 +++++++++++++----- .../src/DA/Daml/LF/Verify/Generate.hs | 119 ++++++++++-------- 3 files changed, 157 insertions(+), 93 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index 922ec7f1c5c3..bb9360b5ecd1 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -14,9 +14,11 @@ main :: IO () main = do Options{..} <- execParser optionsParserInfo pkgs <- readPackages optInputDars - let delta = runDelta $ genPackages pkgs - putStrLn "Constraints generated." - case delta of - Left _ -> return () - Right _ -> return () + putStrLn "Start value phase" >> case runDelta (genPackages ValuePhase pkgs) emptyDelta of + Left err-> putStrLn "Value phase finished with error: " >> print err + Right delta1 -> putStrLn "Start solving" >> + let delta2 = solveValueUpdatesDelta delta1 + in putStrLn "Start template phase" >> case runDelta (genPackages TemplatePhase pkgs) delta2 of + Left err -> putStrLn "Template phase finished with error: " >> print err + Right _delta3 -> putStrLn "Success!" diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 21387bbdba69..72916ec3d07d 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -7,10 +7,10 @@ -- | Contexts for DAML LF static verification module DA.Daml.LF.Verify.Context - ( Delta - , MonadDelta, dchs, devars, _devals + ( Delta, Error(..) + , MonadDelta, dchs, devars, _devals, devals , UpdateSet(..) - , UpdCreate(..), usCre, usArc, usCho + , UpdCreate(..), usCre, usArc, usCho, usVal , UpdArchive(..) , UpdChoice(..) , runDelta @@ -20,15 +20,17 @@ module DA.Daml.LF.Verify.Context , concatDelta , emptyUpdateSet , concatUpdateSet + , solveValueUpdatesDelta + , testPrint ) where import Control.Lens hiding (Context) -import Control.Monad.Error.Class (MonadError (..)) +import Control.Monad.Error.Class (MonadError (..), throwError) import Control.Monad.Reader -import Data.HashMap.Strict (HashMap, union, empty) +import Data.Maybe (listToMaybe) +import qualified Data.HashMap.Strict as HM import DA.Daml.LF.Ast -import DA.Daml.LF.TypeChecker.Error data UpdCreate = UpdCreate { _creTemp :: !(Qualified TypeConName) @@ -36,18 +38,21 @@ data UpdCreate = UpdCreate , _creField :: ![(FieldName, Expr)] -- ^ The fields to be verified, together with their value. } + deriving Show data UpdArchive = UpdArchive { _arcTemp :: !(Qualified TypeConName) -- ^ Qualified type constructor corresponding to the contract template. , _arcField :: ![(FieldName, Expr)] -- ^ The fields to be verified, together with their value. } + deriving Show data UpdChoice = UpdChoice { _choTemp :: !(Qualified TypeConName) -- ^ Qualified type constructor corresponding to the contract template. , _choName :: !ChoiceName -- ^ The name of the choice. } + deriving Show -- | The List of updates being performed data UpdateSet = UpdateSet @@ -57,45 +62,52 @@ data UpdateSet = UpdateSet -- ^ The list of archive updates. , _usCho :: ![UpdChoice] -- ^ The list of choice updates. + , _usVal :: ![Qualified ExprValName] + -- ^ The list of referenced values. These will be replaced by their + -- respective updates after solving. } + deriving Show makeLenses ''UpdateSet emptyUpdateSet :: UpdateSet -emptyUpdateSet = UpdateSet [] [] [] +emptyUpdateSet = UpdateSet [] [] [] [] concatUpdateSet :: UpdateSet -> UpdateSet -> UpdateSet -concatUpdateSet (UpdateSet cres1 arcs1 chos1) (UpdateSet cres2 arcs2 chos2) = - UpdateSet (cres1 ++ cres2) (arcs1 ++ arcs2) (chos1 ++ chos2) +concatUpdateSet (UpdateSet cres1 arcs1 chos1 vals1) (UpdateSet cres2 arcs2 chos2 vals2) = + UpdateSet (cres1 ++ cres2) (arcs1 ++ arcs2) (chos1 ++ chos2) (vals1 ++ vals2) -- | The environment for the DAML-LF verifier data Delta = Delta { _devars :: ![ExprVarName] -- ^ The skolemised term variables. - , _devals :: !(HashMap (Qualified ExprValName) (Expr, UpdateSet)) + , _devals :: !(HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) -- ^ The bound values. - , _dchs :: !(HashMap (Qualified TypeConName, ChoiceName) UpdateSet) + , _dchs :: !(HM.HashMap (Qualified TypeConName, ChoiceName) UpdateSet) -- ^ The set of relevant choices. -- TODO: split this off into data types for readability? } + deriving Show makeLenses ''Delta emptyDelta :: Delta -emptyDelta = Delta [] empty empty +emptyDelta = Delta [] HM.empty HM.empty concatDelta :: Delta -> Delta -> Delta concatDelta (Delta vars1 vals1 chs1) (Delta vars2 vals2 chs2) = - Delta (vars1 ++ vars2) (vals1 `union` vals2) (chs1 `union` chs2) + Delta (vars1 ++ vars2) (vals1 `HM.union` vals2) (chs1 `HM.union` chs2) -- TODO: union makes me slightly nervous, as it allows overlapping keys -- (and just uses the first) -- | Type class constraint with the required monadic effects for functions -- manipulating the verification environment. +-- TODO: the more I look at this, the more convinced I am that this should be a +-- state monad, not a reader. type MonadDelta m = (MonadError Error m, MonadReader Delta m) -runDelta :: ReaderT Delta (Either Error) a -> Either Error a -runDelta act = runReaderT act emptyDelta +runDelta :: ReaderT Delta (Either Error) a -> Delta -> Either Error a +runDelta = runReaderT -- | Run a computation in the current environment, with an additional -- environment extension. @@ -112,32 +124,71 @@ extVarDelta x = local (over devars ((:) x)) lookupDExprVar :: MonadDelta m => ExprVarName -> m () lookupDExprVar x = ask >>= \ del -> unless (elem x $ _devars del) - $ throwError $ EUnknownExprVar x + (throwError $ UnboundVar x) lookupDVal :: MonadDelta m => Qualified ExprValName -> m (Expr, UpdateSet) -lookupDVal w = view (devals . at w) >>= match _Just EEmptyCase --- TODO: This is a random error. The thing we really want to write is: --- lookupDVal w = view (devals . at w) >>= match _Just (EUnknownDefinition $ LEValue w) --- The issue here is that our values are currently stored in Delta instead --- of in the world like in the type checker. --- This means that we can't throw the error we want to throw here. --- 2 options: --- + either define our own errors, as they don't correspond 100% to the type --- checking errors anyway. --- + or create our own world environment to store values. This also makes --- sense as these values work similar to how they work in the type checker, --- except that we need to store a partially evaluated definition as well. --- Both approaches make sense, but both imply a lot of code duplication, so they --- don't sound that enticing... +-- lookupDVal w = view (devals . at w) >>= match _Just (UnknownValue w) +lookupDVal val = do + del <- ask + case lookupValInHMap (_devals del) val of + Just res -> return res + Nothing -> throwError (UnknownValue val) + +-- TODO: There seems to be something wrong with the qualifiers. This is a +-- temporary solution. +lookupValInHMap :: (HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) + -> Qualified ExprValName -> Maybe (Expr, UpdateSet) +lookupValInHMap hmap val = listToMaybe $ HM.elems + $ HM.filterWithKey (\name _ -> (qualObject name) == (qualObject val)) hmap lookupDChoice :: MonadDelta m => Qualified TypeConName -> ChoiceName -> m UpdateSet -lookupDChoice tem ch = view (dchs . at (tem, ch)) >>= match _Just EEmptyCase --- TODO: Random error. +lookupDChoice tem ch = view (dchs . at (tem, ch)) >>= match _Just + (UnknownChoice ch) -- | Helper functions mirrored from Env. --- TODO: Reduce duplication by abstracting over MonadGamma and MonadDelta? match :: MonadDelta m => Prism' a b -> Error -> a -> m b -match p e x = either (const (throwError e)) pure (matching p x) +match p err x = either (const (throwError err)) pure (matching p x) -- TODO: no context, like in Gamma +solveValueUpdatesDelta :: Delta -> Delta +solveValueUpdatesDelta del = + let hmap0 = _devals del + hmap1 = foldl solveValueUpdate hmap0 (HM.keys hmap0) + in del{_devals = hmap1} + +solveValueUpdate :: (HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) + -> (Qualified ExprValName) -> HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) +solveValueUpdate hmap0 val0 = + let (hmap1, _) = step (hmap0, emptyUpdateSet) val0 + in hmap1 + where + step :: ((HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)), UpdateSet) + -> (Qualified ExprValName) + -> ((HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)), UpdateSet) + step (hmap, baseupd) val = case lookupValInHMap hmap val of + Nothing -> error ("Impossible! Undefined value: " ++ (show $ unExprValName $ qualObject val)) + Just (expr, valupd) -> + let (nhmap, nvalupd) = foldl step (hmap, valupd{_usVal = []}) (_usVal valupd) + in (HM.insert val (expr, nvalupd) nhmap, concatUpdateSet baseupd nvalupd) + +data Error + = UnknownValue (Qualified ExprValName) + | UnknownChoice ChoiceName + | UnboundVar ExprVarName + | ExpectRecord + | CyclicModules [ModuleName] + +instance Show Error where + show (UnknownValue qname) = ("Impossible: Unknown value definition: " + ++ (show $ unExprValName $ qualObject qname)) + show (UnknownChoice ch) = ("Impossible: Unknown choice definition: " ++ (show ch)) + show (UnboundVar name) = ("Impossible: Unbound term variable: " ++ (show name)) + show ExpectRecord = "Impossible: Expected a record type" + show (CyclicModules mods) = "Cyclic modules: " ++ (show mods) + +-- | For testing purposes: print the stored value definitions in the environment. +-- TODO: Remove +testPrint :: (HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) -> IO () +testPrint hmap = putStrLn "Test print keys:" + >> mapM_ print (HM.keys hmap) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index dfde7e353680..484395a04da7 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -6,18 +6,23 @@ -- | Constraint generator for DAML LF static verification module DA.Daml.LF.Verify.Generate ( genPackages + , Phase(..) ) where import Control.Lens hiding (Context) -import Control.Monad.Error.Class (MonadError (..)) import Data.HashMap.Strict (singleton, fromList, union) +import Control.Monad.Error.Class (throwError, catchError) import Control.Monad.Reader import qualified Data.NameMap as NM +import Debug.Trace import DA.Daml.LF.Ast import DA.Daml.LF.Verify.Context import DA.Daml.LF.Verify.Subst -import DA.Daml.LF.TypeChecker.Error + +data Phase + = ValuePhase + | TemplatePhase data GenOutput = GenOutput { _goExp :: Expr @@ -69,34 +74,41 @@ buildDelta del op args = foldM step del args where step d x = concatDelta d <$> setDelta d (op x) -genPackages :: MonadDelta m => [(PackageId, (Package, Maybe PackageName))] -> m Delta -genPackages inp = do +genPackages :: MonadDelta m => Phase -> [(PackageId, (Package, Maybe PackageName))] -> m Delta +genPackages ph inp = do del0 <- ask - buildDelta del0 genPackage inp + buildDelta del0 (genPackage ph) inp -genPackage :: MonadDelta m => (PackageId, (Package, Maybe PackageName)) -> m Delta -genPackage (id, (pac, _)) = do +genPackage :: MonadDelta m => Phase -> (PackageId, (Package, Maybe PackageName)) -> m Delta +genPackage ph (id, (pac, _)) = do del0 <- ask - buildDelta del0 (genModule (PRImport id)) (NM.toList $ packageModules pac) + buildDelta del0 (genModule ph (PRImport id)) (NM.toList $ packageModules pac) -- TODO: Type synonyms and data types are ignored for now. -genModule :: MonadDelta m => PackageRef -> Module -> m Delta -genModule pac mod = do - del0 <- ask - del1 <- buildDelta del0 (genValue pac (moduleName mod)) (NM.toList $ moduleValues mod) - buildDelta del1 (genTemplate pac (moduleName mod)) (NM.toList $ moduleTemplates mod) +genModule :: MonadDelta m => Phase -> PackageRef -> Module -> m Delta +genModule ValuePhase pac mod = do + del <- ask + buildDelta del (genValue pac (moduleName mod)) (NM.toList $ moduleValues mod) +genModule TemplatePhase pac mod = do + del <- ask + buildDelta del (genTemplate pac (moduleName mod)) (NM.toList $ moduleTemplates mod) genValue :: MonadDelta m => PackageRef -> ModuleName -> DefValue -> m Delta -genValue pac mod val = do - expOut <- genExpr (dvalBody val) - let qname = Qualified pac mod (fst $ dvalBinder val) - return emptyDelta{_devals = singleton qname (_goExp expOut, _goUpd expOut)} +genValue pac mod val = + catchError + (do { expOut <- genExpr ValuePhase (dvalBody val) + ; let qname = Qualified pac mod (fst $ dvalBinder val) + ; return emptyDelta{_devals = singleton qname (_goExp expOut, _goUpd expOut)} + }) + (\err -> trace (show err) + $ trace ("Fail: " ++ (show $ unExprValName $ fst $ dvalBinder val)) + $ return emptyDelta) -- TODO: Handle annotated choices, by returning a set of annotations. genChoice :: MonadDelta m => Qualified TypeConName -> TemplateChoice -> m GenOutput genChoice tem cho = do - expOut <- extVarDelta (fst $ chcArgBinder cho) $ genExpr (chcUpdate cho) + expOut <- extVarDelta (fst $ chcArgBinder cho) $ genExpr TemplatePhase (chcUpdate cho) let updSet = if chcConsuming cho -- TODO: Convert the `ExprVarName`s to `FieldName`s then over usArc ((:) (UpdArchive tem [])) (_goUpd expOut) @@ -114,71 +126,70 @@ genTemplate pac mod Template{..} = do choices = fromList $ zip (zip (repeat name) (map chcName $ NM.toList tplChoices)) (map _goUpd choOuts) return $ over dchs (union choices) delta -genExpr :: MonadDelta m => Expr -> m GenOutput -genExpr = \case - ETmApp fun arg -> genForTmApp fun arg - ETyApp expr typ -> genForTyApp expr typ - EVar name -> genForVar name - EVal w -> genForVal w - EUpdate (UCreate tem arg) -> genForCreate tem arg - EUpdate (UExercise tem ch cid par arg) -> genForExercise tem ch cid par arg - _ -> error "Not implemented" - -genForTmApp :: MonadDelta m => Expr -> Expr -> m GenOutput -genForTmApp fun arg = do - funOut <- genExpr fun - argOut <- genExpr arg +genExpr :: MonadDelta m => Phase -> Expr -> m GenOutput +genExpr ph = \case + ETmApp fun arg -> genForTmApp ph fun arg + ETyApp expr typ -> genForTyApp ph expr typ + EVar name -> genForVar ph name + EVal w -> genForVal ph w + EUpdate (UCreate tem arg) -> genForCreate ph tem arg + EUpdate (UExercise tem ch cid par arg) -> genForExercise ph tem ch cid par arg + -- TODO: Extend additional cases + e -> return $ GenOutput e emptyUpdateSet emptyDelta + +genForTmApp :: MonadDelta m => Phase -> Expr -> Expr -> m GenOutput +genForTmApp ph fun arg = do + funOut <- genExpr ph fun + argOut <- genExpr ph arg case _goExp funOut of ETmLam bndr body -> do let updDelta = concatDelta (_goDel funOut) (_goDel argOut) subst = singleExprSubst (fst bndr) (_goExp argOut) resExpr = substituteTmTm subst body - resOut <- introDelta updDelta $ genExpr resExpr + resOut <- introDelta updDelta $ genExpr ph resExpr return $ combineGO resOut $ combineGO funOut argOut fun' -> return $ updateGOExpr (ETmApp fun' (_goExp argOut)) $ combineGO funOut argOut -genForTyApp :: MonadDelta m => Expr -> Type -> m GenOutput -genForTyApp expr typ = do - exprOut <- genExpr expr +genForTyApp :: MonadDelta m => Phase -> Expr -> Type -> m GenOutput +genForTyApp ph expr typ = do + exprOut <- genExpr ph expr case _goExp exprOut of ETyLam bndr body -> do let subst = singleTypeSubst (fst bndr) typ resExpr = substituteTyTm subst body - resOut <- introDelta (_goDel exprOut) $ genExpr resExpr + resOut <- introDelta (_goDel exprOut) $ genExpr ph resExpr return $ combineGO resOut exprOut expr' -> return $ updateGOExpr (ETyApp expr' typ) exprOut -genForVar :: MonadDelta m => ExprVarName -> m GenOutput -genForVar name = lookupDExprVar name +genForVar :: MonadDelta m => Phase -> ExprVarName -> m GenOutput +genForVar _ph name = lookupDExprVar name >> return (GenOutput (EVar name) emptyUpdateSet emptyDelta) -genForVal :: MonadDelta m => Qualified ExprValName -> m GenOutput -genForVal w = lookupDVal w - >>= \ (expr, upds) -> return (GenOutput expr upds emptyDelta) +genForVal :: MonadDelta m => Phase -> Qualified ExprValName -> m GenOutput +genForVal ValuePhase w + = return $ GenOutput (EVal w) (emptyUpdateSet{_usVal = [w]}) emptyDelta +genForVal TemplatePhase w + = lookupDVal w >>= \ (expr, upds) -> return (GenOutput expr upds emptyDelta) -genForCreate :: MonadDelta m => Qualified TypeConName -> Expr -> m GenOutput -genForCreate tem arg = do - argOut <- genExpr arg +genForCreate :: MonadDelta m => Phase -> Qualified TypeConName -> Expr -> m GenOutput +genForCreate ph tem arg = do + argOut <- genExpr ph arg case _goExp argOut of argExpr@(ERecCon _ fs) -> return (GenOutput (EUpdate (UCreate tem argExpr)) -- TODO: We could potentially filter here -- to only store the interesting fields? emptyUpdateSet{_usCre = [UpdCreate tem fs]} (_goDel argOut)) - _ -> throwError EEnumTypeWithParams - -- TODO: This is a random error, as we do not have access to the expected - -- type, which we need to constructed the error we really want. - -- Perhaps we do need to define our own set of errors. - -- _ -> throwError (EExpectedRecordType ty) + _ -> throwError ExpectRecord -genForExercise :: MonadDelta m => Qualified TypeConName -> ChoiceName +genForExercise :: MonadDelta m => Phase -> Qualified TypeConName -> ChoiceName -> Expr -> Maybe Expr -> Expr -> m GenOutput -genForExercise tem ch cid par arg = do - cidOut <- genExpr cid - argOut <- genExpr arg +genForExercise ph tem ch cid par arg = do + cidOut <- genExpr ph cid + argOut <- genExpr ph arg -- TODO: Take possibility into account that the choice is not found? updSet <- lookupDChoice tem ch return (GenOutput (EUpdate (UExercise tem ch (_goExp cidOut) par (_goExp argOut))) From a7ef4454f8db4f57c52a3bd79127df493737e4e6 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Thu, 16 Apr 2020 11:09:53 +0200 Subject: [PATCH 08/50] Various small changes --- compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs | 7 ++++++- .../src/DA/Daml/LF/Verify/Context.hs | 16 ++++++++++++---- .../src/DA/Daml/LF/Verify/Generate.hs | 2 ++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index bb9360b5ecd1..8c95317bce0a 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -6,10 +6,15 @@ module DA.Daml.LF.Verify ( main ) where import Options.Applicative +import DA.Daml.LF.Ast.Base import DA.Daml.LF.Verify.Generate import DA.Daml.LF.Verify.Read import DA.Daml.LF.Verify.Context +-- TODO: temporarily hardcoded +choiceName :: ChoiceName +choiceName = ChoiceName "Iou_Split" + main :: IO () main = do Options{..} <- execParser optionsParserInfo @@ -20,5 +25,5 @@ main = do let delta2 = solveValueUpdatesDelta delta1 in putStrLn "Start template phase" >> case runDelta (genPackages TemplatePhase pkgs) delta2 of Left err -> putStrLn "Template phase finished with error: " >> print err - Right _delta3 -> putStrLn "Success!" + Right delta3 -> putStrLn "Success!" >> print (lookupChoInHMap (_dchs delta3) choiceName) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 72916ec3d07d..3fed1d871388 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -8,7 +8,7 @@ -- | Contexts for DAML LF static verification module DA.Daml.LF.Verify.Context ( Delta, Error(..) - , MonadDelta, dchs, devars, _devals, devals + , MonadDelta, _dchs, dchs, _devars, devars, _devals, devals , UpdateSet(..) , UpdCreate(..), usCre, usArc, usCho, usVal , UpdArchive(..) @@ -21,7 +21,7 @@ module DA.Daml.LF.Verify.Context , emptyUpdateSet , concatUpdateSet , solveValueUpdatesDelta - , testPrint + , testPrint, lookupChoInHMap ) where import Control.Lens hiding (Context) @@ -80,6 +80,7 @@ concatUpdateSet (UpdateSet cres1 arcs1 chos1 vals1) (UpdateSet cres2 arcs2 chos2 -- | The environment for the DAML-LF verifier data Delta = Delta { _devars :: ![ExprVarName] + -- TODO: there seems to be a bug which makes this an infinite list... -- ^ The skolemised term variables. , _devals :: !(HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) -- ^ The bound values. @@ -102,8 +103,7 @@ concatDelta (Delta vars1 vals1 chs1) (Delta vars2 vals2 chs2) = -- | Type class constraint with the required monadic effects for functions -- manipulating the verification environment. --- TODO: the more I look at this, the more convinced I am that this should be a --- state monad, not a reader. + -- TODO: I think this should be a mix of a reader and a state monad... type MonadDelta m = (MonadError Error m, MonadReader Delta m) runDelta :: ReaderT Delta (Either Error) a -> Delta -> Either Error a @@ -123,6 +123,9 @@ extVarDelta :: MonadDelta m => ExprVarName -> m a -> m a extVarDelta x = local (over devars ((:) x)) lookupDExprVar :: MonadDelta m => ExprVarName -> m () +lookupDExprVar (ExprVarName "self") = return () +lookupDExprVar (ExprVarName "this") = return () +-- TODO: Is there a nicer way to handle this instead of hardcoding? lookupDExprVar x = ask >>= \ del -> unless (elem x $ _devars del) (throwError $ UnboundVar x) @@ -141,6 +144,11 @@ lookupValInHMap :: (HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) lookupValInHMap hmap val = listToMaybe $ HM.elems $ HM.filterWithKey (\name _ -> (qualObject name) == (qualObject val)) hmap +lookupChoInHMap :: (HM.HashMap (Qualified TypeConName, ChoiceName) UpdateSet) + -> ChoiceName -> Maybe UpdateSet +lookupChoInHMap hmap cho = listToMaybe $ HM.elems + $ HM.filterWithKey (\(_, name) _ -> cho == name) hmap + lookupDChoice :: MonadDelta m => Qualified TypeConName -> ChoiceName -> m UpdateSet lookupDChoice tem ch = view (dchs . at (tem, ch)) >>= match _Just diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index 484395a04da7..ecd0977f7f2f 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -108,6 +108,7 @@ genValue pac mod val = genChoice :: MonadDelta m => Qualified TypeConName -> TemplateChoice -> m GenOutput genChoice tem cho = do + -- TODO: Skolemise chcSelfBinder expOut <- extVarDelta (fst $ chcArgBinder cho) $ genExpr TemplatePhase (chcUpdate cho) let updSet = if chcConsuming cho -- TODO: Convert the `ExprVarName`s to `FieldName`s @@ -119,6 +120,7 @@ genChoice tem cho = do genTemplate :: MonadDelta m => PackageRef -> ModuleName -> Template -> m Delta -- TODO: lookup the data type and skolemise all fieldnames +-- TODO: Take precondition into account? genTemplate pac mod Template{..} = do let name = Qualified pac mod tplTypeCon choOuts <- mapM (genChoice name) (NM.toList tplChoices) From c99827d39fafd7d1cbf8243fe3ff7f5e44ab5653 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Thu, 16 Apr 2020 17:20:27 +0200 Subject: [PATCH 09/50] Rework delta to env state --- .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 12 +- .../src/DA/Daml/LF/Verify/Context.hs | 119 +++++----- .../src/DA/Daml/LF/Verify/Generate.hs | 203 +++++++----------- 3 files changed, 144 insertions(+), 190 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index 8c95317bce0a..8900e3100484 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -19,11 +19,11 @@ main :: IO () main = do Options{..} <- execParser optionsParserInfo pkgs <- readPackages optInputDars - putStrLn "Start value phase" >> case runDelta (genPackages ValuePhase pkgs) emptyDelta of + putStrLn "Start value phase" >> case runEnv (genPackages ValuePhase pkgs) emptyEnv of Left err-> putStrLn "Value phase finished with error: " >> print err - Right delta1 -> putStrLn "Start solving" >> - let delta2 = solveValueUpdatesDelta delta1 - in putStrLn "Start template phase" >> case runDelta (genPackages TemplatePhase pkgs) delta2 of - Left err -> putStrLn "Template phase finished with error: " >> print err - Right delta3 -> putStrLn "Success!" >> print (lookupChoInHMap (_dchs delta3) choiceName) + Right env1 -> putStrLn "Start solving" >> + let env2 = solveValueUpdatesEnv env1 + in putStrLn "Start template phase" >> case runEnv (genPackages TemplatePhase pkgs) env2 of + Left err -> putStrLn "Template phase finished with error: " >> print err + Right env3 -> putStrLn "Success!" >> print (lookupChoInHMap (_envchs env3) choiceName) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 3fed1d871388..b8693454df21 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -3,34 +3,33 @@ {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE RankNTypes #-} -{-# LANGUAGE TemplateHaskell #-} -- | Contexts for DAML LF static verification module DA.Daml.LF.Verify.Context - ( Delta, Error(..) - , MonadDelta, _dchs, dchs, _devars, devars, _devals, devals + ( Env(..) + , Error(..) + , MonadEnv , UpdateSet(..) - , UpdCreate(..), usCre, usArc, usCho, usVal + , UpdCreate(..) , UpdArchive(..) , UpdChoice(..) - , runDelta - , emptyDelta, setDelta - , introDelta, extVarDelta - , lookupDExprVar, lookupDVal, lookupDChoice - , concatDelta + , runEnv + , emptyEnv + , introEnv, extVarEnv, extValEnv, extChEnv + , lookupVar, lookupVal, lookupChoice + , concatEnv , emptyUpdateSet , concatUpdateSet - , solveValueUpdatesDelta + , solveValueUpdatesEnv , testPrint, lookupChoInHMap ) where -import Control.Lens hiding (Context) import Control.Monad.Error.Class (MonadError (..), throwError) -import Control.Monad.Reader +import Control.Monad.State.Lazy import Data.Maybe (listToMaybe) import qualified Data.HashMap.Strict as HM -import DA.Daml.LF.Ast +import DA.Daml.LF.Ast hiding (lookupChoice) data UpdCreate = UpdCreate { _creTemp :: !(Qualified TypeConName) @@ -68,8 +67,6 @@ data UpdateSet = UpdateSet } deriving Show -makeLenses ''UpdateSet - emptyUpdateSet :: UpdateSet emptyUpdateSet = UpdateSet [] [] [] [] @@ -78,65 +75,75 @@ concatUpdateSet (UpdateSet cres1 arcs1 chos1 vals1) (UpdateSet cres2 arcs2 chos2 UpdateSet (cres1 ++ cres2) (arcs1 ++ arcs2) (chos1 ++ chos2) (vals1 ++ vals2) -- | The environment for the DAML-LF verifier -data Delta = Delta - { _devars :: ![ExprVarName] +data Env = Env + { _envvars :: ![ExprVarName] -- TODO: there seems to be a bug which makes this an infinite list... -- ^ The skolemised term variables. - , _devals :: !(HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) + , _envvals :: !(HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) -- ^ The bound values. - , _dchs :: !(HM.HashMap (Qualified TypeConName, ChoiceName) UpdateSet) + , _envchs :: !(HM.HashMap (Qualified TypeConName, ChoiceName) UpdateSet) -- ^ The set of relevant choices. + , _envdats :: !(HM.HashMap TypeConName DefDataType) + -- ^ The set of data constructors. -- TODO: split this off into data types for readability? } deriving Show -makeLenses ''Delta - -emptyDelta :: Delta -emptyDelta = Delta [] HM.empty HM.empty +emptyEnv :: Env +emptyEnv = Env [] HM.empty HM.empty HM.empty -concatDelta :: Delta -> Delta -> Delta -concatDelta (Delta vars1 vals1 chs1) (Delta vars2 vals2 chs2) = - Delta (vars1 ++ vars2) (vals1 `HM.union` vals2) (chs1 `HM.union` chs2) +concatEnv :: Env -> Env -> Env +concatEnv (Env vars1 vals1 chs1 dats1) (Env vars2 vals2 chs2 dats2) = + Env (vars1 ++ vars2) (vals1 `HM.union` vals2) (chs1 `HM.union` chs2) (dats1 `HM.union` dats2) -- TODO: union makes me slightly nervous, as it allows overlapping keys -- (and just uses the first) -- | Type class constraint with the required monadic effects for functions -- manipulating the verification environment. - -- TODO: I think this should be a mix of a reader and a state monad... -type MonadDelta m = (MonadError Error m, MonadReader Delta m) +type MonadEnv m = (MonadError Error m, MonadState Env m) -runDelta :: ReaderT Delta (Either Error) a -> Delta -> Either Error a -runDelta = runReaderT +runEnv :: StateT Env (Either Error) () -> Env -> Either Error Env +runEnv comp env0 = do + (_res, env) <- runStateT comp env0 + return env +-- TODO: some of these might not be needed anymore. -- | Run a computation in the current environment, with an additional -- environment extension. -introDelta :: MonadDelta m => Delta -> m a -> m a -introDelta delta = local (concatDelta delta) +introEnv :: MonadEnv m => Env -> m () +introEnv env = modify (concatEnv env) + +extVarEnv :: MonadEnv m => ExprVarName -> m () +extVarEnv x = get >>= \env@Env{..} -> put env{_envvars = x : _envvars} --- TODO: This is a bit strange in a reader monad. --- Figure out a way to extend, instead of overwrite every time. -setDelta :: MonadDelta m => Delta -> m a -> m a -setDelta delta = local (const delta) +extValEnv :: MonadEnv m => Qualified ExprValName -> Expr -> UpdateSet -> m () +extValEnv val expr upd = get >>= \env@Env{..} -> put env{_envvals = HM.insert val (expr, upd) _envvals} -extVarDelta :: MonadDelta m => ExprVarName -> m a -> m a -extVarDelta x = local (over devars ((:) x)) +extChEnv :: MonadEnv m => Qualified TypeConName -> ChoiceName -> UpdateSet -> m () +extChEnv tc ch upd = get >>= \env@Env{..} -> put env{_envchs = HM.insert (tc, ch) upd _envchs} -lookupDExprVar :: MonadDelta m => ExprVarName -> m () -lookupDExprVar (ExprVarName "self") = return () -lookupDExprVar (ExprVarName "this") = return () +lookupVar :: MonadEnv m => ExprVarName -> m () +lookupVar (ExprVarName "self") = return () +lookupVar (ExprVarName "this") = return () -- TODO: Is there a nicer way to handle this instead of hardcoding? -lookupDExprVar x = ask >>= \ del -> unless (elem x $ _devars del) +lookupVar x = get >>= \ env -> unless (elem x $ _envvars env) (throwError $ UnboundVar x) -lookupDVal :: MonadDelta m => Qualified ExprValName -> m (Expr, UpdateSet) --- lookupDVal w = view (devals . at w) >>= match _Just (UnknownValue w) -lookupDVal val = do - del <- ask - case lookupValInHMap (_devals del) val of +lookupVal :: MonadEnv m => Qualified ExprValName -> m (Expr, UpdateSet) +lookupVal val = do + env <- get + case lookupValInHMap (_envvals env) val of Just res -> return res Nothing -> throwError (UnknownValue val) +lookupChoice :: MonadEnv m => Qualified TypeConName -> ChoiceName + -> m UpdateSet +lookupChoice _tem ch = do + env <- get + case lookupChoInHMap (_envchs env) ch of + Nothing -> throwError (UnknownChoice ch) + Just upd -> return upd + -- TODO: There seems to be something wrong with the qualifiers. This is a -- temporary solution. lookupValInHMap :: (HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) @@ -149,21 +156,11 @@ lookupChoInHMap :: (HM.HashMap (Qualified TypeConName, ChoiceName) UpdateSet) lookupChoInHMap hmap cho = listToMaybe $ HM.elems $ HM.filterWithKey (\(_, name) _ -> cho == name) hmap -lookupDChoice :: MonadDelta m => Qualified TypeConName -> ChoiceName - -> m UpdateSet -lookupDChoice tem ch = view (dchs . at (tem, ch)) >>= match _Just - (UnknownChoice ch) - --- | Helper functions mirrored from Env. -match :: MonadDelta m => Prism' a b -> Error -> a -> m b -match p err x = either (const (throwError err)) pure (matching p x) --- TODO: no context, like in Gamma - -solveValueUpdatesDelta :: Delta -> Delta -solveValueUpdatesDelta del = - let hmap0 = _devals del +solveValueUpdatesEnv :: Env -> Env +solveValueUpdatesEnv env = + let hmap0 = _envvals env hmap1 = foldl solveValueUpdate hmap0 (HM.keys hmap0) - in del{_devals = hmap1} + in env{_envvals = hmap1} solveValueUpdate :: (HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) -> (Qualified ExprValName) -> HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index ecd0977f7f2f..069d4ab3d2ac 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -1,22 +1,16 @@ -- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -- SPDX-License-Identifier: Apache-2.0 -{-# LANGUAGE TemplateHaskell #-} - -- | Constraint generator for DAML LF static verification module DA.Daml.LF.Verify.Generate ( genPackages , Phase(..) ) where -import Control.Lens hiding (Context) -import Data.HashMap.Strict (singleton, fromList, union) -import Control.Monad.Error.Class (throwError, catchError) -import Control.Monad.Reader +import Control.Monad.Error.Class (throwError) import qualified Data.NameMap as NM -import Debug.Trace -import DA.Daml.LF.Ast +import DA.Daml.LF.Ast hiding (lookupChoice) import DA.Daml.LF.Verify.Context import DA.Daml.LF.Verify.Subst @@ -29,172 +23,135 @@ data GenOutput = GenOutput -- ^ The expression, evaluated as far as possible. , _goUpd :: UpdateSet -- ^ The updates, performed by this expression. - , _goDel :: Delta - -- ^ The context extension, made by this expression. } -makeLenses ''GenOutput +emptyGO :: Expr -> GenOutput +emptyGO expr = GenOutput expr emptyUpdateSet --- | Extend a generator output with the updates and the context extensions of a --- second generator output. Note that the end result will contain the first --- expression. -combineGO :: GenOutput -> GenOutput - -- ^ The two generator outputs to combine. - -> GenOutput +-- | Extend a generator output with the updates of the second generator output. +-- Note that the end result will contain the first expression. +combineGO :: GenOutput -> GenOutput -> GenOutput combineGO genOut1 genOut2 = extendGOUpds (_goUpd genOut2) - $ extendGODelta (_goDel genOut2) genOut1 updateGOExpr :: Expr - -- ^ The new output expression. - -> GenOutput - -- ^ The current generator output. - -> GenOutput -updateGOExpr expr = set goExp expr + -- ^ The new output expression. + -> GenOutput + -- ^ The current generator output. + -> GenOutput +updateGOExpr expr gout = gout{_goExp = expr} extendGOUpds :: UpdateSet - -- ^ The extension of the update set. - -> GenOutput - -- ^ The current generator output. - -> GenOutput -extendGOUpds upds = over goUpd (concatUpdateSet upds) - -extendGODelta :: Delta - -- ^ The additional context extension. - -> GenOutput - -- ^ The current generator output. - -> GenOutput -extendGODelta delta = over goDel (concatDelta delta) - --- | Builds up the Delta environment by recursively extending the environment --- for each computation, and combining the output environments. -buildDelta :: MonadDelta m => Delta -> (a -> m Delta) -> [a] -> m Delta -buildDelta del op args = foldM step del args - where - step d x = concatDelta d <$> setDelta d (op x) - -genPackages :: MonadDelta m => Phase -> [(PackageId, (Package, Maybe PackageName))] -> m Delta -genPackages ph inp = do - del0 <- ask - buildDelta del0 (genPackage ph) inp - -genPackage :: MonadDelta m => Phase -> (PackageId, (Package, Maybe PackageName)) -> m Delta -genPackage ph (id, (pac, _)) = do - del0 <- ask - buildDelta del0 (genModule ph (PRImport id)) (NM.toList $ packageModules pac) + -- ^ The extension of the update set. + -> GenOutput + -- ^ The current generator output. + -> GenOutput +extendGOUpds upds gout@GenOutput{..} = gout{_goUpd = concatUpdateSet upds _goUpd} + +addArchiveUpd :: Qualified TypeConName -> [(FieldName, Expr)] -> GenOutput -> GenOutput +addArchiveUpd temp fs (GenOutput expr upd@UpdateSet{..}) = + GenOutput expr upd{_usArc = (UpdArchive temp fs) : _usArc} + +genPackages :: MonadEnv m => Phase -> [(PackageId, (Package, Maybe PackageName))] -> m () +genPackages ph inp = mapM_ (genPackage ph) inp + +genPackage :: MonadEnv m => Phase -> (PackageId, (Package, Maybe PackageName)) -> m () +genPackage ph (id, (pac, _)) = mapM_ (genModule ph (PRImport id)) (NM.toList $ packageModules pac) -- TODO: Type synonyms and data types are ignored for now. -genModule :: MonadDelta m => Phase -> PackageRef -> Module -> m Delta -genModule ValuePhase pac mod = do - del <- ask - buildDelta del (genValue pac (moduleName mod)) (NM.toList $ moduleValues mod) -genModule TemplatePhase pac mod = do - del <- ask - buildDelta del (genTemplate pac (moduleName mod)) (NM.toList $ moduleTemplates mod) - -genValue :: MonadDelta m => PackageRef -> ModuleName -> DefValue -> m Delta -genValue pac mod val = - catchError - (do { expOut <- genExpr ValuePhase (dvalBody val) - ; let qname = Qualified pac mod (fst $ dvalBinder val) - ; return emptyDelta{_devals = singleton qname (_goExp expOut, _goUpd expOut)} - }) - (\err -> trace (show err) - $ trace ("Fail: " ++ (show $ unExprValName $ fst $ dvalBinder val)) - $ return emptyDelta) +genModule :: MonadEnv m => Phase -> PackageRef -> Module -> m () +genModule ValuePhase pac mod = + mapM_ (genValue pac (moduleName mod)) (NM.toList $ moduleValues mod) +genModule TemplatePhase pac mod = + mapM_ (genTemplate pac (moduleName mod)) (NM.toList $ moduleTemplates mod) + +genValue :: MonadEnv m => PackageRef -> ModuleName -> DefValue -> m () +genValue pac mod val = do + expOut <- genExpr ValuePhase (dvalBody val) + let qname = Qualified pac mod (fst $ dvalBinder val) + extValEnv qname (_goExp expOut) (_goUpd expOut) -- TODO: Handle annotated choices, by returning a set of annotations. -genChoice :: MonadDelta m => Qualified TypeConName -> TemplateChoice - -> m GenOutput +genChoice :: MonadEnv m => Qualified TypeConName -> TemplateChoice + -> m GenOutput genChoice tem cho = do -- TODO: Skolemise chcSelfBinder - expOut <- extVarDelta (fst $ chcArgBinder cho) $ genExpr TemplatePhase (chcUpdate cho) - let updSet = if chcConsuming cho - -- TODO: Convert the `ExprVarName`s to `FieldName`s - then over usArc ((:) (UpdArchive tem [])) (_goUpd expOut) - else _goUpd expOut - return $ set goUpd updSet - $ over (goDel . devars) ((:) (fst $ chcArgBinder cho)) - expOut - -genTemplate :: MonadDelta m => PackageRef -> ModuleName -> Template -> m Delta + extVarEnv (fst $ chcArgBinder cho) + expOut <- genExpr TemplatePhase (chcUpdate cho) + if chcConsuming cho + -- TODO: Convert the `ExprVarName`s to `FieldName`s + then return $ addArchiveUpd tem [] expOut + else return expOut + +genTemplate :: MonadEnv m => PackageRef -> ModuleName -> Template -> m () -- TODO: lookup the data type and skolemise all fieldnames -- TODO: Take precondition into account? genTemplate pac mod Template{..} = do let name = Qualified pac mod tplTypeCon choOuts <- mapM (genChoice name) (NM.toList tplChoices) - let delta = foldl concatDelta emptyDelta (map _goDel choOuts) - choices = fromList $ zip (zip (repeat name) (map chcName $ NM.toList tplChoices)) (map _goUpd choOuts) - return $ over dchs (union choices) delta + mapM_ (\(ch, upd) -> extChEnv name ch upd) + $ zip (map chcName $ NM.toList tplChoices) (map _goUpd choOuts) -genExpr :: MonadDelta m => Phase -> Expr -> m GenOutput +genExpr :: MonadEnv m => Phase -> Expr -> m GenOutput genExpr ph = \case - ETmApp fun arg -> genForTmApp ph fun arg + ETmApp fun arg -> genForTmApp ph fun arg ETyApp expr typ -> genForTyApp ph expr typ - EVar name -> genForVar ph name - EVal w -> genForVal ph w - EUpdate (UCreate tem arg) -> genForCreate ph tem arg + EVar name -> genForVar ph name + EVal w -> genForVal ph w + EUpdate (UCreate tem arg) -> genForCreate ph tem arg EUpdate (UExercise tem ch cid par arg) -> genForExercise ph tem ch cid par arg -- TODO: Extend additional cases - e -> return $ GenOutput e emptyUpdateSet emptyDelta + e -> return $ emptyGO e -genForTmApp :: MonadDelta m => Phase -> Expr -> Expr -> m GenOutput +genForTmApp :: MonadEnv m => Phase -> Expr -> Expr -> m GenOutput genForTmApp ph fun arg = do funOut <- genExpr ph fun argOut <- genExpr ph arg case _goExp funOut of ETmLam bndr body -> do - let updDelta = concatDelta (_goDel funOut) (_goDel argOut) - subst = singleExprSubst (fst bndr) (_goExp argOut) - resExpr = substituteTmTm subst body - resOut <- introDelta updDelta $ genExpr ph resExpr + let subst = singleExprSubst (fst bndr) (_goExp argOut) + resExpr = substituteTmTm subst body + resOut <- genExpr ph resExpr return $ combineGO resOut - $ combineGO funOut argOut - fun' -> return $ updateGOExpr (ETmApp fun' (_goExp argOut)) - $ combineGO funOut argOut + $ combineGO funOut argOut + fun' -> return $ updateGOExpr (ETmApp fun' (_goExp argOut)) + $ combineGO funOut argOut -genForTyApp :: MonadDelta m => Phase -> Expr -> Type -> m GenOutput +genForTyApp :: MonadEnv m => Phase -> Expr -> Type -> m GenOutput genForTyApp ph expr typ = do exprOut <- genExpr ph expr case _goExp exprOut of ETyLam bndr body -> do - let subst = singleTypeSubst (fst bndr) typ + let subst = singleTypeSubst (fst bndr) typ resExpr = substituteTyTm subst body - resOut <- introDelta (_goDel exprOut) $ genExpr ph resExpr + resOut <- genExpr ph resExpr return $ combineGO resOut exprOut - expr' -> return $ updateGOExpr (ETyApp expr' typ) exprOut + expr' -> return $ updateGOExpr (ETyApp expr' typ) exprOut -genForVar :: MonadDelta m => Phase -> ExprVarName -> m GenOutput -genForVar _ph name = lookupDExprVar name - >> return (GenOutput (EVar name) emptyUpdateSet emptyDelta) +genForVar :: MonadEnv m => Phase -> ExprVarName -> m GenOutput +genForVar _ph name = lookupVar name >> return (emptyGO (EVar name)) -genForVal :: MonadDelta m => Phase -> Qualified ExprValName -> m GenOutput +genForVal :: MonadEnv m => Phase -> Qualified ExprValName -> m GenOutput genForVal ValuePhase w - = return $ GenOutput (EVal w) (emptyUpdateSet{_usVal = [w]}) emptyDelta + = return $ GenOutput (EVal w) (emptyUpdateSet{_usVal = [w]}) genForVal TemplatePhase w - = lookupDVal w >>= \ (expr, upds) -> return (GenOutput expr upds emptyDelta) + = lookupVal w >>= \ (expr, upds) -> return (GenOutput expr upds) -genForCreate :: MonadDelta m => Phase -> Qualified TypeConName -> Expr -> m GenOutput +genForCreate :: MonadEnv m => Phase -> Qualified TypeConName -> Expr -> m GenOutput genForCreate ph tem arg = do argOut <- genExpr ph arg case _goExp argOut of - argExpr@(ERecCon _ fs) -> return (GenOutput (EUpdate (UCreate tem argExpr)) - -- TODO: We could potentially filter here - -- to only store the interesting fields? - emptyUpdateSet{_usCre = [UpdCreate tem fs]} - (_goDel argOut)) + argExpr@(ERecCon _ fs) -> + return (GenOutput (EUpdate (UCreate tem argExpr)) emptyUpdateSet{_usCre = [UpdCreate tem fs]}) + -- TODO: We could potentially filter here to only store the interesting fields? _ -> throwError ExpectRecord -genForExercise :: MonadDelta m => Phase -> Qualified TypeConName -> ChoiceName - -> Expr -> Maybe Expr -> Expr - -> m GenOutput +genForExercise :: MonadEnv m => Phase -> Qualified TypeConName -> ChoiceName + -> Expr -> Maybe Expr -> Expr -> m GenOutput genForExercise ph tem ch cid par arg = do cidOut <- genExpr ph cid argOut <- genExpr ph arg - -- TODO: Take possibility into account that the choice is not found? - updSet <- lookupDChoice tem ch - return (GenOutput (EUpdate (UExercise tem ch (_goExp cidOut) par (_goExp argOut))) - updSet - (concatDelta (_goDel cidOut) (_goDel argOut))) + updSet <- lookupChoice tem ch + return (GenOutput (EUpdate (UExercise tem ch (_goExp cidOut) par (_goExp argOut))) updSet) From 28eb1bbde915ebee753196ecf4d109995ffcb9f1 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Fri, 17 Apr 2020 10:35:08 +0200 Subject: [PATCH 10/50] Incorporate data type definitions --- .../src/DA/Daml/LF/Verify/Context.hs | 21 +++++++++-- .../src/DA/Daml/LF/Verify/Generate.hs | 35 +++++++++++-------- 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index b8693454df21..5e011e353002 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -15,13 +15,15 @@ module DA.Daml.LF.Verify.Context , UpdChoice(..) , runEnv , emptyEnv - , introEnv, extVarEnv, extValEnv, extChEnv - , lookupVar, lookupVal, lookupChoice + , introEnv + , extVarEnv, extValEnv, extChEnv, extDatsEnv + , lookupVar, lookupVal, lookupChoice, lookupDataCon , concatEnv , emptyUpdateSet , concatUpdateSet , solveValueUpdatesEnv , testPrint, lookupChoInHMap + , fieldName2VarName ) where import Control.Monad.Error.Class (MonadError (..), throwError) @@ -98,6 +100,9 @@ concatEnv (Env vars1 vals1 chs1 dats1) (Env vars2 vals2 chs2 dats2) = -- TODO: union makes me slightly nervous, as it allows overlapping keys -- (and just uses the first) +fieldName2VarName :: FieldName -> ExprVarName +fieldName2VarName = ExprVarName . unFieldName + -- | Type class constraint with the required monadic effects for functions -- manipulating the verification environment. type MonadEnv m = (MonadError Error m, MonadState Env m) @@ -122,6 +127,9 @@ extValEnv val expr upd = get >>= \env@Env{..} -> put env{_envvals = HM.insert va extChEnv :: MonadEnv m => Qualified TypeConName -> ChoiceName -> UpdateSet -> m () extChEnv tc ch upd = get >>= \env@Env{..} -> put env{_envchs = HM.insert (tc, ch) upd _envchs} +extDatsEnv :: MonadEnv m => HM.HashMap TypeConName DefDataType -> m () +extDatsEnv hmap = get >>= \env@Env{..} -> put env{_envdats = hmap `HM.union` _envdats} + lookupVar :: MonadEnv m => ExprVarName -> m () lookupVar (ExprVarName "self") = return () lookupVar (ExprVarName "this") = return () @@ -144,6 +152,13 @@ lookupChoice _tem ch = do Nothing -> throwError (UnknownChoice ch) Just upd -> return upd +lookupDataCon :: MonadEnv m => TypeConName -> m DefDataType +lookupDataCon tc = do + env <- get + case HM.lookup tc (_envdats env) of + Nothing -> throwError (UnknownDataCons tc) + Just def -> return def + -- TODO: There seems to be something wrong with the qualifiers. This is a -- temporary solution. lookupValInHMap :: (HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) @@ -179,6 +194,7 @@ solveValueUpdate hmap0 val0 = data Error = UnknownValue (Qualified ExprValName) + | UnknownDataCons TypeConName | UnknownChoice ChoiceName | UnboundVar ExprVarName | ExpectRecord @@ -187,6 +203,7 @@ data Error instance Show Error where show (UnknownValue qname) = ("Impossible: Unknown value definition: " ++ (show $ unExprValName $ qualObject qname)) + show (UnknownDataCons tc) = ("Impossible: Unknown data constructor: " ++ (show tc)) show (UnknownChoice ch) = ("Impossible: Unknown choice definition: " ++ (show ch)) show (UnboundVar name) = ("Impossible: Unbound term variable: " ++ (show name)) show ExpectRecord = "Impossible: Expected a record type" diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index 069d4ab3d2ac..3a6ac3347209 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -31,9 +31,7 @@ emptyGO expr = GenOutput expr emptyUpdateSet -- | Extend a generator output with the updates of the second generator output. -- Note that the end result will contain the first expression. combineGO :: GenOutput -> GenOutput -> GenOutput -combineGO genOut1 genOut2 - = extendGOUpds (_goUpd genOut2) - genOut1 +combineGO genOut1 genOut2 = extendGOUpds (_goUpd genOut2) genOut1 updateGOExpr :: Expr -- ^ The new output expression. @@ -59,9 +57,9 @@ genPackages ph inp = mapM_ (genPackage ph) inp genPackage :: MonadEnv m => Phase -> (PackageId, (Package, Maybe PackageName)) -> m () genPackage ph (id, (pac, _)) = mapM_ (genModule ph (PRImport id)) (NM.toList $ packageModules pac) --- TODO: Type synonyms and data types are ignored for now. genModule :: MonadEnv m => Phase -> PackageRef -> Module -> m () -genModule ValuePhase pac mod = +genModule ValuePhase pac mod = do + extDatsEnv (NM.toHashMap (moduleDataTypes mod)) mapM_ (genValue pac (moduleName mod)) (NM.toList $ moduleValues mod) genModule TemplatePhase pac mod = mapM_ (genTemplate pac (moduleName mod)) (NM.toList $ moduleTemplates mod) @@ -73,25 +71,34 @@ genValue pac mod val = do extValEnv qname (_goExp expOut) (_goUpd expOut) -- TODO: Handle annotated choices, by returning a set of annotations. -genChoice :: MonadEnv m => Qualified TypeConName -> TemplateChoice - -> m GenOutput -genChoice tem cho = do +genChoice :: MonadEnv m => Qualified TypeConName -> [FieldName] -> [ExprVarName] + -> TemplateChoice -> m GenOutput +genChoice tem fs xs cho = do -- TODO: Skolemise chcSelfBinder extVarEnv (fst $ chcArgBinder cho) expOut <- genExpr TemplatePhase (chcUpdate cho) if chcConsuming cho - -- TODO: Convert the `ExprVarName`s to `FieldName`s - then return $ addArchiveUpd tem [] expOut + then let fields = map (\(f,x) -> (f,EVar x)) (zip fs xs) + in return $ addArchiveUpd tem fields expOut else return expOut genTemplate :: MonadEnv m => PackageRef -> ModuleName -> Template -> m () --- TODO: lookup the data type and skolemise all fieldnames -- TODO: Take precondition into account? genTemplate pac mod Template{..} = do let name = Qualified pac mod tplTypeCon - choOuts <- mapM (genChoice name) (NM.toList tplChoices) - mapM_ (\(ch, upd) -> extChEnv name ch upd) - $ zip (map chcName $ NM.toList tplChoices) (map _goUpd choOuts) + datatyp <- lookupDataCon tplTypeCon + case dataCons datatyp of + DataRecord fields -> do + -- TODO: skolemise only when defining the choice? But then multiple choice + -- would skolemise multiple times... + -- TODO: skolemise the fields themselves or rather self.field? + let fs = map fst fields + let xs = map fieldName2VarName fs + mapM_ extVarEnv xs + choOuts <- mapM (genChoice name fs xs) (NM.toList tplChoices) + mapM_ (\(ch, upd) -> extChEnv name ch upd) + $ zip (map chcName $ NM.toList tplChoices) (map _goUpd choOuts) + _ -> error "Impossible: Template defined on non-record data type" genExpr :: MonadEnv m => Phase -> Expr -> m GenOutput genExpr ph = \case From 80bb27a078b478821431753734985d4017590643 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Tue, 21 Apr 2020 10:56:43 +0200 Subject: [PATCH 11/50] Various constraint generation bug fixes and improvements --- .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 14 +- .../src/DA/Daml/LF/Verify/Context.hs | 137 ++++++++++++++---- .../src/DA/Daml/LF/Verify/Generate.hs | 104 +++++++++---- test.out | 50 +++++++ 4 files changed, 249 insertions(+), 56 deletions(-) create mode 100644 test.out diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index 8900e3100484..e0075d02f639 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -5,11 +5,14 @@ module DA.Daml.LF.Verify ( main ) where import Options.Applicative +import Data.Maybe (fromJust) import DA.Daml.LF.Ast.Base import DA.Daml.LF.Verify.Generate import DA.Daml.LF.Verify.Read import DA.Daml.LF.Verify.Context +import DA.Pretty +-- import qualified Data.NameMap as NM -- TODO: temporarily hardcoded choiceName :: ChoiceName @@ -19,11 +22,20 @@ main :: IO () main = do Options{..} <- execParser optionsParserInfo pkgs <- readPackages optInputDars + -- mapM_ (putStrLn . renderPretty) (concat (map (NM.toList . packageModules . fst . snd) pkgs)) putStrLn "Start value phase" >> case runEnv (genPackages ValuePhase pkgs) emptyEnv of Left err-> putStrLn "Value phase finished with error: " >> print err Right env1 -> putStrLn "Start solving" >> let env2 = solveValueUpdatesEnv env1 in putStrLn "Start template phase" >> case runEnv (genPackages TemplatePhase pkgs) env2 of Left err -> putStrLn "Template phase finished with error: " >> print err - Right env3 -> putStrLn "Success!" >> print (lookupChoInHMap (_envchs env3) choiceName) + Right env3 -> do + putStrLn "Success!" + let upds = fromJust $ lookupChoInHMap (_envchs env3) choiceName + mapM_ (\cre -> putStrLn "Create: " >> print (qualObject $ _creTemp cre) >> printFExpr (_creField cre) >> putStrLn "") (_usCre upds) + mapM_ (\arc -> putStrLn "Archive: " >> print (qualObject $ _arcTemp arc) >> printFExpr (_arcField arc) >> putStrLn "") (_usArc upds) + mapM_ (\cho -> putStrLn "Choice: " >> print (_choName cho) >> putStrLn "") (_usCho upds) + putStrLn "Let's start solving!" +printFExpr :: [(FieldName, Expr)] -> IO () +printFExpr fields = mapM_ (\(f,e) -> putStrLn (show f ++ " : " ++ renderPretty e)) fields diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 5e011e353002..f64ba1fccc9a 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -16,19 +16,22 @@ module DA.Daml.LF.Verify.Context , runEnv , emptyEnv , introEnv - , extVarEnv, extValEnv, extChEnv, extDatsEnv - , lookupVar, lookupVal, lookupChoice, lookupDataCon + , extVarEnv, extRecEnv, extValEnv, extChEnv, extDatsEnv + , extRecEnvLvl1 + , lookupVar, lookupRec, lookupVal, lookupChoice, lookupDataCon , concatEnv , emptyUpdateSet , concatUpdateSet , solveValueUpdatesEnv , testPrint, lookupChoInHMap , fieldName2VarName + , recTypConFields, recTypFields, recExpFields ) where import Control.Monad.Error.Class (MonadError (..), throwError) import Control.Monad.State.Lazy -import Data.Maybe (listToMaybe) +import Data.Maybe (listToMaybe, isJust) +import Data.List (find) import qualified Data.HashMap.Strict as HM import DA.Daml.LF.Ast hiding (lookupChoice) @@ -76,11 +79,18 @@ concatUpdateSet :: UpdateSet -> UpdateSet -> UpdateSet concatUpdateSet (UpdateSet cres1 arcs1 chos1 vals1) (UpdateSet cres2 arcs2 chos2 vals2) = UpdateSet (cres1 ++ cres2) (arcs1 ++ arcs2) (chos1 ++ chos2) (vals1 ++ vals2) +data Skolem + = SkolVar ExprVarName + -- ^ Skolemised term variable. + | SkolRec ExprVarName [FieldName] + -- ^ List of skolemised field names, with their variable. + -- e.g. `this.field` + deriving (Eq, Show) + -- | The environment for the DAML-LF verifier data Env = Env - { _envvars :: ![ExprVarName] - -- TODO: there seems to be a bug which makes this an infinite list... - -- ^ The skolemised term variables. + { _envskol :: ![Skolem] + -- ^ The skolemised term variables and fields. , _envvals :: !(HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) -- ^ The bound values. , _envchs :: !(HM.HashMap (Qualified TypeConName, ChoiceName) UpdateSet) @@ -119,7 +129,12 @@ introEnv :: MonadEnv m => Env -> m () introEnv env = modify (concatEnv env) extVarEnv :: MonadEnv m => ExprVarName -> m () -extVarEnv x = get >>= \env@Env{..} -> put env{_envvars = x : _envvars} +extVarEnv x = get >>= \env@Env{..} -> put env{_envskol = SkolVar x : _envskol} + +-- TODO: Problem! ExprVarName is always `this` or `arg`, so it overwrites!! +-- Possible solution: pass in the current template? +extRecEnv :: MonadEnv m => ExprVarName -> [FieldName] -> m () +extRecEnv x fs = get >>= \env@Env{..} -> put env{_envskol = SkolRec x fs : _envskol} extValEnv :: MonadEnv m => Qualified ExprValName -> Expr -> UpdateSet -> m () extValEnv val expr upd = get >>= \env@Env{..} -> put env{_envvals = HM.insert val (expr, upd) _envvals} @@ -130,13 +145,33 @@ extChEnv tc ch upd = get >>= \env@Env{..} -> put env{_envchs = HM.insert (tc, ch extDatsEnv :: MonadEnv m => HM.HashMap TypeConName DefDataType -> m () extDatsEnv hmap = get >>= \env@Env{..} -> put env{_envdats = hmap `HM.union` _envdats} +-- TODO: Is one layer of recursion enough? +extRecEnvLvl1 :: MonadEnv m => [(FieldName, Type)] -> m () +extRecEnvLvl1 = mapM_ step + where + step :: MonadEnv m => (FieldName, Type) -> m () + step (f,typ) = do + { fsRec <- recTypFields typ + ; extRecEnv (fieldName2VarName f) fsRec + } + -- TODO: Temporary fix + `catchError` (\_ -> return ()) + lookupVar :: MonadEnv m => ExprVarName -> m () lookupVar (ExprVarName "self") = return () lookupVar (ExprVarName "this") = return () -- TODO: Is there a nicer way to handle this instead of hardcoding? -lookupVar x = get >>= \ env -> unless (elem x $ _envvars env) +lookupVar x = get >>= \ env -> unless (elem (SkolVar x) $ _envskol env) (throwError $ UnboundVar x) +lookupRec :: MonadEnv m => ExprVarName -> FieldName -> m Bool +lookupRec x f = do + env <- get + let fields = [ fs | SkolRec y fs <- _envskol env , x == y ] + if not (null fields) + then return (elem f $ head fields) + else return False + lookupVal :: MonadEnv m => Qualified ExprValName -> m (Expr, UpdateSet) lookupVal val = do env <- get @@ -146,6 +181,11 @@ lookupVal val = do lookupChoice :: MonadEnv m => Qualified TypeConName -> ChoiceName -> m UpdateSet +-- TODO: Actually bind this, instead of hardcoding +lookupChoice tem (ChoiceName "Archive") = do + fs <- recTypConFields $ qualObject tem + let fields = map ((\f -> (f, EVar $ fieldName2VarName f)) . fst) fs + return emptyUpdateSet{_usArc = [UpdArchive tem fields]} lookupChoice _tem ch = do env <- get case lookupChoInHMap (_envchs env) ch of @@ -161,12 +201,12 @@ lookupDataCon tc = do -- TODO: There seems to be something wrong with the qualifiers. This is a -- temporary solution. -lookupValInHMap :: (HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) +lookupValInHMap :: HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) -> Qualified ExprValName -> Maybe (Expr, UpdateSet) lookupValInHMap hmap val = listToMaybe $ HM.elems - $ HM.filterWithKey (\name _ -> (qualObject name) == (qualObject val)) hmap + $ HM.filterWithKey (\name _ -> qualObject name == qualObject val) hmap -lookupChoInHMap :: (HM.HashMap (Qualified TypeConName, ChoiceName) UpdateSet) +lookupChoInHMap :: HM.HashMap (Qualified TypeConName, ChoiceName) UpdateSet -> ChoiceName -> Maybe UpdateSet lookupChoInHMap hmap cho = listToMaybe $ HM.elems $ HM.filterWithKey (\(_, name) _ -> cho == name) hmap @@ -177,40 +217,79 @@ solveValueUpdatesEnv env = hmap1 = foldl solveValueUpdate hmap0 (HM.keys hmap0) in env{_envvals = hmap1} -solveValueUpdate :: (HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) - -> (Qualified ExprValName) -> HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) +solveValueUpdate :: HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) + -> Qualified ExprValName -> HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) solveValueUpdate hmap0 val0 = - let (hmap1, _) = step (hmap0, emptyUpdateSet) val0 + let (hmap1, _, _) = step (hmap0, emptyUpdateSet, []) val0 in hmap1 where - step :: ((HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)), UpdateSet) - -> (Qualified ExprValName) - -> ((HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)), UpdateSet) - step (hmap, baseupd) val = case lookupValInHMap hmap val of - Nothing -> error ("Impossible! Undefined value: " ++ (show $ unExprValName $ qualObject val)) - Just (expr, valupd) -> - let (nhmap, nvalupd) = foldl step (hmap, valupd{_usVal = []}) (_usVal valupd) - in (HM.insert val (expr, nvalupd) nhmap, concatUpdateSet baseupd nvalupd) + step :: (HM.HashMap (Qualified ExprValName) (Expr, UpdateSet), UpdateSet, [Qualified ExprValName]) + -> Qualified ExprValName + -> (HM.HashMap (Qualified ExprValName) (Expr, UpdateSet), UpdateSet, [Qualified ExprValName]) + step inp@(hmap, baseupd, vis) val = + if val `elem` vis + -- TODO: Mutual recursion! For now, just ignore... + then inp + else case lookupValInHMap hmap val of + Nothing -> error ("Impossible! Undefined value: " ++ (show $ unExprValName $ qualObject val)) + Just (expr, valupd) -> + let (nhmap, nvalupd, _) = foldl step (hmap, valupd{_usVal = []}, val:vis) (_usVal valupd) + in (HM.insert val (expr, nvalupd) nhmap, concatUpdateSet baseupd nvalupd, val:vis) + +-- TODO: This should work recursively +recTypConFields :: MonadEnv m => TypeConName -> m [(FieldName,Type)] +recTypConFields tc = lookupDataCon tc >>= \dat -> case dataCons dat of + DataRecord fields -> return fields + _ -> throwError ExpectRecord + +recTypFields :: MonadEnv m => Type -> m [FieldName] +recTypFields (TCon tc) = do + fields <- recTypConFields $ qualObject tc + return $ map fst fields +recTypFields _ = throwError ExpectRecord + +recExpFields :: MonadEnv m => Expr -> m [(FieldName, Expr)] +recExpFields (EVar x) = do + env <- get + let fss = [ fs | SkolRec y fs <- _envskol env , x == y ] + if not (null fss) + -- TODO: I would prefer `this.amount` here + then return $ zip (head fss) (map (EVar . fieldName2VarName) $ head fss) + else throwError $ UnboundVar x +recExpFields (ERecCon _ fs) = return fs +recExpFields (ERecUpd _ f recExp fExp) = do + fs <- recExpFields recExp + unless (isJust $ find (\(n, _) -> n == f) fs) (throwError $ UnknownRecField f) + return $ (f, fExp) : [(n, e) | (n, e) <- fs, n /= f] +-- recExpFields _ = throwError ExpectRecord +recExpFields (ERecProj _ f e) = do + fields <- recExpFields e + case lookup f fields of + Just e' -> recExpFields e' + Nothing -> throwError $ UnknownRecField f +recExpFields e = error ("Expected record: " ++ show e) data Error = UnknownValue (Qualified ExprValName) | UnknownDataCons TypeConName | UnknownChoice ChoiceName | UnboundVar ExprVarName + | UnknownRecField FieldName | ExpectRecord | CyclicModules [ModuleName] instance Show Error where - show (UnknownValue qname) = ("Impossible: Unknown value definition: " - ++ (show $ unExprValName $ qualObject qname)) - show (UnknownDataCons tc) = ("Impossible: Unknown data constructor: " ++ (show tc)) - show (UnknownChoice ch) = ("Impossible: Unknown choice definition: " ++ (show ch)) - show (UnboundVar name) = ("Impossible: Unbound term variable: " ++ (show name)) + show (UnknownValue qname) = "Impossible: Unknown value definition: " + ++ (show $ unExprValName $ qualObject qname) + show (UnknownDataCons tc) = "Impossible: Unknown data constructor: " ++ show tc + show (UnknownChoice ch) = "Impossible: Unknown choice definition: " ++ show ch + show (UnboundVar name) = "Impossible: Unbound term variable: " ++ show name + show (UnknownRecField f) = "Impossible: Unknown record field: " ++ show f show ExpectRecord = "Impossible: Expected a record type" - show (CyclicModules mods) = "Cyclic modules: " ++ (show mods) + show (CyclicModules mods) = "Cyclic modules: " ++ show mods -- | For testing purposes: print the stored value definitions in the environment. -- TODO: Remove -testPrint :: (HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) -> IO () +testPrint :: HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) -> IO () testPrint hmap = putStrLn "Test print keys:" >> mapM_ print (HM.keys hmap) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index 3a6ac3347209..e5809f696ec6 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -5,14 +5,17 @@ module DA.Daml.LF.Verify.Generate ( genPackages , Phase(..) + , genExpr -- TODO: remove ) where -import Control.Monad.Error.Class (throwError) +-- import Control.Monad.Error.Class (throwError) import qualified Data.NameMap as NM +import Data.Bifunctor (second) import DA.Daml.LF.Ast hiding (lookupChoice) import DA.Daml.LF.Verify.Context import DA.Daml.LF.Verify.Subst +-- import DA.Pretty data Phase = ValuePhase @@ -49,7 +52,7 @@ extendGOUpds upds gout@GenOutput{..} = gout{_goUpd = concatUpdateSet upds _goUpd addArchiveUpd :: Qualified TypeConName -> [(FieldName, Expr)] -> GenOutput -> GenOutput addArchiveUpd temp fs (GenOutput expr upd@UpdateSet{..}) = - GenOutput expr upd{_usArc = (UpdArchive temp fs) : _usArc} + GenOutput expr upd{_usArc = UpdArchive temp fs : _usArc} genPackages :: MonadEnv m => Phase -> [(PackageId, (Package, Maybe PackageName))] -> m () genPackages ph inp = mapM_ (genPackage ph) inp @@ -73,12 +76,15 @@ genValue pac mod val = do -- TODO: Handle annotated choices, by returning a set of annotations. genChoice :: MonadEnv m => Qualified TypeConName -> [FieldName] -> [ExprVarName] -> TemplateChoice -> m GenOutput -genChoice tem fs xs cho = do - -- TODO: Skolemise chcSelfBinder - extVarEnv (fst $ chcArgBinder cho) - expOut <- genExpr TemplatePhase (chcUpdate cho) - if chcConsuming cho - then let fields = map (\(f,x) -> (f,EVar x)) (zip fs xs) +genChoice tem temFs temXs TemplateChoice{..} = do + extVarEnv chcSelfBinder + extVarEnv (fst chcArgBinder) + argFs <- recTypFields (snd chcArgBinder) + extRecEnv (fst chcArgBinder) argFs + expOut <- genExpr TemplatePhase chcUpdate + if chcConsuming + -- TODO: This is weird. Either drop (as it's quite obvious), or use `amount = this.amount`, so we can at the very least drop the xs argument. + then let fields = zipWith (curry (second EVar)) temFs temXs in return $ addArchiveUpd tem fields expOut else return expOut @@ -86,28 +92,33 @@ genTemplate :: MonadEnv m => PackageRef -> ModuleName -> Template -> m () -- TODO: Take precondition into account? genTemplate pac mod Template{..} = do let name = Qualified pac mod tplTypeCon - datatyp <- lookupDataCon tplTypeCon - case dataCons datatyp of - DataRecord fields -> do - -- TODO: skolemise only when defining the choice? But then multiple choice - -- would skolemise multiple times... - -- TODO: skolemise the fields themselves or rather self.field? - let fs = map fst fields - let xs = map fieldName2VarName fs - mapM_ extVarEnv xs - choOuts <- mapM (genChoice name fs xs) (NM.toList tplChoices) - mapM_ (\(ch, upd) -> extChEnv name ch upd) - $ zip (map chcName $ NM.toList tplChoices) (map _goUpd choOuts) - _ -> error "Impossible: Template defined on non-record data type" + fields <- recTypConFields tplTypeCon + -- TODO: skolemise only when defining the choice? But then multiple choice + -- would skolemise multiple times... + -- TODO: skolemise the fields themselves or rather self.field? + let fs = map fst fields + xs = map fieldName2VarName fs + -- TODO: if daml indead translates into `amount = this.amount`, this can be dropped. + mapM_ extVarEnv xs + extRecEnv tplParam fs + extRecEnvLvl1 fields + choOuts <- mapM (genChoice name fs xs) (NM.toList tplChoices) + mapM_ (\(ch, upd) -> extChEnv name ch upd) + $ zip (map chcName $ NM.toList tplChoices) (map _goUpd choOuts) genExpr :: MonadEnv m => Phase -> Expr -> m GenOutput genExpr ph = \case ETmApp fun arg -> genForTmApp ph fun arg ETyApp expr typ -> genForTyApp ph expr typ + ELet bind body -> genForLet ph bind body EVar name -> genForVar ph name EVal w -> genForVal ph w + ERecProj tc f e -> genForRecProj ph tc f e + ELocation _ expr -> genExpr ph expr EUpdate (UCreate tem arg) -> genForCreate ph tem arg EUpdate (UExercise tem ch cid par arg) -> genForExercise ph tem ch cid par arg + EUpdate (UBind bind expr) -> genForBind ph bind expr + EUpdate (UPure _ expr) -> genExpr ph expr -- TODO: Extend additional cases e -> return $ emptyGO e @@ -136,6 +147,18 @@ genForTyApp ph expr typ = do return $ combineGO resOut exprOut expr' -> return $ updateGOExpr (ETyApp expr' typ) exprOut +genForLet :: MonadEnv m => Phase -> Binding -> Expr -> m GenOutput +genForLet ph bind body = do + -- TODO: temporary test; remove + -- let testSubst = singleExprSubst (fst $ bindingBinder bind) (bindingBound bind) + -- testRec = (==) (substituteTmTm testSubst (bindingBound bind)) (bindingBound bind) + -- unless testRec (error "Recursive function!") + bindOut <- genExpr ph (bindingBound bind) + let subst = singleExprSubst (fst $ bindingBinder bind) (_goExp bindOut) + resExpr = substituteTmTm subst body + resOut <- genExpr ph resExpr + return $ combineGO resOut bindOut + genForVar :: MonadEnv m => Phase -> ExprVarName -> m GenOutput genForVar _ph name = lookupVar name >> return (emptyGO (EVar name)) @@ -145,14 +168,30 @@ genForVal ValuePhase w genForVal TemplatePhase w = lookupVal w >>= \ (expr, upds) -> return (GenOutput expr upds) +genForRecProj :: MonadEnv m => Phase -> TypeConApp -> FieldName -> Expr -> m GenOutput +genForRecProj ph tc f body = do + bodyOut <- genExpr ph body + case _goExp bodyOut of + -- TODO: I think we can reduce duplication a bit more here + EVar x -> do + skol <- lookupRec x f + if skol + then return $ updateGOExpr (ERecProj tc f (EVar x)) bodyOut + else error ("Impossible: expected skolem record: " ++ show x ++ "." ++ show f) + expr -> do + fs <- recExpFields expr + case lookup f fs of + Just expr -> genExpr ph expr + -- TODO: Temporary solution + Nothing -> return $ updateGOExpr (ERecProj tc f expr) bodyOut + -- Nothing -> throwError $ UnknownRecField f + genForCreate :: MonadEnv m => Phase -> Qualified TypeConName -> Expr -> m GenOutput genForCreate ph tem arg = do argOut <- genExpr ph arg - case _goExp argOut of - argExpr@(ERecCon _ fs) -> - return (GenOutput (EUpdate (UCreate tem argExpr)) emptyUpdateSet{_usCre = [UpdCreate tem fs]}) - -- TODO: We could potentially filter here to only store the interesting fields? - _ -> throwError ExpectRecord + fs <- recExpFields (_goExp argOut) + return (GenOutput (EUpdate (UCreate tem $ _goExp argOut)) emptyUpdateSet{_usCre = [UpdCreate tem fs]}) + -- TODO: We could potentially filter here to only store the interesting fields? genForExercise :: MonadEnv m => Phase -> Qualified TypeConName -> ChoiceName -> Expr -> Maybe Expr -> Expr -> m GenOutput @@ -162,3 +201,16 @@ genForExercise ph tem ch cid par arg = do updSet <- lookupChoice tem ch return (GenOutput (EUpdate (UExercise tem ch (_goExp cidOut) par (_goExp argOut))) updSet) +-- TODO: handle binds by substituting? +genForBind :: MonadEnv m => Phase -> Binding -> Expr -> m GenOutput +-- TODO: The way we treat updates seems wrong. This should not be a special case. +genForBind ph bind body = do + bindOut <- genExpr ph (bindingBound bind) + case _goExp bindOut of + EUpdate (UFetch tc _cid) -> do + fs <- recTypConFields $ qualObject tc + extRecEnv (fst $ bindingBinder bind) (map fst fs) + _ -> return () + extVarEnv (fst $ bindingBinder bind) + bodyOut <- genExpr ph body + return $ combineGO bodyOut bindOut diff --git a/test.out b/test.out new file mode 100644 index 000000000000..ef7dcc67fac2 --- /dev/null +++ b/test.out @@ -0,0 +1,50 @@ +INFO: Invocation ID: 86d2137f-16c1-4bf0-aa67-9d6ac7ccae6d +Loading: +Loading: 0 packages loaded +Analyzing: target //compiler/daml-lf-verify:daml-lf-verify (0 packages loaded, 0 targets configured) +INFO: Analyzed target //compiler/daml-lf-verify:daml-lf-verify (0 packages loaded, 0 targets configured). +INFO: Found 1 target... +[0 / 4] [Prepa] BazelWorkspaceStatusAction stable-status.txt +[1 / 4] HaskellBuildBinary //compiler/daml-lf-verify:daml-lf-verify; 1s remote-cache, linux-sandbox +[2 / 4] [Prepa] HaskellLinkBinary compiler/daml-lf-verify/daml-lf-verify +[2 / 4] HaskellLinkBinary compiler/daml-lf-verify/daml-lf-verify; 1s remote-cache, linux-sandbox +Target //compiler/daml-lf-verify:daml-lf-verify up-to-date: + bazel-bin/compiler/daml-lf-verify/daml-lf-verify +INFO: Elapsed time: 8.577s, Critical Path: 8.22s +INFO: 2 processes: 2 linux-sandbox. +INFO: Build completed successfully, 3 total actions +INFO: Running command line: bazel-bin/compiler/daml-lf-verify/daml-lf-verify /home/gertjan/stack/DAML/quickstart/.daml/dist/quickstart-0.0.1.dar +INFO: Build completed successfully, 3 total actions +Start value phase +Start solving +Start template phase +Success! +Create: +TypeConName {unTypeConName = ["Iou"]} +FieldName {unFieldName = "amount"} : ADD_NUMERIC @10 (Iou:Iou.amount this) (Iou:Iou.amount otherIou) +FieldName {unFieldName = "issuer"} : issuer +FieldName {unFieldName = "owner"} : owner +FieldName {unFieldName = "currency"} : currency +FieldName {unFieldName = "observers"} : observers + +Archive: +TypeConName {unTypeConName = ["Iou"]} +FieldName {unFieldName = "issuer"} : issuer +FieldName {unFieldName = "owner"} : owner +FieldName {unFieldName = "currency"} : currency +FieldName {unFieldName = "amount"} : amount +FieldName {unFieldName = "observers"} : observers + +Archive: +TypeConName {unTypeConName = ["IouTrade"]} +FieldName {unFieldName = "buyer"} : buyer +FieldName {unFieldName = "seller"} : seller +FieldName {unFieldName = "baseIouCid"} : baseIouCid +FieldName {unFieldName = "baseIssuer"} : baseIssuer +FieldName {unFieldName = "baseCurrency"} : baseCurrency +FieldName {unFieldName = "baseAmount"} : baseAmount +FieldName {unFieldName = "quoteIssuer"} : quoteIssuer +FieldName {unFieldName = "quoteCurrency"} : quoteCurrency +FieldName {unFieldName = "quoteAmount"} : quoteAmount + +Let's start solving! From 220d21d25f73ef0c3115e050675ea7f4d6cd58d4 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Tue, 21 Apr 2020 16:15:02 +0200 Subject: [PATCH 12/50] First part of constraint solving --- .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 14 +++- .../src/DA/Daml/LF/Verify/Context.hs | 1 + .../src/DA/Daml/LF/Verify/Generate.hs | 1 - .../src/DA/Daml/LF/Verify/Solve.hs | 73 +++++++++++++++++++ 4 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index e0075d02f639..a8b9c77b9cf0 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -9,15 +9,22 @@ import Data.Maybe (fromJust) import DA.Daml.LF.Ast.Base import DA.Daml.LF.Verify.Generate +import DA.Daml.LF.Verify.Solve import DA.Daml.LF.Verify.Read import DA.Daml.LF.Verify.Context import DA.Pretty -- import qualified Data.NameMap as NM -- TODO: temporarily hardcoded +templName :: TypeConName +templName = TypeConName ["Iou"] + choiceName :: ChoiceName choiceName = ChoiceName "Iou_Split" +fieldName :: FieldName +fieldName = FieldName "amount" + main :: IO () main = do Options{..} <- execParser optionsParserInfo @@ -25,7 +32,7 @@ main = do -- mapM_ (putStrLn . renderPretty) (concat (map (NM.toList . packageModules . fst . snd) pkgs)) putStrLn "Start value phase" >> case runEnv (genPackages ValuePhase pkgs) emptyEnv of Left err-> putStrLn "Value phase finished with error: " >> print err - Right env1 -> putStrLn "Start solving" >> + Right env1 -> putStrLn "Start value solving" >> let env2 = solveValueUpdatesEnv env1 in putStrLn "Start template phase" >> case runEnv (genPackages TemplatePhase pkgs) env2 of Left err -> putStrLn "Template phase finished with error: " >> print err @@ -35,7 +42,10 @@ main = do mapM_ (\cre -> putStrLn "Create: " >> print (qualObject $ _creTemp cre) >> printFExpr (_creField cre) >> putStrLn "") (_usCre upds) mapM_ (\arc -> putStrLn "Archive: " >> print (qualObject $ _arcTemp arc) >> printFExpr (_arcField arc) >> putStrLn "") (_usArc upds) mapM_ (\cho -> putStrLn "Choice: " >> print (_choName cho) >> putStrLn "") (_usCho upds) - putStrLn "Let's start solving!" + putStrLn "Start constraint solving phase" + let cset = constructConstr env3 templName choiceName fieldName + putStr "Create: " >> print (_cCres cset) + putStr "Archive: " >> print (_cArcs cset) printFExpr :: [(FieldName, Expr)] -> IO () printFExpr fields = mapM_ (\(f,e) -> putStrLn (show f ++ " : " ++ renderPretty e)) fields diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index f64ba1fccc9a..c8142150ea32 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -13,6 +13,7 @@ module DA.Daml.LF.Verify.Context , UpdCreate(..) , UpdArchive(..) , UpdChoice(..) + , Skolem(..) , runEnv , emptyEnv , introEnv diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index e5809f696ec6..4dce66b41025 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -5,7 +5,6 @@ module DA.Daml.LF.Verify.Generate ( genPackages , Phase(..) - , genExpr -- TODO: remove ) where -- import Control.Monad.Error.Class (throwError) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs new file mode 100644 index 000000000000..bd1df2a076a6 --- /dev/null +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -0,0 +1,73 @@ +-- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + +-- | Constraint solver for DAML LF static verification +module DA.Daml.LF.Verify.Solve + ( constructConstr + , ConstraintSet(..) + ) where + +import Data.Maybe (fromJust) +import Data.List (lookup) +import qualified Data.Text as T + +import DA.Daml.LF.Ast.Base +import DA.Daml.LF.Verify.Context +-- import DA.Pretty + +-- | A simple form of expressions featuring basic arithmetic. +data ConstraintExpr + -- | Reference to an expression variable. + = CVar !ExprVarName + -- | Sum of two expressions. + | CSum !ConstraintExpr !ConstraintExpr + -- | Subtraction of two expressions. + | CSub !ConstraintExpr !ConstraintExpr + +instance Show ConstraintExpr where + show (CVar x) = T.unpack $ unExprVarName x + show (CSum e1 e2) = show e1 ++ " + " ++ show e2 + show (CSub e1 e2) = show e1 ++ " - " ++ show e2 + +exp2CExp :: Expr -> ConstraintExpr +exp2CExp (EVar x) = CVar x +exp2CExp (ERecProj _ f (EVar x)) = CVar $ recProj2Var x f +exp2CExp (ETmApp (ETmApp (ETyApp (EBuiltin b) _) e1) e2) = case b of + BEAddNumeric -> CSum (exp2CExp e1) (exp2CExp e2) + BESubNumeric -> CSub (exp2CExp e1) (exp2CExp e2) + _ -> error ("Builtin: " ++ show b) +exp2CExp e = error ("Conversion: " ++ show e) +-- exp2CExp e = error ("Conversion: " ++ renderPretty e) + +skol2var :: Skolem -> [ExprVarName] +skol2var (SkolVar x) = [x] +skol2var (SkolRec x fs) = map (recProj2Var x) fs + +recProj2Var :: ExprVarName -> FieldName -> ExprVarName +recProj2Var (ExprVarName x) (FieldName f) = ExprVarName (x `T.append` "." `T.append` f) + +-- | The set of constraints to be solved. +data ConstraintSet = ConstraintSet + { _cVars :: ![ExprVarName] + -- ^ The variables to be declared. + , _cCres :: ![ConstraintExpr] + -- ^ The field values of all newly created instances. + , _cArcs :: ![ConstraintExpr] + -- ^ The field values of all archived instances. + } + deriving Show + +-- | Constructs a constraint set from the generator environment, together with +-- the template name, the choice and field to be verified. +-- TODO: Take choices into account? +constructConstr :: Env -> TypeConName -> ChoiceName -> FieldName -> ConstraintSet +constructConstr env tem ch f = + case lookupChoInHMap (_envchs env) ch of + Just upds -> + let vars = concat $ map skol2var $ _envskol env + creUpds = filter (\UpdCreate{..} -> tem == qualObject _creTemp) (_usCre upds) + creVals = map (exp2CExp . fromJust . (lookup f) . _creField) creUpds + arcUpds = filter (\UpdArchive{..} -> tem == qualObject _arcTemp) (_usArc upds) + arcVals = map (exp2CExp . fromJust . (lookup f) . _arcField) arcUpds + in ConstraintSet vars creVals arcVals + Nothing -> error "Choice not found" From 2bad89e42eaf564d126a6eaa2134a3d2ea21fc61 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Wed, 22 Apr 2020 12:04:20 +0200 Subject: [PATCH 13/50] Minor bugfixes --- .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 2 +- .../src/DA/Daml/LF/Verify/Generate.hs | 13 +++++----- .../src/DA/Daml/LF/Verify/Solve.hs | 25 ++++++++++++++++--- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index a8b9c77b9cf0..46cb4f96a685 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -20,7 +20,7 @@ templName :: TypeConName templName = TypeConName ["Iou"] choiceName :: ChoiceName -choiceName = ChoiceName "Iou_Split" +choiceName = ChoiceName "Iou_Merge" fieldName :: FieldName fieldName = FieldName "amount" diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index 4dce66b41025..1fd8887bd2a2 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -9,7 +9,7 @@ module DA.Daml.LF.Verify.Generate -- import Control.Monad.Error.Class (throwError) import qualified Data.NameMap as NM -import Data.Bifunctor (second) +-- import Data.Bifunctor (second) import DA.Daml.LF.Ast hiding (lookupChoice) import DA.Daml.LF.Verify.Context @@ -73,17 +73,16 @@ genValue pac mod val = do extValEnv qname (_goExp expOut) (_goUpd expOut) -- TODO: Handle annotated choices, by returning a set of annotations. -genChoice :: MonadEnv m => Qualified TypeConName -> [FieldName] -> [ExprVarName] +genChoice :: MonadEnv m => Qualified TypeConName -> ExprVarName -> [FieldName] -> TemplateChoice -> m GenOutput -genChoice tem temFs temXs TemplateChoice{..} = do +genChoice tem this temFs TemplateChoice{..} = do extVarEnv chcSelfBinder extVarEnv (fst chcArgBinder) argFs <- recTypFields (snd chcArgBinder) extRecEnv (fst chcArgBinder) argFs expOut <- genExpr TemplatePhase chcUpdate if chcConsuming - -- TODO: This is weird. Either drop (as it's quite obvious), or use `amount = this.amount`, so we can at the very least drop the xs argument. - then let fields = zipWith (curry (second EVar)) temFs temXs + then let fields = map (\f -> (f, ERecProj (TypeConApp tem []) f (EVar this))) temFs in return $ addArchiveUpd tem fields expOut else return expOut @@ -94,14 +93,14 @@ genTemplate pac mod Template{..} = do fields <- recTypConFields tplTypeCon -- TODO: skolemise only when defining the choice? But then multiple choice -- would skolemise multiple times... - -- TODO: skolemise the fields themselves or rather self.field? + -- TODO: skolemise the fields themselves or rather this.field? let fs = map fst fields xs = map fieldName2VarName fs -- TODO: if daml indead translates into `amount = this.amount`, this can be dropped. mapM_ extVarEnv xs extRecEnv tplParam fs extRecEnvLvl1 fields - choOuts <- mapM (genChoice name fs xs) (NM.toList tplChoices) + choOuts <- mapM (genChoice name tplParam fs) (NM.toList tplChoices) mapM_ (\(ch, upd) -> extChEnv name ch upd) $ zip (map chcName $ NM.toList tplChoices) (map _goUpd choOuts) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index bd1df2a076a6..0e8f211800ed 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -10,6 +10,8 @@ module DA.Daml.LF.Verify.Solve import Data.Maybe (fromJust) import Data.List (lookup) import qualified Data.Text as T +import SimpleSMT +-- import Z3.Monad import DA.Daml.LF.Ast.Base import DA.Daml.LF.Verify.Context @@ -20,20 +22,20 @@ data ConstraintExpr -- | Reference to an expression variable. = CVar !ExprVarName -- | Sum of two expressions. - | CSum !ConstraintExpr !ConstraintExpr + | CAdd !ConstraintExpr !ConstraintExpr -- | Subtraction of two expressions. | CSub !ConstraintExpr !ConstraintExpr instance Show ConstraintExpr where show (CVar x) = T.unpack $ unExprVarName x - show (CSum e1 e2) = show e1 ++ " + " ++ show e2 + show (CAdd e1 e2) = show e1 ++ " + " ++ show e2 show (CSub e1 e2) = show e1 ++ " - " ++ show e2 exp2CExp :: Expr -> ConstraintExpr exp2CExp (EVar x) = CVar x exp2CExp (ERecProj _ f (EVar x)) = CVar $ recProj2Var x f exp2CExp (ETmApp (ETmApp (ETyApp (EBuiltin b) _) e1) e2) = case b of - BEAddNumeric -> CSum (exp2CExp e1) (exp2CExp e2) + BEAddNumeric -> CAdd (exp2CExp e1) (exp2CExp e2) BESubNumeric -> CSub (exp2CExp e1) (exp2CExp e2) _ -> error ("Builtin: " ++ show b) exp2CExp e = error ("Conversion: " ++ show e) @@ -71,3 +73,20 @@ constructConstr env tem ch f = arcVals = map (exp2CExp . fromJust . (lookup f) . _arcField) arcUpds in ConstraintSet vars creVals arcVals Nothing -> error "Choice not found" + +-- cexp2Z3 :: ConstraintExpr -> Z3 AST +-- cexp2Z3 (CVar x) = undefined +-- cexp2Z3 (CAdd e1 e2) = do +-- ze1 <- cexp2Z3 e1 +-- ze2 <- cexp2Z3 e2 +-- mkAdd [ze1, ze2] +-- cexp2Z3 (CSub e1 e2) = do +-- ze1 <- cexp2Z3 e1 +-- ze2 <- cexp2Z3 e2 +-- mkSub [ze1, ze2] + +-- -- TODO: This really shouldn't be an Integer +-- ctr2Z3 :: ConstraintSet -> Z3 (Maybe [Integer]) +-- ctr2Z3 ConstraintSet{..} = do +-- -- TODO: Declare variables +-- cres <- mapM cexp2Z3 _cCres >>= mkAdd From 733f9290fb0b72f3eef55d5fd12fc2c0cbf7e761 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Wed, 22 Apr 2020 12:04:52 +0200 Subject: [PATCH 14/50] Added simple-smt to bazel --- bazel-haskell-deps.bzl | 1 + compiler/daml-lf-verify/BUILD.bazel | 1 + stack-snapshot.yaml | 1 + 3 files changed, 3 insertions(+) diff --git a/bazel-haskell-deps.bzl b/bazel-haskell-deps.bzl index a233f51b0104..b44acf4bcad6 100644 --- a/bazel-haskell-deps.bzl +++ b/bazel-haskell-deps.bzl @@ -597,6 +597,7 @@ exports_files(["stack.exe"], visibility = ["//visibility:public"]) "scientific", "semigroups", "semver", + "simple-smt", "sorted-list", "split", "stache", diff --git a/compiler/daml-lf-verify/BUILD.bazel b/compiler/daml-lf-verify/BUILD.bazel index 02a22d3de681..4bb0f00a4a3f 100644 --- a/compiler/daml-lf-verify/BUILD.bazel +++ b/compiler/daml-lf-verify/BUILD.bazel @@ -23,6 +23,7 @@ da_haskell_binary( "recursion-schemes", "safe", "scientific", + "simple-smt", "template-haskell", "text", "time", diff --git a/stack-snapshot.yaml b/stack-snapshot.yaml index feacf7b0c18b..efbfe841e2d6 100644 --- a/stack-snapshot.yaml +++ b/stack-snapshot.yaml @@ -28,6 +28,7 @@ packages: - regex-base-0.94.0.0 - regex-tdfa-1.3.1.0 - shake-0.18.5 + - simple-smt-0.9.4 - zip-1.3.2 # Core packages, need to be listed for integer-simple flags. - integer-simple-0.1.1.1 From 554594385c14bdba86b0505c2ed3d3dcfc160b2d Mon Sep 17 00:00:00 2001 From: Moritz Kiefer Date: Wed, 22 Apr 2020 12:37:37 +0200 Subject: [PATCH 15/50] Depend on z3 changelog_begin changelog_end --- WORKSPACE | 9 +++++++++ compiler/damlc/BUILD.bazel | 1 + nix/bazel.nix | 2 ++ 3 files changed, 12 insertions(+) diff --git a/WORKSPACE b/WORKSPACE index af923da8ba58..89fddb330155 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -784,6 +784,15 @@ nixpkgs_package( repositories = dev_env_nix_repos, ) +nixpkgs_package( + name = "z3_nix", + attribute_path = "z3", + fail_not_supported = False, + nix_file = "//nix:bazel.nix", + nix_file_deps = common_nix_file_deps, + repositories = dev_env_nix_repos, +) + dev_env_tool( name = "postgresql_dev_env", nix_include = [ diff --git a/compiler/damlc/BUILD.bazel b/compiler/damlc/BUILD.bazel index 6ce1075931bc..b24b9eab6f1c 100644 --- a/compiler/damlc/BUILD.bazel +++ b/compiler/damlc/BUILD.bazel @@ -24,6 +24,7 @@ da_haskell_binary( "-optl-pthread", ] if is_windows else [], data = [ + "@z3_nix//:bin/z3", "//compiler/damlc/daml-ide-core:dlint.yaml", "@static_asset_d3plus//:js/d3.min.js", "@static_asset_d3plus//:js/d3plus.min.js", diff --git a/nix/bazel.nix b/nix/bazel.nix index 5de849012e9c..154ee5bbdf0b 100644 --- a/nix/bazel.nix +++ b/nix/bazel.nix @@ -113,6 +113,8 @@ let shared = rec { ; }; + z3 = pkgs.z3; + bazel-cc-toolchain = pkgs.callPackage ./tools/bazel-cc-toolchain {}; }; in shared // (if pkgs.stdenv.isLinux then { From b736d85ec171078ff26357ddf5755db2c2cf85fe Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Thu, 23 Apr 2020 11:59:10 +0200 Subject: [PATCH 16/50] Working pipeline --- compiler/daml-lf-verify/BUILD.bazel | 4 ++ .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 4 ++ .../src/DA/Daml/LF/Verify/Solve.hs | 51 +++++++++++++------ 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/compiler/daml-lf-verify/BUILD.bazel b/compiler/daml-lf-verify/BUILD.bazel index 4bb0f00a4a3f..dd0772cc5b83 100644 --- a/compiler/daml-lf-verify/BUILD.bazel +++ b/compiler/daml-lf-verify/BUILD.bazel @@ -6,6 +6,9 @@ load("//bazel_tools:haskell.bzl", "da_haskell_binary") da_haskell_binary( name = "daml-lf-verify", srcs = glob(["src/**/*.hs"]), + data = [ + "@z3_nix//:bin/z3", + ], hackage_deps = [ "aeson", "base", @@ -38,6 +41,7 @@ da_haskell_binary( "//compiler/daml-lf-proto", "//compiler/daml-lf-reader", "//compiler/daml-lf-tools", + "//libs-haskell/bazel-runfiles", "//libs-haskell/da-hs-base", ], ) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index 46cb4f96a685..29b3d3124146 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -13,6 +13,7 @@ import DA.Daml.LF.Verify.Solve import DA.Daml.LF.Verify.Read import DA.Daml.LF.Verify.Context import DA.Pretty +import DA.Bazel.Runfiles -- import qualified Data.NameMap as NM -- TODO: temporarily hardcoded @@ -28,6 +29,8 @@ fieldName = FieldName "amount" main :: IO () main = do Options{..} <- execParser optionsParserInfo + solver <- locateRunfiles "z3_nix/bin/z3" + print solver pkgs <- readPackages optInputDars -- mapM_ (putStrLn . renderPretty) (concat (map (NM.toList . packageModules . fst . snd) pkgs)) putStrLn "Start value phase" >> case runEnv (genPackages ValuePhase pkgs) emptyEnv of @@ -46,6 +49,7 @@ main = do let cset = constructConstr env3 templName choiceName fieldName putStr "Create: " >> print (_cCres cset) putStr "Archive: " >> print (_cArcs cset) + solveConstr solver cset printFExpr :: [(FieldName, Expr)] -> IO () printFExpr fields = mapM_ (\(f,e) -> putStrLn (show f ++ " : " ++ renderPretty e)) fields diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 0e8f211800ed..e356aa27d05c 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -4,19 +4,22 @@ -- | Constraint solver for DAML LF static verification module DA.Daml.LF.Verify.Solve ( constructConstr + , solveConstr , ConstraintSet(..) ) where import Data.Maybe (fromJust) import Data.List (lookup) +import Data.Set (toList, fromList) import qualified Data.Text as T -import SimpleSMT +import qualified SimpleSMT as S -- import Z3.Monad import DA.Daml.LF.Ast.Base import DA.Daml.LF.Verify.Context -- import DA.Pretty +-- TODO: Since S.SExpr is so similar, we might be able to just drop this. -- | A simple form of expressions featuring basic arithmetic. data ConstraintExpr -- | Reference to an expression variable. @@ -74,19 +77,35 @@ constructConstr env tem ch f = in ConstraintSet vars creVals arcVals Nothing -> error "Choice not found" --- cexp2Z3 :: ConstraintExpr -> Z3 AST --- cexp2Z3 (CVar x) = undefined --- cexp2Z3 (CAdd e1 e2) = do --- ze1 <- cexp2Z3 e1 --- ze2 <- cexp2Z3 e2 --- mkAdd [ze1, ze2] --- cexp2Z3 (CSub e1 e2) = do --- ze1 <- cexp2Z3 e1 --- ze2 <- cexp2Z3 e2 --- mkSub [ze1, ze2] +cexp2sexp :: [(ExprVarName,S.SExpr)] -> ConstraintExpr -> IO S.SExpr +cexp2sexp vars (CVar x) = return $ fromJust $ lookup x vars +cexp2sexp vars (CAdd ce1 ce2) = do + se1 <- cexp2sexp vars ce1 + se2 <- cexp2sexp vars ce2 + return $ S.add se1 se2 +cexp2sexp vars (CSub ce1 ce2) = do + se1 <- cexp2sexp vars ce1 + se2 <- cexp2sexp vars ce2 + return $ S.sub se1 se2 --- -- TODO: This really shouldn't be an Integer --- ctr2Z3 :: ConstraintSet -> Z3 (Maybe [Integer]) --- ctr2Z3 ConstraintSet{..} = do --- -- TODO: Declare variables --- cres <- mapM cexp2Z3 _cCres >>= mkAdd +declareVars :: S.Solver -> [ExprVarName] -> IO [(ExprVarName,S.SExpr)] +-- TODO: This should be a float instead of an int +declareVars s xs = zip xs <$> mapM (\x -> S.declare s (var2str x) S.tInt) xs + where + var2str :: ExprVarName -> String + var2str (ExprVarName x) = T.unpack x + +solveConstr :: FilePath -> ConstraintSet -> IO () +solveConstr spath ConstraintSet{..} = do + log <- S.newLogger 0 + sol <- S.newSolver spath ["-in"] (Just log) + vars <- declareVars sol $ filterDups _cVars + cre <- foldl S.add (S.int 0) <$> mapM (cexp2sexp vars) _cCres + arc <- foldl S.add (S.int 0) <$> mapM (cexp2sexp vars) _cArcs + S.assert sol (S.not (cre `S.eq` arc)) + S.check sol >>= print + where + -- TODO: Filter vars beforehand + -- TODO: Where does this "_" come from? + filterDups :: [ExprVarName] -> [ExprVarName] + filterDups = filter (\(ExprVarName x) -> x /= "_") . toList . fromList From 4bc25cb939417d7878afd05e7c6d2c6683180f6c Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Thu, 23 Apr 2020 14:57:45 +0200 Subject: [PATCH 17/50] Fix overwriting value definitions, and delayed choice bindings --- .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 2 +- .../src/DA/Daml/LF/Verify/Context.hs | 38 ++++++++++++------- .../src/DA/Daml/LF/Verify/Generate.hs | 27 +++++++++---- .../src/DA/Daml/LF/Verify/Solve.hs | 2 +- 4 files changed, 45 insertions(+), 24 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index 29b3d3124146..218d4a59ca1a 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -41,7 +41,7 @@ main = do Left err -> putStrLn "Template phase finished with error: " >> print err Right env3 -> do putStrLn "Success!" - let upds = fromJust $ lookupChoInHMap (_envchs env3) choiceName + let upds = fromJust $ lookupChoInHMap (_envchs env3) templName choiceName mapM_ (\cre -> putStrLn "Create: " >> print (qualObject $ _creTemp cre) >> printFExpr (_creField cre) >> putStrLn "") (_usCre upds) mapM_ (\arc -> putStrLn "Archive: " >> print (qualObject $ _arcTemp arc) >> printFExpr (_arcField arc) >> putStrLn "") (_usArc upds) mapM_ (\cho -> putStrLn "Choice: " >> print (_choName cho) >> putStrLn "") (_usCho upds) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index c8142150ea32..6b06dbf884ec 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -34,6 +34,7 @@ import Control.Monad.State.Lazy import Data.Maybe (listToMaybe, isJust) import Data.List (find) import qualified Data.HashMap.Strict as HM +import Debug.Trace import DA.Daml.LF.Ast hiding (lookupChoice) @@ -130,18 +131,20 @@ introEnv :: MonadEnv m => Env -> m () introEnv env = modify (concatEnv env) extVarEnv :: MonadEnv m => ExprVarName -> m () +-- TODO: Check for doubles when adding extVarEnv x = get >>= \env@Env{..} -> put env{_envskol = SkolVar x : _envskol} -- TODO: Problem! ExprVarName is always `this` or `arg`, so it overwrites!! -- Possible solution: pass in the current template? extRecEnv :: MonadEnv m => ExprVarName -> [FieldName] -> m () +-- TODO: Check for doubles when adding extRecEnv x fs = get >>= \env@Env{..} -> put env{_envskol = SkolRec x fs : _envskol} extValEnv :: MonadEnv m => Qualified ExprValName -> Expr -> UpdateSet -> m () extValEnv val expr upd = get >>= \env@Env{..} -> put env{_envvals = HM.insert val (expr, upd) _envvals} extChEnv :: MonadEnv m => Qualified TypeConName -> ChoiceName -> UpdateSet -> m () -extChEnv tc ch upd = get >>= \env@Env{..} -> put env{_envchs = HM.insert (tc, ch) upd _envchs} +extChEnv tc ch upd = trace "Extend!" $ trace (show ch) $ get >>= \env@Env{..} -> put env{_envchs = HM.insert (tc, ch) upd _envchs} extDatsEnv :: MonadEnv m => HM.HashMap TypeConName DefDataType -> m () extDatsEnv hmap = get >>= \env@Env{..} -> put env{_envdats = hmap `HM.union` _envdats} @@ -183,13 +186,13 @@ lookupVal val = do lookupChoice :: MonadEnv m => Qualified TypeConName -> ChoiceName -> m UpdateSet -- TODO: Actually bind this, instead of hardcoding -lookupChoice tem (ChoiceName "Archive") = do - fs <- recTypConFields $ qualObject tem - let fields = map ((\f -> (f, EVar $ fieldName2VarName f)) . fst) fs - return emptyUpdateSet{_usArc = [UpdArchive tem fields]} -lookupChoice _tem ch = do +-- lookupChoice tem (ChoiceName "Archive") = do +-- fs <- recTypConFields $ qualObject tem +-- let fields = map ((\f -> (f, EVar $ fieldName2VarName f)) . fst) fs +-- return emptyUpdateSet{_usArc = [UpdArchive tem fields]} +lookupChoice tem ch = do env <- get - case lookupChoInHMap (_envchs env) ch of + case lookupChoInHMap (_envchs env) (qualObject tem) ch of Nothing -> throwError (UnknownChoice ch) Just upd -> return upd @@ -200,17 +203,23 @@ lookupDataCon tc = do Nothing -> throwError (UnknownDataCons tc) Just def -> return def --- TODO: There seems to be something wrong with the qualifiers. This is a --- temporary solution. lookupValInHMap :: HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) -> Qualified ExprValName -> Maybe (Expr, UpdateSet) -lookupValInHMap hmap val = listToMaybe $ HM.elems - $ HM.filterWithKey (\name _ -> qualObject name == qualObject val) hmap +-- TODO: Temp print +lookupValInHMap hmap val = + -- TODO: There seems to be something wrong with the PackageRef in Qualified. + let ress = HM.elems $ HM.filterWithKey (\name _ -> qualObject name == qualObject val && qualModule name == qualModule val) hmap + in listToMaybe ress + -- in if length ress > 1 + -- then trace ("Overlapping vals! : " ++ show val) $ listToMaybe ress + -- else listToMaybe ress lookupChoInHMap :: HM.HashMap (Qualified TypeConName, ChoiceName) UpdateSet - -> ChoiceName -> Maybe UpdateSet -lookupChoInHMap hmap cho = listToMaybe $ HM.elems - $ HM.filterWithKey (\(_, name) _ -> cho == name) hmap + -> TypeConName -> ChoiceName -> Maybe UpdateSet +-- TODO: This TypeConName should be qualified +-- TODO: The type con name really should be taken into account here +lookupChoInHMap hmap _tem cho = listToMaybe $ HM.elems + $ HM.filterWithKey (\(_t, c) _ -> c == cho) hmap solveValueUpdatesEnv :: Env -> Env solveValueUpdatesEnv env = @@ -247,6 +256,7 @@ recTypFields :: MonadEnv m => Type -> m [FieldName] recTypFields (TCon tc) = do fields <- recTypConFields $ qualObject tc return $ map fst fields +recTypFields (TStruct fs) = return $ map fst fs recTypFields _ = throwError ExpectRecord recExpFields :: MonadEnv m => Expr -> m [(FieldName, Expr)] diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index 1fd8887bd2a2..75c01d8e4904 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -10,11 +10,12 @@ module DA.Daml.LF.Verify.Generate -- import Control.Monad.Error.Class (throwError) import qualified Data.NameMap as NM -- import Data.Bifunctor (second) +import Debug.Trace import DA.Daml.LF.Ast hiding (lookupChoice) import DA.Daml.LF.Verify.Context import DA.Daml.LF.Verify.Subst --- import DA.Pretty +import DA.Pretty data Phase = ValuePhase @@ -76,7 +77,7 @@ genValue pac mod val = do genChoice :: MonadEnv m => Qualified TypeConName -> ExprVarName -> [FieldName] -> TemplateChoice -> m GenOutput genChoice tem this temFs TemplateChoice{..} = do - extVarEnv chcSelfBinder + trace ("Start choice " ++ show chcName) $ extVarEnv chcSelfBinder extVarEnv (fst chcArgBinder) argFs <- recTypFields (snd chcArgBinder) extRecEnv (fst chcArgBinder) argFs @@ -90,7 +91,7 @@ genTemplate :: MonadEnv m => PackageRef -> ModuleName -> Template -> m () -- TODO: Take precondition into account? genTemplate pac mod Template{..} = do let name = Qualified pac mod tplTypeCon - fields <- recTypConFields tplTypeCon + fields <- trace ("Start template " ++ (show tplTypeCon)) $ recTypConFields tplTypeCon -- TODO: skolemise only when defining the choice? But then multiple choice -- would skolemise multiple times... -- TODO: skolemise the fields themselves or rather this.field? @@ -100,9 +101,18 @@ genTemplate pac mod Template{..} = do mapM_ extVarEnv xs extRecEnv tplParam fs extRecEnvLvl1 fields - choOuts <- mapM (genChoice name tplParam fs) (NM.toList tplChoices) - mapM_ (\(ch, upd) -> extChEnv name ch upd) - $ zip (map chcName $ NM.toList tplChoices) (map _goUpd choOuts) + mapM_ (extChoice name fs) (archive : NM.toList tplChoices) + where + archive :: TemplateChoice + archive = TemplateChoice Nothing (ChoiceName "Archive") True + (ENil (TBuiltin BTParty)) (ExprVarName "self") + (ExprVarName "arg", TStruct []) (TBuiltin BTUnit) + (EUpdate $ UPure (TBuiltin BTUnit) (EBuiltin BEUnit)) + extChoice :: MonadEnv m => Qualified TypeConName -> [FieldName] + -> TemplateChoice -> m () + extChoice tem fs ch = do + chOut <- genChoice tem tplParam fs ch + extChEnv tem (chcName ch) (_goUpd chOut) genExpr :: MonadEnv m => Phase -> Expr -> m GenOutput genExpr ph = \case @@ -196,7 +206,8 @@ genForExercise :: MonadEnv m => Phase -> Qualified TypeConName -> ChoiceName genForExercise ph tem ch cid par arg = do cidOut <- genExpr ph cid argOut <- genExpr ph arg - updSet <- lookupChoice tem ch + -- TODO: Substitute arg in these updates + updSet <- trace ("Lookup: " ++ show tem ++ " : " ++ show ch) $ trace (renderPretty arg) $ lookupChoice tem ch return (GenOutput (EUpdate (UExercise tem ch (_goExp cidOut) par (_goExp argOut))) updSet) -- TODO: handle binds by substituting? @@ -206,7 +217,7 @@ genForBind ph bind body = do bindOut <- genExpr ph (bindingBound bind) case _goExp bindOut of EUpdate (UFetch tc _cid) -> do - fs <- recTypConFields $ qualObject tc + fs <- trace ("Fetch " ++ show tc) $ recTypConFields $ qualObject tc extRecEnv (fst $ bindingBinder bind) (map fst fs) _ -> return () extVarEnv (fst $ bindingBinder bind) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index e356aa27d05c..e30493797caa 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -67,7 +67,7 @@ data ConstraintSet = ConstraintSet -- TODO: Take choices into account? constructConstr :: Env -> TypeConName -> ChoiceName -> FieldName -> ConstraintSet constructConstr env tem ch f = - case lookupChoInHMap (_envchs env) ch of + case lookupChoInHMap (_envchs env) tem ch of Just upds -> let vars = concat $ map skol2var $ _envskol env creUpds = filter (\UpdCreate{..} -> tem == qualObject _creTemp) (_usCre upds) From 310d7b05aacad712a5333063a4dad43f6cf54e03 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Fri, 24 Apr 2020 16:12:44 +0200 Subject: [PATCH 18/50] Keep track of contract id's after fetching --- .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 23 +++-- .../src/DA/Daml/LF/Verify/Context.hs | 96 ++++++++++++++++--- .../src/DA/Daml/LF/Verify/Generate.hs | 20 +++- .../src/DA/Daml/LF/Verify/Solve.hs | 6 +- test.out | 50 ---------- 5 files changed, 116 insertions(+), 79 deletions(-) delete mode 100644 test.out diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index 218d4a59ca1a..e006b27ac007 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -5,7 +5,7 @@ module DA.Daml.LF.Verify ( main ) where import Options.Applicative -import Data.Maybe (fromJust) +-- import Data.Maybe (fromJust) import DA.Daml.LF.Ast.Base import DA.Daml.LF.Verify.Generate @@ -15,6 +15,7 @@ import DA.Daml.LF.Verify.Context import DA.Pretty import DA.Bazel.Runfiles -- import qualified Data.NameMap as NM +import qualified Data.HashMap.Strict as HM -- TODO: temporarily hardcoded templName :: TypeConName @@ -35,21 +36,25 @@ main = do -- mapM_ (putStrLn . renderPretty) (concat (map (NM.toList . packageModules . fst . snd) pkgs)) putStrLn "Start value phase" >> case runEnv (genPackages ValuePhase pkgs) emptyEnv of Left err-> putStrLn "Value phase finished with error: " >> print err - Right env1 -> putStrLn "Start value solving" >> + Right env1 -> do + putStrLn "Start value solving" let env2 = solveValueUpdatesEnv env1 - in putStrLn "Start template phase" >> case runEnv (genPackages TemplatePhase pkgs) env2 of + testexpr = fst $ (HM.elems $ HM.filterWithKey (\name _ -> unExprValName (qualObject name) == "$carchive") (_envvals env2)) !! 1 + putStrLn $ renderPretty testexpr + print testexpr + putStrLn "Start template phase" >> case runEnv (genPackages TemplatePhase pkgs) env2 of Left err -> putStrLn "Template phase finished with error: " >> print err Right env3 -> do putStrLn "Success!" - let upds = fromJust $ lookupChoInHMap (_envchs env3) templName choiceName - mapM_ (\cre -> putStrLn "Create: " >> print (qualObject $ _creTemp cre) >> printFExpr (_creField cre) >> putStrLn "") (_usCre upds) - mapM_ (\arc -> putStrLn "Archive: " >> print (qualObject $ _arcTemp arc) >> printFExpr (_arcField arc) >> putStrLn "") (_usArc upds) - mapM_ (\cho -> putStrLn "Choice: " >> print (_choName cho) >> putStrLn "") (_usCho upds) + -- let upds = fromJust $ lookupChoInHMap (_envchs env3) templName choiceName + -- mapM_ (\cre -> putStrLn "Create: " >> print (qualObject $ _creTemp cre) >> printFExpr (_creField cre) >> putStrLn "") (_usCre upds) + -- mapM_ (\arc -> putStrLn "Archive: " >> print (qualObject $ _arcTemp arc) >> printFExpr (_arcField arc) >> putStrLn "") (_usArc upds) + -- mapM_ (\cho -> putStrLn "Choice: " >> print (_choName cho) >> putStrLn "") (_usCho upds) putStrLn "Start constraint solving phase" let cset = constructConstr env3 templName choiceName fieldName putStr "Create: " >> print (_cCres cset) putStr "Archive: " >> print (_cArcs cset) solveConstr solver cset -printFExpr :: [(FieldName, Expr)] -> IO () -printFExpr fields = mapM_ (\(f,e) -> putStrLn (show f ++ " : " ++ renderPretty e)) fields +-- printFExpr :: [(FieldName, Expr)] -> IO () +-- printFExpr fields = mapM_ (\(f,e) -> putStrLn (show f ++ " : " ++ renderPretty e)) fields diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 6b06dbf884ec..30e761c1250d 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -2,6 +2,7 @@ -- SPDX-License-Identifier: Apache-2.0 {-# LANGUAGE ConstraintKinds #-} +{-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE RankNTypes #-} -- | Contexts for DAML LF static verification @@ -17,9 +18,9 @@ module DA.Daml.LF.Verify.Context , runEnv , emptyEnv , introEnv - , extVarEnv, extRecEnv, extValEnv, extChEnv, extDatsEnv + , extVarEnv, extRecEnv, extValEnv, extChEnv, extDatsEnv, extCidEnv , extRecEnvLvl1 - , lookupVar, lookupRec, lookupVal, lookupChoice, lookupDataCon + , lookupVar, lookupRec, lookupVal, lookupChoice, lookupDataCon, lookupCid , concatEnv , emptyUpdateSet , concatUpdateSet @@ -31,12 +32,16 @@ module DA.Daml.LF.Verify.Context import Control.Monad.Error.Class (MonadError (..), throwError) import Control.Monad.State.Lazy +import Data.Hashable +import GHC.Generics import Data.Maybe (listToMaybe, isJust) import Data.List (find) +import qualified Data.Map.Strict as Map import qualified Data.HashMap.Strict as HM import Debug.Trace import DA.Daml.LF.Ast hiding (lookupChoice) +import DA.Daml.LF.Verify.Subst data UpdCreate = UpdCreate { _creTemp :: !(Qualified TypeConName) @@ -89,26 +94,41 @@ data Skolem -- e.g. `this.field` deriving (Eq, Show) +expr2cid :: MonadEnv m => Expr -> m Cid +expr2cid (EVar x) = return $ CidVar x +expr2cid (ERecProj _ f (EVar x)) = return $ CidRec x f +-- TODO: Temporary solution +expr2cid (ERecProj _ f (ERecCon tc _)) = return $ CidRec (ExprVarName $ head $ unTypeConName $ qualObject $ tcaTypeCon tc) f +expr2cid expr = error ("Expected cid: " ++ show expr) +-- expr2cid _ = throwError ExpectCid + +data Cid + = CidVar ExprVarName + | CidRec ExprVarName FieldName + deriving (Generic, Hashable, Eq, Show) + -- | The environment for the DAML-LF verifier data Env = Env { _envskol :: ![Skolem] -- ^ The skolemised term variables and fields. , _envvals :: !(HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) -- ^ The bound values. - , _envchs :: !(HM.HashMap (Qualified TypeConName, ChoiceName) UpdateSet) - -- ^ The set of relevant choices. + , _envchs :: !(HM.HashMap (Qualified TypeConName, ChoiceName) (Expr -> Expr -> Expr -> UpdateSet)) + -- ^ The set of relevant choices, mapping to functions from self, this and args to its updates. , _envdats :: !(HM.HashMap TypeConName DefDataType) -- ^ The set of data constructors. + , _envcids :: !(HM.HashMap Cid ExprVarName) + -- ^ The set of fetched cid's mapped to their variable name. -- TODO: split this off into data types for readability? } - deriving Show emptyEnv :: Env -emptyEnv = Env [] HM.empty HM.empty HM.empty +emptyEnv = Env [] HM.empty HM.empty HM.empty HM.empty concatEnv :: Env -> Env -> Env -concatEnv (Env vars1 vals1 chs1 dats1) (Env vars2 vals2 chs2 dats2) = - Env (vars1 ++ vars2) (vals1 `HM.union` vals2) (chs1 `HM.union` chs2) (dats1 `HM.union` dats2) +concatEnv (Env vars1 vals1 chs1 dats1 cids1) (Env vars2 vals2 chs2 dats2 cids2) = + Env (vars1 ++ vars2) (vals1 `HM.union` vals2) (chs1 `HM.union` chs2) + (dats1 `HM.union` dats2) (cids1 `HM.union` cids2) -- TODO: union makes me slightly nervous, as it allows overlapping keys -- (and just uses the first) @@ -143,12 +163,35 @@ extRecEnv x fs = get >>= \env@Env{..} -> put env{_envskol = SkolRec x fs : _envs extValEnv :: MonadEnv m => Qualified ExprValName -> Expr -> UpdateSet -> m () extValEnv val expr upd = get >>= \env@Env{..} -> put env{_envvals = HM.insert val (expr, upd) _envvals} -extChEnv :: MonadEnv m => Qualified TypeConName -> ChoiceName -> UpdateSet -> m () -extChEnv tc ch upd = trace "Extend!" $ trace (show ch) $ get >>= \env@Env{..} -> put env{_envchs = HM.insert (tc, ch) upd _envchs} +-- | Extends the environment with a new choice. +extChEnv :: MonadEnv m + => Qualified TypeConName + -- ^ The type of the template on which this choice is defined. + -> ChoiceName + -- ^ The name of the new choice. + -> ExprVarName + -- ^ Variable to bind the ContractId on which this choice is exercised on to. + -> ExprVarName + -- ^ Variable to bind the contract on which this choice is exercised on to. + -> ExprVarName + -- ^ Variable to bind the choice argument to. + -> UpdateSet + -- ^ The updates performed by the new choice. + -> m () +extChEnv tc ch self this arg upd = do + env@Env{..} <- get + let substUpd = \sExp tExp aExp -> trace ("Subst " ++ (show arg) ++ "with" ++ (show aExp)) $ substituteTmUpd (Map.fromList [(self,sExp),(this,tExp),(arg,aExp)]) upd + put env{_envchs = HM.insert (tc, ch) substUpd _envchs} extDatsEnv :: MonadEnv m => HM.HashMap TypeConName DefDataType -> m () extDatsEnv hmap = get >>= \env@Env{..} -> put env{_envdats = hmap `HM.union` _envdats} +extCidEnv :: MonadEnv m => Expr -> ExprVarName -> m () +extCidEnv exp var = do + cid <- expr2cid exp + env@Env{..} <- get + put env{_envcids = HM.insert cid var _envcids} + -- TODO: Is one layer of recursion enough? extRecEnvLvl1 :: MonadEnv m => [(FieldName, Type)] -> m () extRecEnvLvl1 = mapM_ step @@ -184,7 +227,7 @@ lookupVal val = do Nothing -> throwError (UnknownValue val) lookupChoice :: MonadEnv m => Qualified TypeConName -> ChoiceName - -> m UpdateSet + -> m (Expr -> Expr -> Expr -> UpdateSet) -- TODO: Actually bind this, instead of hardcoding -- lookupChoice tem (ChoiceName "Archive") = do -- fs <- recTypConFields $ qualObject tem @@ -203,6 +246,14 @@ lookupDataCon tc = do Nothing -> throwError (UnknownDataCons tc) Just def -> return def +lookupCid :: MonadEnv m => Expr -> m ExprVarName +lookupCid exp = do + env <- get + cid <- expr2cid exp + case HM.lookup cid (_envcids env) of + Nothing -> trace (show $ _envcids env) $ throwError $ UnknownCid cid + Just var -> return var + lookupValInHMap :: HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) -> Qualified ExprValName -> Maybe (Expr, UpdateSet) -- TODO: Temp print @@ -214,8 +265,9 @@ lookupValInHMap hmap val = -- then trace ("Overlapping vals! : " ++ show val) $ listToMaybe ress -- else listToMaybe ress -lookupChoInHMap :: HM.HashMap (Qualified TypeConName, ChoiceName) UpdateSet - -> TypeConName -> ChoiceName -> Maybe UpdateSet +-- TODO: Does this really need to be a seperate function? +lookupChoInHMap :: HM.HashMap (Qualified TypeConName, ChoiceName) (Expr -> Expr -> Expr -> UpdateSet) + -> TypeConName -> ChoiceName -> Maybe (Expr -> Expr -> Expr -> UpdateSet) -- TODO: This TypeConName should be qualified -- TODO: The type con name really should be taken into account here lookupChoInHMap hmap _tem cho = listToMaybe $ HM.elems @@ -280,13 +332,29 @@ recExpFields (ERecProj _ f e) = do Nothing -> throwError $ UnknownRecField f recExpFields e = error ("Expected record: " ++ show e) +substituteTmUpd :: ExprSubst -> UpdateSet -> UpdateSet +substituteTmUpd s UpdateSet{..} = UpdateSet susCre susArc _usCho _usVal + where + susCre = map (substituteTmUpdCreate s) _usCre + susArc = map (substituteTmUpdArchive s) _usArc + +substituteTmUpdCreate :: ExprSubst -> UpdCreate -> UpdCreate +substituteTmUpdCreate s UpdCreate{..} = UpdCreate _creTemp + (map (\(f,e) -> (f, substituteTmTm s e)) _creField) + +substituteTmUpdArchive :: ExprSubst -> UpdArchive -> UpdArchive +substituteTmUpdArchive s UpdArchive{..} = UpdArchive _arcTemp + (map (\(f,e) -> (f, substituteTmTm s e)) _arcField) + data Error = UnknownValue (Qualified ExprValName) | UnknownDataCons TypeConName | UnknownChoice ChoiceName | UnboundVar ExprVarName | UnknownRecField FieldName + | UnknownCid Cid | ExpectRecord + | ExpectCid | CyclicModules [ModuleName] instance Show Error where @@ -296,7 +364,9 @@ instance Show Error where show (UnknownChoice ch) = "Impossible: Unknown choice definition: " ++ show ch show (UnboundVar name) = "Impossible: Unbound term variable: " ++ show name show (UnknownRecField f) = "Impossible: Unknown record field: " ++ show f + show (UnknownCid cid) = "Impossible: Unknown contract id: " ++ show cid show ExpectRecord = "Impossible: Expected a record type" + show ExpectCid = "Impossible: Expected a contract id" show (CyclicModules mods) = "Cyclic modules: " ++ show mods -- | For testing purposes: print the stored value definitions in the environment. diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index 75c01d8e4904..853f4d4068c0 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -110,12 +110,12 @@ genTemplate pac mod Template{..} = do (EUpdate $ UPure (TBuiltin BTUnit) (EBuiltin BEUnit)) extChoice :: MonadEnv m => Qualified TypeConName -> [FieldName] -> TemplateChoice -> m () - extChoice tem fs ch = do + extChoice tem fs ch@TemplateChoice{..} = do chOut <- genChoice tem tplParam fs ch - extChEnv tem (chcName ch) (_goUpd chOut) + extChEnv tem chcName chcSelfBinder tplParam (fst chcArgBinder) (_goUpd chOut) genExpr :: MonadEnv m => Phase -> Expr -> m GenOutput -genExpr ph = \case +genExpr ph exp = trace (renderPretty exp) $ trace " " $ case exp of ETmApp fun arg -> genForTmApp ph fun arg ETyApp expr typ -> genForTyApp ph expr typ ELet bind body -> genForLet ph bind body @@ -207,7 +207,14 @@ genForExercise ph tem ch cid par arg = do cidOut <- genExpr ph cid argOut <- genExpr ph arg -- TODO: Substitute arg in these updates - updSet <- trace ("Lookup: " ++ show tem ++ " : " ++ show ch) $ trace (renderPretty arg) $ lookupChoice tem ch + -- TODO: Lookup the cid in the map, and subst this to the matching var + -- TODO: Achieve this by making the updSet a function taking the cid and its args (both ExprVarNames)? + updSubst <- lookupChoice tem ch + -- TODO WIP: I dont think this is correct yet. We should look up the var this cidOut is bound to. + test <- lookupDataCon (TypeConName ["Archive"]) + this <- trace (show cid) $ trace (show test) $ lookupCid (_goExp cidOut) + -- TODO: Should we further eval after subst? But how to eval an update set? + let updSet = updSubst (_goExp cidOut) (EVar this) (_goExp argOut) return (GenOutput (EUpdate (UExercise tem ch (_goExp cidOut) par (_goExp argOut))) updSet) -- TODO: handle binds by substituting? @@ -216,9 +223,12 @@ genForBind :: MonadEnv m => Phase -> Binding -> Expr -> m GenOutput genForBind ph bind body = do bindOut <- genExpr ph (bindingBound bind) case _goExp bindOut of - EUpdate (UFetch tc _cid) -> do + -- TODO: Create a map from this cid to the variable it binds to + EUpdate (UFetch tc cid) -> do fs <- trace ("Fetch " ++ show tc) $ recTypConFields $ qualObject tc extRecEnv (fst $ bindingBinder bind) (map fst fs) + cidOut <- genExpr ph cid + extCidEnv (_goExp cidOut) (fst $ bindingBinder bind) _ -> return () extVarEnv (fst $ bindingBinder bind) bodyOut <- genExpr ph body diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index e30493797caa..37c1b40576cd 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -68,8 +68,10 @@ data ConstraintSet = ConstraintSet constructConstr :: Env -> TypeConName -> ChoiceName -> FieldName -> ConstraintSet constructConstr env tem ch f = case lookupChoInHMap (_envchs env) tem ch of - Just upds -> - let vars = concat $ map skol2var $ _envskol env + Just updSubst -> + let upds = updSubst (EVar $ ExprVarName "self") (EVar $ ExprVarName "this") + (EVar $ ExprVarName "args") + vars = concat $ map skol2var $ _envskol env creUpds = filter (\UpdCreate{..} -> tem == qualObject _creTemp) (_usCre upds) creVals = map (exp2CExp . fromJust . (lookup f) . _creField) creUpds arcUpds = filter (\UpdArchive{..} -> tem == qualObject _arcTemp) (_usArc upds) diff --git a/test.out b/test.out deleted file mode 100644 index ef7dcc67fac2..000000000000 --- a/test.out +++ /dev/null @@ -1,50 +0,0 @@ -INFO: Invocation ID: 86d2137f-16c1-4bf0-aa67-9d6ac7ccae6d -Loading: -Loading: 0 packages loaded -Analyzing: target //compiler/daml-lf-verify:daml-lf-verify (0 packages loaded, 0 targets configured) -INFO: Analyzed target //compiler/daml-lf-verify:daml-lf-verify (0 packages loaded, 0 targets configured). -INFO: Found 1 target... -[0 / 4] [Prepa] BazelWorkspaceStatusAction stable-status.txt -[1 / 4] HaskellBuildBinary //compiler/daml-lf-verify:daml-lf-verify; 1s remote-cache, linux-sandbox -[2 / 4] [Prepa] HaskellLinkBinary compiler/daml-lf-verify/daml-lf-verify -[2 / 4] HaskellLinkBinary compiler/daml-lf-verify/daml-lf-verify; 1s remote-cache, linux-sandbox -Target //compiler/daml-lf-verify:daml-lf-verify up-to-date: - bazel-bin/compiler/daml-lf-verify/daml-lf-verify -INFO: Elapsed time: 8.577s, Critical Path: 8.22s -INFO: 2 processes: 2 linux-sandbox. -INFO: Build completed successfully, 3 total actions -INFO: Running command line: bazel-bin/compiler/daml-lf-verify/daml-lf-verify /home/gertjan/stack/DAML/quickstart/.daml/dist/quickstart-0.0.1.dar -INFO: Build completed successfully, 3 total actions -Start value phase -Start solving -Start template phase -Success! -Create: -TypeConName {unTypeConName = ["Iou"]} -FieldName {unFieldName = "amount"} : ADD_NUMERIC @10 (Iou:Iou.amount this) (Iou:Iou.amount otherIou) -FieldName {unFieldName = "issuer"} : issuer -FieldName {unFieldName = "owner"} : owner -FieldName {unFieldName = "currency"} : currency -FieldName {unFieldName = "observers"} : observers - -Archive: -TypeConName {unTypeConName = ["Iou"]} -FieldName {unFieldName = "issuer"} : issuer -FieldName {unFieldName = "owner"} : owner -FieldName {unFieldName = "currency"} : currency -FieldName {unFieldName = "amount"} : amount -FieldName {unFieldName = "observers"} : observers - -Archive: -TypeConName {unTypeConName = ["IouTrade"]} -FieldName {unFieldName = "buyer"} : buyer -FieldName {unFieldName = "seller"} : seller -FieldName {unFieldName = "baseIouCid"} : baseIouCid -FieldName {unFieldName = "baseIssuer"} : baseIssuer -FieldName {unFieldName = "baseCurrency"} : baseCurrency -FieldName {unFieldName = "baseAmount"} : baseAmount -FieldName {unFieldName = "quoteIssuer"} : quoteIssuer -FieldName {unFieldName = "quoteCurrency"} : quoteCurrency -FieldName {unFieldName = "quoteAmount"} : quoteAmount - -Let's start solving! From 4b08356e7cb48a0d40a57be115a0983e4ab3a393 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Fri, 24 Apr 2020 19:08:50 +0200 Subject: [PATCH 19/50] Renaming of choice parameters --- .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 16 --- .../src/DA/Daml/LF/Verify/Context.hs | 121 ++++++++---------- .../src/DA/Daml/LF/Verify/Generate.hs | 68 ++++------ .../src/DA/Daml/LF/Verify/Solve.hs | 16 +-- .../src/DA/Daml/LF/Verify/Subst.hs | 13 +- 5 files changed, 100 insertions(+), 134 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index e006b27ac007..c5e1fc2b0e4f 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -5,17 +5,13 @@ module DA.Daml.LF.Verify ( main ) where import Options.Applicative --- import Data.Maybe (fromJust) import DA.Daml.LF.Ast.Base import DA.Daml.LF.Verify.Generate import DA.Daml.LF.Verify.Solve import DA.Daml.LF.Verify.Read import DA.Daml.LF.Verify.Context -import DA.Pretty import DA.Bazel.Runfiles --- import qualified Data.NameMap as NM -import qualified Data.HashMap.Strict as HM -- TODO: temporarily hardcoded templName :: TypeConName @@ -31,30 +27,18 @@ main :: IO () main = do Options{..} <- execParser optionsParserInfo solver <- locateRunfiles "z3_nix/bin/z3" - print solver pkgs <- readPackages optInputDars - -- mapM_ (putStrLn . renderPretty) (concat (map (NM.toList . packageModules . fst . snd) pkgs)) putStrLn "Start value phase" >> case runEnv (genPackages ValuePhase pkgs) emptyEnv of Left err-> putStrLn "Value phase finished with error: " >> print err Right env1 -> do putStrLn "Start value solving" let env2 = solveValueUpdatesEnv env1 - testexpr = fst $ (HM.elems $ HM.filterWithKey (\name _ -> unExprValName (qualObject name) == "$carchive") (_envvals env2)) !! 1 - putStrLn $ renderPretty testexpr - print testexpr putStrLn "Start template phase" >> case runEnv (genPackages TemplatePhase pkgs) env2 of Left err -> putStrLn "Template phase finished with error: " >> print err Right env3 -> do putStrLn "Success!" - -- let upds = fromJust $ lookupChoInHMap (_envchs env3) templName choiceName - -- mapM_ (\cre -> putStrLn "Create: " >> print (qualObject $ _creTemp cre) >> printFExpr (_creField cre) >> putStrLn "") (_usCre upds) - -- mapM_ (\arc -> putStrLn "Archive: " >> print (qualObject $ _arcTemp arc) >> printFExpr (_arcField arc) >> putStrLn "") (_usArc upds) - -- mapM_ (\cho -> putStrLn "Choice: " >> print (_choName cho) >> putStrLn "") (_usCho upds) putStrLn "Start constraint solving phase" let cset = constructConstr env3 templName choiceName fieldName putStr "Create: " >> print (_cCres cset) putStr "Archive: " >> print (_cArcs cset) solveConstr solver cset - --- printFExpr :: [(FieldName, Expr)] -> IO () --- printFExpr fields = mapM_ (\(f,e) -> putStrLn (show f ++ " : " ++ renderPretty e)) fields diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 30e761c1250d..9ea9b660ae73 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -16,8 +16,8 @@ module DA.Daml.LF.Verify.Context , UpdChoice(..) , Skolem(..) , runEnv + , genRenamedVar , emptyEnv - , introEnv , extVarEnv, extRecEnv, extValEnv, extChEnv, extDatsEnv, extCidEnv , extRecEnvLvl1 , lookupVar, lookupRec, lookupVal, lookupChoice, lookupDataCon, lookupCid @@ -25,7 +25,7 @@ module DA.Daml.LF.Verify.Context , emptyUpdateSet , concatUpdateSet , solveValueUpdatesEnv - , testPrint, lookupChoInHMap + , lookupChoInHMap , fieldName2VarName , recTypConFields, recTypFields, recExpFields ) where @@ -36,9 +36,8 @@ import Data.Hashable import GHC.Generics import Data.Maybe (listToMaybe, isJust) import Data.List (find) -import qualified Data.Map.Strict as Map import qualified Data.HashMap.Strict as HM -import Debug.Trace +import qualified Data.Text as T import DA.Daml.LF.Ast hiding (lookupChoice) import DA.Daml.LF.Verify.Subst @@ -86,6 +85,9 @@ concatUpdateSet :: UpdateSet -> UpdateSet -> UpdateSet concatUpdateSet (UpdateSet cres1 arcs1 chos1 vals1) (UpdateSet cres2 arcs2 chos2 vals2) = UpdateSet (cres1 ++ cres2) (arcs1 ++ arcs2) (chos1 ++ chos2) (vals1 ++ vals2) +genRenamedVar :: MonadEnv m => ExprVarName -> m ExprVarName +genRenamedVar (ExprVarName x) = ExprVarName . (T.append x) . T.pack <$> fresh + data Skolem = SkolVar ExprVarName -- ^ Skolemised term variable. @@ -97,29 +99,27 @@ data Skolem expr2cid :: MonadEnv m => Expr -> m Cid expr2cid (EVar x) = return $ CidVar x expr2cid (ERecProj _ f (EVar x)) = return $ CidRec x f --- TODO: Temporary solution -expr2cid (ERecProj _ f (ERecCon tc _)) = return $ CidRec (ExprVarName $ head $ unTypeConName $ qualObject $ tcaTypeCon tc) f -expr2cid expr = error ("Expected cid: " ++ show expr) --- expr2cid _ = throwError ExpectCid +expr2cid _ = throwError ExpectCid data Cid = CidVar ExprVarName | CidRec ExprVarName FieldName deriving (Generic, Hashable, Eq, Show) +-- TODO: Could we alternatively just declare the variables that occur in the updates and drop the skolems? -- | The environment for the DAML-LF verifier data Env = Env { _envskol :: ![Skolem] -- ^ The skolemised term variables and fields. , _envvals :: !(HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) -- ^ The bound values. - , _envchs :: !(HM.HashMap (Qualified TypeConName, ChoiceName) (Expr -> Expr -> Expr -> UpdateSet)) + , _envchs :: !(HM.HashMap (Qualified TypeConName, ChoiceName) + (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet)) -- ^ The set of relevant choices, mapping to functions from self, this and args to its updates. , _envdats :: !(HM.HashMap TypeConName DefDataType) -- ^ The set of data constructors. , _envcids :: !(HM.HashMap Cid ExprVarName) -- ^ The set of fetched cid's mapped to their variable name. - -- TODO: split this off into data types for readability? } emptyEnv :: Env @@ -137,31 +137,35 @@ fieldName2VarName = ExprVarName . unFieldName -- | Type class constraint with the required monadic effects for functions -- manipulating the verification environment. -type MonadEnv m = (MonadError Error m, MonadState Env m) +type MonadEnv m = (MonadError Error m, MonadState (Int,Env) m) -runEnv :: StateT Env (Either Error) () -> Env -> Either Error Env -runEnv comp env0 = do - (_res, env) <- runStateT comp env0 - return env +getEnv :: MonadEnv m => m Env +getEnv = snd <$> get + +putEnv :: MonadEnv m => Env -> m () +putEnv env = get >>= \(uni,_) -> put (uni,env) --- TODO: some of these might not be needed anymore. --- | Run a computation in the current environment, with an additional --- environment extension. -introEnv :: MonadEnv m => Env -> m () -introEnv env = modify (concatEnv env) +fresh :: MonadEnv m => m String +fresh = do + (cur,env) <- get + put (cur + 1,env) + return $ show cur + +runEnv :: StateT (Int,Env) (Either Error) () -> Env -> Either Error Env +runEnv comp env0 = do + (_res, (_uni,env1)) <- runStateT comp (0,env0) + return env1 extVarEnv :: MonadEnv m => ExprVarName -> m () --- TODO: Check for doubles when adding -extVarEnv x = get >>= \env@Env{..} -> put env{_envskol = SkolVar x : _envskol} +extVarEnv x = do + env@Env{..} <- getEnv + putEnv env{_envskol = SkolVar x : _envskol} --- TODO: Problem! ExprVarName is always `this` or `arg`, so it overwrites!! --- Possible solution: pass in the current template? extRecEnv :: MonadEnv m => ExprVarName -> [FieldName] -> m () --- TODO: Check for doubles when adding -extRecEnv x fs = get >>= \env@Env{..} -> put env{_envskol = SkolRec x fs : _envskol} +extRecEnv x fs = getEnv >>= \env@Env{..} -> putEnv env{_envskol = SkolRec x fs : _envskol} extValEnv :: MonadEnv m => Qualified ExprValName -> Expr -> UpdateSet -> m () -extValEnv val expr upd = get >>= \env@Env{..} -> put env{_envvals = HM.insert val (expr, upd) _envvals} +extValEnv val expr upd = getEnv >>= \env@Env{..} -> putEnv env{_envvals = HM.insert val (expr, upd) _envvals} -- | Extends the environment with a new choice. extChEnv :: MonadEnv m @@ -179,18 +183,18 @@ extChEnv :: MonadEnv m -- ^ The updates performed by the new choice. -> m () extChEnv tc ch self this arg upd = do - env@Env{..} <- get - let substUpd = \sExp tExp aExp -> trace ("Subst " ++ (show arg) ++ "with" ++ (show aExp)) $ substituteTmUpd (Map.fromList [(self,sExp),(this,tExp),(arg,aExp)]) upd - put env{_envchs = HM.insert (tc, ch) substUpd _envchs} + env@Env{..} <- getEnv + let substUpd = \sExp tExp aExp -> substituteTmUpd (createExprSubst [(self,sExp),(this,tExp),(arg,aExp)]) upd + putEnv env{_envchs = HM.insert (tc, ch) (self,this,arg,substUpd) _envchs} extDatsEnv :: MonadEnv m => HM.HashMap TypeConName DefDataType -> m () -extDatsEnv hmap = get >>= \env@Env{..} -> put env{_envdats = hmap `HM.union` _envdats} +extDatsEnv hmap = getEnv >>= \env@Env{..} -> putEnv env{_envdats = hmap `HM.union` _envdats} extCidEnv :: MonadEnv m => Expr -> ExprVarName -> m () extCidEnv exp var = do cid <- expr2cid exp - env@Env{..} <- get - put env{_envcids = HM.insert cid var _envcids} + env@Env{..} <- getEnv + putEnv env{_envcids = HM.insert cid var _envcids} -- TODO: Is one layer of recursion enough? extRecEnvLvl1 :: MonadEnv m => [(FieldName, Type)] -> m () @@ -205,15 +209,15 @@ extRecEnvLvl1 = mapM_ step `catchError` (\_ -> return ()) lookupVar :: MonadEnv m => ExprVarName -> m () +-- TODO: This should be skolemised in the template instead of hardcoding here lookupVar (ExprVarName "self") = return () lookupVar (ExprVarName "this") = return () --- TODO: Is there a nicer way to handle this instead of hardcoding? -lookupVar x = get >>= \ env -> unless (elem (SkolVar x) $ _envskol env) +lookupVar x = getEnv >>= \ env -> unless (elem (SkolVar x) $ _envskol env) (throwError $ UnboundVar x) lookupRec :: MonadEnv m => ExprVarName -> FieldName -> m Bool lookupRec x f = do - env <- get + env <- getEnv let fields = [ fs | SkolRec y fs <- _envskol env , x == y ] if not (null fields) then return (elem f $ head fields) @@ -221,53 +225,45 @@ lookupRec x f = do lookupVal :: MonadEnv m => Qualified ExprValName -> m (Expr, UpdateSet) lookupVal val = do - env <- get + env <- getEnv case lookupValInHMap (_envvals env) val of Just res -> return res Nothing -> throwError (UnknownValue val) lookupChoice :: MonadEnv m => Qualified TypeConName -> ChoiceName -> m (Expr -> Expr -> Expr -> UpdateSet) --- TODO: Actually bind this, instead of hardcoding --- lookupChoice tem (ChoiceName "Archive") = do --- fs <- recTypConFields $ qualObject tem --- let fields = map ((\f -> (f, EVar $ fieldName2VarName f)) . fst) fs --- return emptyUpdateSet{_usArc = [UpdArchive tem fields]} lookupChoice tem ch = do - env <- get + env <- getEnv case lookupChoInHMap (_envchs env) (qualObject tem) ch of Nothing -> throwError (UnknownChoice ch) - Just upd -> return upd + Just (_,_,_,upd) -> return upd lookupDataCon :: MonadEnv m => TypeConName -> m DefDataType lookupDataCon tc = do - env <- get + env <- getEnv case HM.lookup tc (_envdats env) of Nothing -> throwError (UnknownDataCons tc) Just def -> return def lookupCid :: MonadEnv m => Expr -> m ExprVarName lookupCid exp = do - env <- get + env <- getEnv cid <- expr2cid exp case HM.lookup cid (_envcids env) of - Nothing -> trace (show $ _envcids env) $ throwError $ UnknownCid cid + Nothing -> throwError $ UnknownCid cid Just var -> return var +-- TODO: There seems to be something wrong with the PackageRef in Qualified. lookupValInHMap :: HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) -> Qualified ExprValName -> Maybe (Expr, UpdateSet) --- TODO: Temp print -lookupValInHMap hmap val = - -- TODO: There seems to be something wrong with the PackageRef in Qualified. - let ress = HM.elems $ HM.filterWithKey (\name _ -> qualObject name == qualObject val && qualModule name == qualModule val) hmap - in listToMaybe ress - -- in if length ress > 1 - -- then trace ("Overlapping vals! : " ++ show val) $ listToMaybe ress - -- else listToMaybe ress +lookupValInHMap hmap val = listToMaybe $ HM.elems + $ HM.filterWithKey (\name _ -> qualObject name == qualObject val && qualModule name == qualModule val) hmap -- TODO: Does this really need to be a seperate function? -lookupChoInHMap :: HM.HashMap (Qualified TypeConName, ChoiceName) (Expr -> Expr -> Expr -> UpdateSet) - -> TypeConName -> ChoiceName -> Maybe (Expr -> Expr -> Expr -> UpdateSet) +lookupChoInHMap :: HM.HashMap (Qualified TypeConName, ChoiceName) + (ExprVarName, ExprVarName, ExprVarName, Expr -> Expr -> Expr -> UpdateSet) + -> TypeConName -> ChoiceName + -> Maybe (ExprVarName, ExprVarName, ExprVarName, Expr -> Expr -> Expr -> UpdateSet) -- TODO: This TypeConName should be qualified -- TODO: The type con name really should be taken into account here lookupChoInHMap hmap _tem cho = listToMaybe $ HM.elems @@ -313,7 +309,7 @@ recTypFields _ = throwError ExpectRecord recExpFields :: MonadEnv m => Expr -> m [(FieldName, Expr)] recExpFields (EVar x) = do - env <- get + env <- getEnv let fss = [ fs | SkolRec y fs <- _envskol env , x == y ] if not (null fss) -- TODO: I would prefer `this.amount` here @@ -324,13 +320,12 @@ recExpFields (ERecUpd _ f recExp fExp) = do fs <- recExpFields recExp unless (isJust $ find (\(n, _) -> n == f) fs) (throwError $ UnknownRecField f) return $ (f, fExp) : [(n, e) | (n, e) <- fs, n /= f] --- recExpFields _ = throwError ExpectRecord recExpFields (ERecProj _ f e) = do fields <- recExpFields e case lookup f fields of Just e' -> recExpFields e' Nothing -> throwError $ UnknownRecField f -recExpFields e = error ("Expected record: " ++ show e) +recExpFields _ = throwError ExpectRecord substituteTmUpd :: ExprSubst -> UpdateSet -> UpdateSet substituteTmUpd s UpdateSet{..} = UpdateSet susCre susArc _usCho _usVal @@ -368,9 +363,3 @@ instance Show Error where show ExpectRecord = "Impossible: Expected a record type" show ExpectCid = "Impossible: Expected a contract id" show (CyclicModules mods) = "Cyclic modules: " ++ show mods - --- | For testing purposes: print the stored value definitions in the environment. --- TODO: Remove -testPrint :: HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) -> IO () -testPrint hmap = putStrLn "Test print keys:" - >> mapM_ print (HM.keys hmap) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index 853f4d4068c0..ffb4777e725d 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -7,15 +7,12 @@ module DA.Daml.LF.Verify.Generate , Phase(..) ) where --- import Control.Monad.Error.Class (throwError) +import Control.Monad.Error.Class (catchError, throwError) import qualified Data.NameMap as NM --- import Data.Bifunctor (second) -import Debug.Trace import DA.Daml.LF.Ast hiding (lookupChoice) import DA.Daml.LF.Verify.Context import DA.Daml.LF.Verify.Subst -import DA.Pretty data Phase = ValuePhase @@ -75,47 +72,47 @@ genValue pac mod val = do -- TODO: Handle annotated choices, by returning a set of annotations. genChoice :: MonadEnv m => Qualified TypeConName -> ExprVarName -> [FieldName] - -> TemplateChoice -> m GenOutput + -> TemplateChoice -> m () genChoice tem this temFs TemplateChoice{..} = do - trace ("Start choice " ++ show chcName) $ extVarEnv chcSelfBinder - extVarEnv (fst chcArgBinder) + let self' = chcSelfBinder + arg' = fst chcArgBinder + self <- genRenamedVar self' + arg <- genRenamedVar arg' + extVarEnv self + extVarEnv arg argFs <- recTypFields (snd chcArgBinder) - extRecEnv (fst chcArgBinder) argFs - expOut <- genExpr TemplatePhase chcUpdate - if chcConsuming - then let fields = map (\f -> (f, ERecProj (TypeConApp tem []) f (EVar this))) temFs - in return $ addArchiveUpd tem fields expOut - else return expOut + extRecEnv arg argFs + expOut <- genExpr TemplatePhase + $ substituteTmTm (createExprSubst [(self',EVar self),(arg',EVar arg)]) chcUpdate + let go = if chcConsuming + then addArchiveUpd tem fields expOut + else expOut + extChEnv tem chcName self this arg (_goUpd go) + where + fields = map (\f -> (f, ERecProj (TypeConApp tem []) f (EVar this))) temFs genTemplate :: MonadEnv m => PackageRef -> ModuleName -> Template -> m () -- TODO: Take precondition into account? genTemplate pac mod Template{..} = do let name = Qualified pac mod tplTypeCon - fields <- trace ("Start template " ++ (show tplTypeCon)) $ recTypConFields tplTypeCon - -- TODO: skolemise only when defining the choice? But then multiple choice - -- would skolemise multiple times... - -- TODO: skolemise the fields themselves or rather this.field? + fields <- recTypConFields tplTypeCon let fs = map fst fields xs = map fieldName2VarName fs -- TODO: if daml indead translates into `amount = this.amount`, this can be dropped. mapM_ extVarEnv xs + -- TODO: refresh tplParam (this) extRecEnv tplParam fs extRecEnvLvl1 fields - mapM_ (extChoice name fs) (archive : NM.toList tplChoices) + mapM_ (genChoice name tplParam fs) (archive : NM.toList tplChoices) where archive :: TemplateChoice archive = TemplateChoice Nothing (ChoiceName "Archive") True (ENil (TBuiltin BTParty)) (ExprVarName "self") (ExprVarName "arg", TStruct []) (TBuiltin BTUnit) (EUpdate $ UPure (TBuiltin BTUnit) (EBuiltin BEUnit)) - extChoice :: MonadEnv m => Qualified TypeConName -> [FieldName] - -> TemplateChoice -> m () - extChoice tem fs ch@TemplateChoice{..} = do - chOut <- genChoice tem tplParam fs ch - extChEnv tem chcName chcSelfBinder tplParam (fst chcArgBinder) (_goUpd chOut) genExpr :: MonadEnv m => Phase -> Expr -> m GenOutput -genExpr ph exp = trace (renderPretty exp) $ trace " " $ case exp of +genExpr ph = \case ETmApp fun arg -> genForTmApp ph fun arg ETyApp expr typ -> genForTyApp ph expr typ ELet bind body -> genForLet ph bind body @@ -135,6 +132,7 @@ genForTmApp ph fun arg = do funOut <- genExpr ph fun argOut <- genExpr ph arg case _goExp funOut of + -- TODO: Should we rename here? ETmLam bndr body -> do let subst = singleExprSubst (fst bndr) (_goExp argOut) resExpr = substituteTmTm subst body @@ -157,10 +155,6 @@ genForTyApp ph expr typ = do genForLet :: MonadEnv m => Phase -> Binding -> Expr -> m GenOutput genForLet ph bind body = do - -- TODO: temporary test; remove - -- let testSubst = singleExprSubst (fst $ bindingBinder bind) (bindingBound bind) - -- testRec = (==) (substituteTmTm testSubst (bindingBound bind)) (bindingBound bind) - -- unless testRec (error "Recursive function!") bindOut <- genExpr ph (bindingBound bind) let subst = singleExprSubst (fst $ bindingBinder bind) (_goExp bindOut) resExpr = substituteTmTm subst body @@ -190,9 +184,7 @@ genForRecProj ph tc f body = do fs <- recExpFields expr case lookup f fs of Just expr -> genExpr ph expr - -- TODO: Temporary solution - Nothing -> return $ updateGOExpr (ERecProj tc f expr) bodyOut - -- Nothing -> throwError $ UnknownRecField f + Nothing -> throwError $ UnknownRecField f genForCreate :: MonadEnv m => Phase -> Qualified TypeConName -> Expr -> m GenOutput genForCreate ph tem arg = do @@ -206,26 +198,20 @@ genForExercise :: MonadEnv m => Phase -> Qualified TypeConName -> ChoiceName genForExercise ph tem ch cid par arg = do cidOut <- genExpr ph cid argOut <- genExpr ph arg - -- TODO: Substitute arg in these updates - -- TODO: Lookup the cid in the map, and subst this to the matching var - -- TODO: Achieve this by making the updSet a function taking the cid and its args (both ExprVarNames)? updSubst <- lookupChoice tem ch - -- TODO WIP: I dont think this is correct yet. We should look up the var this cidOut is bound to. - test <- lookupDataCon (TypeConName ["Archive"]) - this <- trace (show cid) $ trace (show test) $ lookupCid (_goExp cidOut) + -- TODO: Temporary solution + this <- lookupCid (_goExp cidOut) `catchError` (\_ -> return $ ExprVarName "this") -- TODO: Should we further eval after subst? But how to eval an update set? let updSet = updSubst (_goExp cidOut) (EVar this) (_goExp argOut) return (GenOutput (EUpdate (UExercise tem ch (_goExp cidOut) par (_goExp argOut))) updSet) --- TODO: handle binds by substituting? +-- TODO: Handle arbitrary update outputs, not just simple fetches genForBind :: MonadEnv m => Phase -> Binding -> Expr -> m GenOutput --- TODO: The way we treat updates seems wrong. This should not be a special case. genForBind ph bind body = do bindOut <- genExpr ph (bindingBound bind) case _goExp bindOut of - -- TODO: Create a map from this cid to the variable it binds to EUpdate (UFetch tc cid) -> do - fs <- trace ("Fetch " ++ show tc) $ recTypConFields $ qualObject tc + fs <- recTypConFields $ qualObject tc extRecEnv (fst $ bindingBinder bind) (map fst fs) cidOut <- genExpr ph cid extCidEnv (_goExp cidOut) (fst $ bindingBinder bind) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 37c1b40576cd..3d9b4a8fe102 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -13,13 +13,11 @@ import Data.List (lookup) import Data.Set (toList, fromList) import qualified Data.Text as T import qualified SimpleSMT as S --- import Z3.Monad import DA.Daml.LF.Ast.Base import DA.Daml.LF.Verify.Context --- import DA.Pretty --- TODO: Since S.SExpr is so similar, we might be able to just drop this. +-- TODO: Since S.SExpr is so similar, we could just drop this. -- | A simple form of expressions featuring basic arithmetic. data ConstraintExpr -- | Reference to an expression variable. @@ -42,7 +40,6 @@ exp2CExp (ETmApp (ETmApp (ETyApp (EBuiltin b) _) e1) e2) = case b of BESubNumeric -> CSub (exp2CExp e1) (exp2CExp e2) _ -> error ("Builtin: " ++ show b) exp2CExp e = error ("Conversion: " ++ show e) --- exp2CExp e = error ("Conversion: " ++ renderPretty e) skol2var :: Skolem -> [ExprVarName] skol2var (SkolVar x) = [x] @@ -68,9 +65,8 @@ data ConstraintSet = ConstraintSet constructConstr :: Env -> TypeConName -> ChoiceName -> FieldName -> ConstraintSet constructConstr env tem ch f = case lookupChoInHMap (_envchs env) tem ch of - Just updSubst -> - let upds = updSubst (EVar $ ExprVarName "self") (EVar $ ExprVarName "this") - (EVar $ ExprVarName "args") + Just (self, this, arg, updSubst) -> + let upds = updSubst (EVar self) (EVar this) (EVar arg) vars = concat $ map skol2var $ _envskol env creUpds = filter (\UpdCreate{..} -> tem == qualObject _creTemp) (_usCre upds) creVals = map (exp2CExp . fromJust . (lookup f) . _creField) creUpds @@ -80,7 +76,9 @@ constructConstr env tem ch f = Nothing -> error "Choice not found" cexp2sexp :: [(ExprVarName,S.SExpr)] -> ConstraintExpr -> IO S.SExpr -cexp2sexp vars (CVar x) = return $ fromJust $ lookup x vars +cexp2sexp vars (CVar x) = case lookup x vars of + Just exp -> return exp + Nothing -> error ("Impossible: variable not found " ++ show x) cexp2sexp vars (CAdd ce1 ce2) = do se1 <- cexp2sexp vars ce1 se2 <- cexp2sexp vars ce2 @@ -99,7 +97,7 @@ declareVars s xs = zip xs <$> mapM (\x -> S.declare s (var2str x) S.tInt) xs solveConstr :: FilePath -> ConstraintSet -> IO () solveConstr spath ConstraintSet{..} = do - log <- S.newLogger 0 + log <- S.newLogger 1 sol <- S.newSolver spath ["-in"] (Just log) vars <- declareVars sol $ filterDups _cVars cre <- foldl S.add (S.int 0) <$> mapM (cexp2sexp vars) _cCres diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs index 1e0397d3f25e..a674f4da5832 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs @@ -6,6 +6,7 @@ module DA.Daml.LF.Verify.Subst ( ExprSubst , singleExprSubst , singleTypeSubst + , createExprSubst , substituteTmTm , substituteTyTm ) where @@ -24,6 +25,12 @@ singleExprSubst = Map.singleton singleTypeSubst :: TypeVarName -> Type -> Subst singleTypeSubst = Map.singleton +createExprSubst :: [(ExprVarName,Expr)] -> ExprSubst +createExprSubst = Map.fromList + +substDom :: ExprSubst -> [ExprVarName] +substDom = Map.keys + -- | Apply an expression substitution to an expression. -- TODO: We assume that for any substitution x |-> e : x notin e -- and a |-> t : a notin t. @@ -42,8 +49,10 @@ substituteTmTm s = \case EStructUpd f e1 e2 -> EStructUpd f (substituteTmTm s e1) (substituteTmTm s e2) ETmApp e1 e2 -> ETmApp (substituteTmTm s e1) (substituteTmTm s e2) ETyApp e t -> ETyApp (substituteTmTm s e) t - ETmLam xs e -> ETmLam xs (substituteTmTm s e) - ETyLam as e -> ETyLam as (substituteTmTm s e) + ETmLam (x,t) e -> if x `elem` (substDom s) + then ETmLam (x,t) e + else ETmLam (x,t) (substituteTmTm s e) + ETyLam (a,k) e -> ETyLam (a,k) (substituteTmTm s e) ECase e cs -> ECase (substituteTmTm s e) $ map (\CaseAlternative{..} -> CaseAlternative altPattern (substituteTmTm s altExpr)) cs ELet Binding{..} e -> ELet (Binding bindingBinder $ substituteTmTm s bindingBound) From e04944fcd9e284d5116765ac26bef4b83f0571d3 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Fri, 24 Apr 2020 19:20:46 +0200 Subject: [PATCH 20/50] Cleanup --- compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs | 9 +++++---- compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs | 6 +++--- compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs | 2 +- compiler/damlc/BUILD.bazel | 1 - 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 9ea9b660ae73..a07fe0ca9468 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -36,6 +36,7 @@ import Data.Hashable import GHC.Generics import Data.Maybe (listToMaybe, isJust) import Data.List (find) +import Data.Bifunctor import qualified Data.HashMap.Strict as HM import qualified Data.Text as T @@ -86,7 +87,7 @@ concatUpdateSet (UpdateSet cres1 arcs1 chos1 vals1) (UpdateSet cres2 arcs2 chos2 UpdateSet (cres1 ++ cres2) (arcs1 ++ arcs2) (chos1 ++ chos2) (vals1 ++ vals2) genRenamedVar :: MonadEnv m => ExprVarName -> m ExprVarName -genRenamedVar (ExprVarName x) = ExprVarName . (T.append x) . T.pack <$> fresh +genRenamedVar (ExprVarName x) = ExprVarName . T.append x . T.pack <$> fresh data Skolem = SkolVar ExprVarName @@ -184,7 +185,7 @@ extChEnv :: MonadEnv m -> m () extChEnv tc ch self this arg upd = do env@Env{..} <- getEnv - let substUpd = \sExp tExp aExp -> substituteTmUpd (createExprSubst [(self,sExp),(this,tExp),(arg,aExp)]) upd + let substUpd sExp tExp aExp = substituteTmUpd (createExprSubst [(self,sExp),(this,tExp),(arg,aExp)]) upd putEnv env{_envchs = HM.insert (tc, ch) (self,this,arg,substUpd) _envchs} extDatsEnv :: MonadEnv m => HM.HashMap TypeConName DefDataType -> m () @@ -335,11 +336,11 @@ substituteTmUpd s UpdateSet{..} = UpdateSet susCre susArc _usCho _usVal substituteTmUpdCreate :: ExprSubst -> UpdCreate -> UpdCreate substituteTmUpdCreate s UpdCreate{..} = UpdCreate _creTemp - (map (\(f,e) -> (f, substituteTmTm s e)) _creField) + (map (second (substituteTmTm s)) _creField) substituteTmUpdArchive :: ExprSubst -> UpdArchive -> UpdArchive substituteTmUpdArchive s UpdArchive{..} = UpdArchive _arcTemp - (map (\(f,e) -> (f, substituteTmTm s e)) _arcField) + (map (second (substituteTmTm s)) _arcField) data Error = UnknownValue (Qualified ExprValName) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 3d9b4a8fe102..41db3b376696 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -67,11 +67,11 @@ constructConstr env tem ch f = case lookupChoInHMap (_envchs env) tem ch of Just (self, this, arg, updSubst) -> let upds = updSubst (EVar self) (EVar this) (EVar arg) - vars = concat $ map skol2var $ _envskol env + vars = concatMap skol2var (_envskol env) creUpds = filter (\UpdCreate{..} -> tem == qualObject _creTemp) (_usCre upds) - creVals = map (exp2CExp . fromJust . (lookup f) . _creField) creUpds + creVals = map (exp2CExp . fromJust . lookup f . _creField) creUpds arcUpds = filter (\UpdArchive{..} -> tem == qualObject _arcTemp) (_usArc upds) - arcVals = map (exp2CExp . fromJust . (lookup f) . _arcField) arcUpds + arcVals = map (exp2CExp . fromJust . lookup f . _arcField) arcUpds in ConstraintSet vars creVals arcVals Nothing -> error "Choice not found" diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs index a674f4da5832..7c857f1bc8ef 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs @@ -49,7 +49,7 @@ substituteTmTm s = \case EStructUpd f e1 e2 -> EStructUpd f (substituteTmTm s e1) (substituteTmTm s e2) ETmApp e1 e2 -> ETmApp (substituteTmTm s e1) (substituteTmTm s e2) ETyApp e t -> ETyApp (substituteTmTm s e) t - ETmLam (x,t) e -> if x `elem` (substDom s) + ETmLam (x,t) e -> if x `elem` substDom s then ETmLam (x,t) e else ETmLam (x,t) (substituteTmTm s e) ETyLam (a,k) e -> ETyLam (a,k) (substituteTmTm s e) diff --git a/compiler/damlc/BUILD.bazel b/compiler/damlc/BUILD.bazel index b24b9eab6f1c..6ce1075931bc 100644 --- a/compiler/damlc/BUILD.bazel +++ b/compiler/damlc/BUILD.bazel @@ -24,7 +24,6 @@ da_haskell_binary( "-optl-pthread", ] if is_windows else [], data = [ - "@z3_nix//:bin/z3", "//compiler/damlc/daml-ide-core:dlint.yaml", "@static_asset_d3plus//:js/d3.min.js", "@static_asset_d3plus//:js/d3plus.min.js", From 18b0b97e72b30ea0c491646f3aac002c3b63ee2f Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Mon, 27 Apr 2020 08:56:02 +0200 Subject: [PATCH 21/50] Reals instead of ints --- compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 41db3b376696..3d138a89b5db 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -89,8 +89,7 @@ cexp2sexp vars (CSub ce1 ce2) = do return $ S.sub se1 se2 declareVars :: S.Solver -> [ExprVarName] -> IO [(ExprVarName,S.SExpr)] --- TODO: This should be a float instead of an int -declareVars s xs = zip xs <$> mapM (\x -> S.declare s (var2str x) S.tInt) xs +declareVars s xs = zip xs <$> mapM (\x -> S.declare s (var2str x) S.tReal) xs where var2str :: ExprVarName -> String var2str (ExprVarName x) = T.unpack x @@ -100,8 +99,8 @@ solveConstr spath ConstraintSet{..} = do log <- S.newLogger 1 sol <- S.newSolver spath ["-in"] (Just log) vars <- declareVars sol $ filterDups _cVars - cre <- foldl S.add (S.int 0) <$> mapM (cexp2sexp vars) _cCres - arc <- foldl S.add (S.int 0) <$> mapM (cexp2sexp vars) _cArcs + cre <- foldl S.add (S.real 0) <$> mapM (cexp2sexp vars) _cCres + arc <- foldl S.add (S.real 0) <$> mapM (cexp2sexp vars) _cArcs S.assert sol (S.not (cre `S.eq` arc)) S.check sol >>= print where From 2f3bf708d40694f590aca1d27ad4b876ece63577 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Mon, 27 Apr 2020 10:38:54 +0200 Subject: [PATCH 22/50] Various TODOs --- .../src/DA/Daml/LF/Verify/Context.hs | 8 +- .../src/DA/Daml/LF/Verify/Generate.hs | 137 +++++++++--------- 2 files changed, 72 insertions(+), 73 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index a07fe0ca9468..4dc930c3d64c 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -86,6 +86,8 @@ concatUpdateSet :: UpdateSet -> UpdateSet -> UpdateSet concatUpdateSet (UpdateSet cres1 arcs1 chos1 vals1) (UpdateSet cres2 arcs2 chos2 vals2) = UpdateSet (cres1 ++ cres2) (arcs1 ++ arcs2) (chos1 ++ chos2) (vals1 ++ vals2) +-- TODO: when a renamed var gets renamed again, it might overlap again. +-- We should have an additional field in VarName to denote it's number. genRenamedVar :: MonadEnv m => ExprVarName -> m ExprVarName genRenamedVar (ExprVarName x) = ExprVarName . T.append x . T.pack <$> fresh @@ -131,7 +133,8 @@ concatEnv (Env vars1 vals1 chs1 dats1 cids1) (Env vars2 vals2 chs2 dats2 cids2) Env (vars1 ++ vars2) (vals1 `HM.union` vals2) (chs1 `HM.union` chs2) (dats1 `HM.union` dats2) (cids1 `HM.union` cids2) -- TODO: union makes me slightly nervous, as it allows overlapping keys - -- (and just uses the first) + -- (and just uses the first). `unionWith concatUpdateSet` would indeed be better, + -- but this still makes me nervous as the expr and exprvarnames wouldn't be merged. fieldName2VarName :: FieldName -> ExprVarName fieldName2VarName = ExprVarName . unFieldName @@ -210,9 +213,6 @@ extRecEnvLvl1 = mapM_ step `catchError` (\_ -> return ()) lookupVar :: MonadEnv m => ExprVarName -> m () --- TODO: This should be skolemised in the template instead of hardcoding here -lookupVar (ExprVarName "self") = return () -lookupVar (ExprVarName "this") = return () lookupVar x = getEnv >>= \ env -> unless (elem (SkolVar x) $ _envskol env) (throwError $ UnboundVar x) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index ffb4777e725d..9837d895931b 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -9,6 +9,7 @@ module DA.Daml.LF.Verify.Generate import Control.Monad.Error.Class (catchError, throwError) import qualified Data.NameMap as NM +import Debug.Trace import DA.Daml.LF.Ast hiding (lookupChoice) import DA.Daml.LF.Verify.Context @@ -18,38 +19,38 @@ data Phase = ValuePhase | TemplatePhase -data GenOutput = GenOutput - { _goExp :: Expr +data Output = Output + { _oExpr :: Expr -- ^ The expression, evaluated as far as possible. - , _goUpd :: UpdateSet + , _oUpdate :: UpdateSet -- ^ The updates, performed by this expression. } -emptyGO :: Expr -> GenOutput -emptyGO expr = GenOutput expr emptyUpdateSet +emptyOut :: Expr -> Output +emptyOut expr = Output expr emptyUpdateSet -- | Extend a generator output with the updates of the second generator output. -- Note that the end result will contain the first expression. -combineGO :: GenOutput -> GenOutput -> GenOutput -combineGO genOut1 genOut2 = extendGOUpds (_goUpd genOut2) genOut1 +combineOut :: Output -> Output -> Output +combineOut out1 out2 = extendOutUpds (_oUpdate out2) out1 -updateGOExpr :: Expr +updateOutExpr :: Expr -- ^ The new output expression. - -> GenOutput + -> Output -- ^ The current generator output. - -> GenOutput -updateGOExpr expr gout = gout{_goExp = expr} + -> Output +updateOutExpr expr out = out{_oExpr = expr} -extendGOUpds :: UpdateSet +extendOutUpds :: UpdateSet -- ^ The extension of the update set. - -> GenOutput + -> Output -- ^ The current generator output. - -> GenOutput -extendGOUpds upds gout@GenOutput{..} = gout{_goUpd = concatUpdateSet upds _goUpd} + -> Output +extendOutUpds upds out@Output{..} = out{_oUpdate = concatUpdateSet upds _oUpdate} -addArchiveUpd :: Qualified TypeConName -> [(FieldName, Expr)] -> GenOutput -> GenOutput -addArchiveUpd temp fs (GenOutput expr upd@UpdateSet{..}) = - GenOutput expr upd{_usArc = UpdArchive temp fs : _usArc} +addArchiveUpd :: Qualified TypeConName -> [(FieldName, Expr)] -> Output -> Output +addArchiveUpd temp fs (Output expr upd@UpdateSet{..}) = + Output expr upd{_usArc = UpdArchive temp fs : _usArc} genPackages :: MonadEnv m => Phase -> [(PackageId, (Package, Maybe PackageName))] -> m () genPackages ph inp = mapM_ (genPackage ph) inp @@ -68,12 +69,12 @@ genValue :: MonadEnv m => PackageRef -> ModuleName -> DefValue -> m () genValue pac mod val = do expOut <- genExpr ValuePhase (dvalBody val) let qname = Qualified pac mod (fst $ dvalBinder val) - extValEnv qname (_goExp expOut) (_goUpd expOut) + extValEnv qname (_oExpr expOut) (_oUpdate expOut) -- TODO: Handle annotated choices, by returning a set of annotations. -genChoice :: MonadEnv m => Qualified TypeConName -> ExprVarName -> [FieldName] - -> TemplateChoice -> m () -genChoice tem this temFs TemplateChoice{..} = do +genChoice :: MonadEnv m => Qualified TypeConName -> (ExprVarName,ExprVarName) + -> [FieldName] -> TemplateChoice -> m () +genChoice tem (this',this) temFs TemplateChoice{..} = do let self' = chcSelfBinder arg' = fst chcArgBinder self <- genRenamedVar self' @@ -83,11 +84,11 @@ genChoice tem this temFs TemplateChoice{..} = do argFs <- recTypFields (snd chcArgBinder) extRecEnv arg argFs expOut <- genExpr TemplatePhase - $ substituteTmTm (createExprSubst [(self',EVar self),(arg',EVar arg)]) chcUpdate - let go = if chcConsuming + $ substituteTmTm (createExprSubst [(self',EVar self),(this',EVar this),(arg',EVar arg)]) chcUpdate + let out = if chcConsuming then addArchiveUpd tem fields expOut else expOut - extChEnv tem chcName self this arg (_goUpd go) + extChEnv tem chcName self this arg (_oUpdate out) where fields = map (\f -> (f, ERecProj (TypeConApp tem []) f (EVar this))) temFs @@ -97,13 +98,11 @@ genTemplate pac mod Template{..} = do let name = Qualified pac mod tplTypeCon fields <- recTypConFields tplTypeCon let fs = map fst fields - xs = map fieldName2VarName fs - -- TODO: if daml indead translates into `amount = this.amount`, this can be dropped. - mapM_ extVarEnv xs - -- TODO: refresh tplParam (this) - extRecEnv tplParam fs + this <- genRenamedVar tplParam + extVarEnv this + extRecEnv this fs extRecEnvLvl1 fields - mapM_ (genChoice name tplParam fs) (archive : NM.toList tplChoices) + mapM_ (genChoice name (tplParam,this) fs) (archive : NM.toList tplChoices) where archive :: TemplateChoice archive = TemplateChoice Nothing (ChoiceName "Archive") True @@ -111,7 +110,7 @@ genTemplate pac mod Template{..} = do (ExprVarName "arg", TStruct []) (TBuiltin BTUnit) (EUpdate $ UPure (TBuiltin BTUnit) (EBuiltin BEUnit)) -genExpr :: MonadEnv m => Phase -> Expr -> m GenOutput +genExpr :: MonadEnv m => Phase -> Expr -> m Output genExpr ph = \case ETmApp fun arg -> genForTmApp ph fun arg ETyApp expr typ -> genForTyApp ph expr typ @@ -125,60 +124,60 @@ genExpr ph = \case EUpdate (UBind bind expr) -> genForBind ph bind expr EUpdate (UPure _ expr) -> genExpr ph expr -- TODO: Extend additional cases - e -> return $ emptyGO e + e -> return $ emptyOut e -genForTmApp :: MonadEnv m => Phase -> Expr -> Expr -> m GenOutput +genForTmApp :: MonadEnv m => Phase -> Expr -> Expr -> m Output genForTmApp ph fun arg = do funOut <- genExpr ph fun - argOut <- genExpr ph arg - case _goExp funOut of + arout <- genExpr ph arg + case _oExpr funOut of -- TODO: Should we rename here? ETmLam bndr body -> do - let subst = singleExprSubst (fst bndr) (_goExp argOut) + let subst = singleExprSubst (fst bndr) (_oExpr arout) resExpr = substituteTmTm subst body resOut <- genExpr ph resExpr - return $ combineGO resOut - $ combineGO funOut argOut - fun' -> return $ updateGOExpr (ETmApp fun' (_goExp argOut)) - $ combineGO funOut argOut + return $ combineOut resOut + $ combineOut funOut arout + fun' -> return $ updateOutExpr (ETmApp fun' (_oExpr arout)) + $ combineOut funOut arout -genForTyApp :: MonadEnv m => Phase -> Expr -> Type -> m GenOutput +genForTyApp :: MonadEnv m => Phase -> Expr -> Type -> m Output genForTyApp ph expr typ = do exprOut <- genExpr ph expr - case _goExp exprOut of + case _oExpr exprOut of ETyLam bndr body -> do let subst = singleTypeSubst (fst bndr) typ resExpr = substituteTyTm subst body resOut <- genExpr ph resExpr - return $ combineGO resOut exprOut - expr' -> return $ updateGOExpr (ETyApp expr' typ) exprOut + return $ combineOut resOut exprOut + expr' -> return $ updateOutExpr (ETyApp expr' typ) exprOut -genForLet :: MonadEnv m => Phase -> Binding -> Expr -> m GenOutput +genForLet :: MonadEnv m => Phase -> Binding -> Expr -> m Output genForLet ph bind body = do bindOut <- genExpr ph (bindingBound bind) - let subst = singleExprSubst (fst $ bindingBinder bind) (_goExp bindOut) + let subst = singleExprSubst (fst $ bindingBinder bind) (_oExpr bindOut) resExpr = substituteTmTm subst body resOut <- genExpr ph resExpr - return $ combineGO resOut bindOut + return $ combineOut resOut bindOut -genForVar :: MonadEnv m => Phase -> ExprVarName -> m GenOutput -genForVar _ph name = lookupVar name >> return (emptyGO (EVar name)) +genForVar :: MonadEnv m => Phase -> ExprVarName -> m Output +genForVar _ph name = lookupVar name >> return (emptyOut (EVar name)) -genForVal :: MonadEnv m => Phase -> Qualified ExprValName -> m GenOutput +genForVal :: MonadEnv m => Phase -> Qualified ExprValName -> m Output genForVal ValuePhase w - = return $ GenOutput (EVal w) (emptyUpdateSet{_usVal = [w]}) + = return $ Output (EVal w) (emptyUpdateSet{_usVal = [w]}) genForVal TemplatePhase w - = lookupVal w >>= \ (expr, upds) -> return (GenOutput expr upds) + = lookupVal w >>= \ (expr, upds) -> return (Output expr upds) -genForRecProj :: MonadEnv m => Phase -> TypeConApp -> FieldName -> Expr -> m GenOutput +genForRecProj :: MonadEnv m => Phase -> TypeConApp -> FieldName -> Expr -> m Output genForRecProj ph tc f body = do bodyOut <- genExpr ph body - case _goExp bodyOut of + case _oExpr bodyOut of -- TODO: I think we can reduce duplication a bit more here EVar x -> do skol <- lookupRec x f if skol - then return $ updateGOExpr (ERecProj tc f (EVar x)) bodyOut + then return $ updateOutExpr (ERecProj tc f (EVar x)) bodyOut else error ("Impossible: expected skolem record: " ++ show x ++ "." ++ show f) expr -> do fs <- recExpFields expr @@ -186,36 +185,36 @@ genForRecProj ph tc f body = do Just expr -> genExpr ph expr Nothing -> throwError $ UnknownRecField f -genForCreate :: MonadEnv m => Phase -> Qualified TypeConName -> Expr -> m GenOutput +genForCreate :: MonadEnv m => Phase -> Qualified TypeConName -> Expr -> m Output genForCreate ph tem arg = do - argOut <- genExpr ph arg - fs <- recExpFields (_goExp argOut) - return (GenOutput (EUpdate (UCreate tem $ _goExp argOut)) emptyUpdateSet{_usCre = [UpdCreate tem fs]}) + arout <- genExpr ph arg + fs <- recExpFields (_oExpr arout) + return (Output (EUpdate (UCreate tem $ _oExpr arout)) emptyUpdateSet{_usCre = [UpdCreate tem fs]}) -- TODO: We could potentially filter here to only store the interesting fields? genForExercise :: MonadEnv m => Phase -> Qualified TypeConName -> ChoiceName - -> Expr -> Maybe Expr -> Expr -> m GenOutput + -> Expr -> Maybe Expr -> Expr -> m Output genForExercise ph tem ch cid par arg = do cidOut <- genExpr ph cid - argOut <- genExpr ph arg + arout <- genExpr ph arg updSubst <- lookupChoice tem ch -- TODO: Temporary solution - this <- lookupCid (_goExp cidOut) `catchError` (\_ -> return $ ExprVarName "this") + this <- lookupCid (_oExpr cidOut) `catchError` (\_ -> trace ("Not found: " ++ show (_oExpr cidOut)) $ return $ ExprVarName "this") -- TODO: Should we further eval after subst? But how to eval an update set? - let updSet = updSubst (_goExp cidOut) (EVar this) (_goExp argOut) - return (GenOutput (EUpdate (UExercise tem ch (_goExp cidOut) par (_goExp argOut))) updSet) + let updSet = updSubst (_oExpr cidOut) (EVar this) (_oExpr arout) + return (Output (EUpdate (UExercise tem ch (_oExpr cidOut) par (_oExpr arout))) updSet) -- TODO: Handle arbitrary update outputs, not just simple fetches -genForBind :: MonadEnv m => Phase -> Binding -> Expr -> m GenOutput +genForBind :: MonadEnv m => Phase -> Binding -> Expr -> m Output genForBind ph bind body = do bindOut <- genExpr ph (bindingBound bind) - case _goExp bindOut of + case _oExpr bindOut of EUpdate (UFetch tc cid) -> do fs <- recTypConFields $ qualObject tc extRecEnv (fst $ bindingBinder bind) (map fst fs) cidOut <- genExpr ph cid - extCidEnv (_goExp cidOut) (fst $ bindingBinder bind) + extCidEnv (_oExpr cidOut) (fst $ bindingBinder bind) _ -> return () extVarEnv (fst $ bindingBinder bind) bodyOut <- genExpr ph body - return $ combineGO bodyOut bindOut + return $ combineOut bodyOut bindOut From 0911a908824f55def980288dc9786f5778ae42a6 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Mon, 27 Apr 2020 14:30:53 +0200 Subject: [PATCH 23/50] Added function documentation --- .../src/DA/Daml/LF/Verify/Context.hs | 227 +++++++++++++++--- .../src/DA/Daml/LF/Verify/Generate.hs | 201 ++++++++++++++-- .../src/DA/Daml/LF/Verify/Solve.hs | 53 +++- .../src/DA/Daml/LF/Verify/Subst.hs | 62 ++++- 4 files changed, 468 insertions(+), 75 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 4dc930c3d64c..3ff983da0dd1 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -43,6 +43,7 @@ import qualified Data.Text as T import DA.Daml.LF.Ast hiding (lookupChoice) import DA.Daml.LF.Verify.Subst +-- | Data type denoting a create update. data UpdCreate = UpdCreate { _creTemp :: !(Qualified TypeConName) -- ^ Qualified type constructor corresponding to the contract template. @@ -50,6 +51,7 @@ data UpdCreate = UpdCreate -- ^ The fields to be verified, together with their value. } deriving Show +-- | Data type denoting an archive update. data UpdArchive = UpdArchive { _arcTemp :: !(Qualified TypeConName) -- ^ Qualified type constructor corresponding to the contract template. @@ -57,6 +59,7 @@ data UpdArchive = UpdArchive -- ^ The fields to be verified, together with their value. } deriving Show +-- | Data type denoting an exercised choice update. data UpdChoice = UpdChoice { _choTemp :: !(Qualified TypeConName) -- ^ Qualified type constructor corresponding to the contract template. @@ -76,21 +79,33 @@ data UpdateSet = UpdateSet , _usVal :: ![Qualified ExprValName] -- ^ The list of referenced values. These will be replaced by their -- respective updates after solving. + -- Note that this should be empty after the `ValuePhase`. } deriving Show +-- | Create an empty update set. emptyUpdateSet :: UpdateSet emptyUpdateSet = UpdateSet [] [] [] [] -concatUpdateSet :: UpdateSet -> UpdateSet -> UpdateSet +-- | Combine two update sets. +concatUpdateSet :: UpdateSet + -- ^ The first update set to be combined. + -> UpdateSet + -- ^ The second update set to be combined. + -> UpdateSet concatUpdateSet (UpdateSet cres1 arcs1 chos1 vals1) (UpdateSet cres2 arcs2 chos2 vals2) = UpdateSet (cres1 ++ cres2) (arcs1 ++ arcs2) (chos1 ++ chos2) (vals1 ++ vals2) +-- | Refresh a given expression variable by producing a fresh renamed variable. -- TODO: when a renamed var gets renamed again, it might overlap again. -- We should have an additional field in VarName to denote it's number. -genRenamedVar :: MonadEnv m => ExprVarName -> m ExprVarName +genRenamedVar :: MonadEnv m + => ExprVarName + -- ^ The variable to be renamed. + -> m ExprVarName genRenamedVar (ExprVarName x) = ExprVarName . T.append x . T.pack <$> fresh +-- | Data type denoting a skolemized variable. data Skolem = SkolVar ExprVarName -- ^ Skolemised term variable. @@ -99,16 +114,23 @@ data Skolem -- e.g. `this.field` deriving (Eq, Show) -expr2cid :: MonadEnv m => Expr -> m Cid -expr2cid (EVar x) = return $ CidVar x -expr2cid (ERecProj _ f (EVar x)) = return $ CidRec x f -expr2cid _ = throwError ExpectCid - +-- | Data type denoting a contract id. data Cid = CidVar ExprVarName + -- ^ An expression variable denoting a contract id. | CidRec ExprVarName FieldName + -- ^ A record projection denoting a contract id. deriving (Generic, Hashable, Eq, Show) +-- | Convert an expression to a contract id, if possible. +expr2cid :: MonadEnv m + => Expr + -- ^ The expression to be converted. + -> m Cid +expr2cid (EVar x) = return $ CidVar x +expr2cid (ERecProj _ f (EVar x)) = return $ CidRec x f +expr2cid _ = throwError ExpectCid + -- TODO: Could we alternatively just declare the variables that occur in the updates and drop the skolems? -- | The environment for the DAML-LF verifier data Env = Env @@ -125,10 +147,16 @@ data Env = Env -- ^ The set of fetched cid's mapped to their variable name. } +-- | Construct an empty environment. emptyEnv :: Env emptyEnv = Env [] HM.empty HM.empty HM.empty HM.empty -concatEnv :: Env -> Env -> Env +-- | Combine two environments. +concatEnv :: Env + -- ^ The first environment to be combined. + -> Env + -- ^ The second environment to be combined. + -> Env concatEnv (Env vars1 vals1 chs1 dats1 cids1) (Env vars2 vals2 chs2 dats2 cids2) = Env (vars1 ++ vars2) (vals1 `HM.union` vals2) (chs1 `HM.union` chs2) (dats1 `HM.union` dats2) (cids1 `HM.union` cids2) @@ -136,6 +164,7 @@ concatEnv (Env vars1 vals1 chs1 dats1 cids1) (Env vars2 vals2 chs2 dats2 cids2) -- (and just uses the first). `unionWith concatUpdateSet` would indeed be better, -- but this still makes me nervous as the expr and exprvarnames wouldn't be merged. +-- | Convert a fieldname into an expression variable name. fieldName2VarName :: FieldName -> ExprVarName fieldName2VarName = ExprVarName . unFieldName @@ -143,33 +172,63 @@ fieldName2VarName = ExprVarName . unFieldName -- manipulating the verification environment. type MonadEnv m = (MonadError Error m, MonadState (Int,Env) m) +-- | Fetch the current environment. getEnv :: MonadEnv m => m Env getEnv = snd <$> get +-- | Set the current environment. putEnv :: MonadEnv m => Env -> m () putEnv env = get >>= \(uni,_) -> put (uni,env) +-- | Generate a new unique name. fresh :: MonadEnv m => m String fresh = do (cur,env) <- get put (cur + 1,env) return $ show cur -runEnv :: StateT (Int,Env) (Either Error) () -> Env -> Either Error Env +-- | Evaluate the MonadEnv to produce an error message or the final environment. +runEnv :: StateT (Int,Env) (Either Error) () + -- ^ The monadic computation to be evaluated. + -> Env + -- ^ The initial environment to start from. + -> Either Error Env runEnv comp env0 = do (_res, (_uni,env1)) <- runStateT comp (0,env0) return env1 -extVarEnv :: MonadEnv m => ExprVarName -> m () +-- | Skolemise an expression variable and extend the environment. +extVarEnv :: MonadEnv m + => ExprVarName + -- ^ The expression variable to be skolemised. + -> m () extVarEnv x = do env@Env{..} <- getEnv putEnv env{_envskol = SkolVar x : _envskol} -extRecEnv :: MonadEnv m => ExprVarName -> [FieldName] -> m () -extRecEnv x fs = getEnv >>= \env@Env{..} -> putEnv env{_envskol = SkolRec x fs : _envskol} - -extValEnv :: MonadEnv m => Qualified ExprValName -> Expr -> UpdateSet -> m () -extValEnv val expr upd = getEnv >>= \env@Env{..} -> putEnv env{_envvals = HM.insert val (expr, upd) _envvals} +-- | Skolemise a list of record projection and extend the environment. +extRecEnv :: MonadEnv m + => ExprVarName + -- ^ The variable on which is being projected. + -> [FieldName] + -- ^ The fields which should be skolemised. + -> m () +extRecEnv x fs = do + env@Env{..} <- getEnv + putEnv env{_envskol = SkolRec x fs : _envskol} + +-- | Extend the environment with a new value definition. +extValEnv :: MonadEnv m + => Qualified ExprValName + -- ^ The name of the value being defined. + -> Expr + -- ^ The (partially) evaluated value definition. + -> UpdateSet + -- ^ The updates performed by this value. + -> m () +extValEnv val expr upd = do + env@Env{..} <- getEnv + putEnv env{_envvals = HM.insert val (expr, upd) _envvals} -- | Extends the environment with a new choice. extChEnv :: MonadEnv m @@ -191,17 +250,35 @@ extChEnv tc ch self this arg upd = do let substUpd sExp tExp aExp = substituteTmUpd (createExprSubst [(self,sExp),(this,tExp),(arg,aExp)]) upd putEnv env{_envchs = HM.insert (tc, ch) (self,this,arg,substUpd) _envchs} -extDatsEnv :: MonadEnv m => HM.HashMap TypeConName DefDataType -> m () -extDatsEnv hmap = getEnv >>= \env@Env{..} -> putEnv env{_envdats = hmap `HM.union` _envdats} +-- | Extend the environment with a list of new data type definitions. +extDatsEnv :: MonadEnv m + => HM.HashMap TypeConName DefDataType + -- ^ A hashmap of the data constructor names, with their corresponding definitions. + -> m () +extDatsEnv hmap = do + env@Env{..} <- getEnv + putEnv env{_envdats = hmap `HM.union` _envdats} -extCidEnv :: MonadEnv m => Expr -> ExprVarName -> m () +-- | Extend the environment with a new contract id, and the variable to which +-- the fetched contract is bound. +extCidEnv :: MonadEnv m + => Expr + -- ^ The contract id expression. + -> ExprVarName + -- ^ The variable name to which the fetched contract is bound. + -> m () extCidEnv exp var = do cid <- expr2cid exp env@Env{..} <- getEnv putEnv env{_envcids = HM.insert cid var _envcids} -- TODO: Is one layer of recursion enough? -extRecEnvLvl1 :: MonadEnv m => [(FieldName, Type)] -> m () +-- | Recursively skolemise the given record fields, when they have a record +-- type. Note that this only works 1 level deep. +extRecEnvLvl1 :: MonadEnv m + => [(FieldName, Type)] + -- ^ The record fields to skolemise, together with their types. + -> m () extRecEnvLvl1 = mapM_ step where step :: MonadEnv m => (FieldName, Type) -> m () @@ -212,11 +289,24 @@ extRecEnvLvl1 = mapM_ step -- TODO: Temporary fix `catchError` (\_ -> return ()) -lookupVar :: MonadEnv m => ExprVarName -> m () +-- | Lookup an expression variable in the environment. Succeeds if this variable +-- has been skolemised, or throws an error if it hasn't. +lookupVar :: MonadEnv m + => ExprVarName + -- ^ The expression variable to look up. + -> m () +-- TODO: It might be nicer to return a bool here as well? lookupVar x = getEnv >>= \ env -> unless (elem (SkolVar x) $ _envskol env) (throwError $ UnboundVar x) -lookupRec :: MonadEnv m => ExprVarName -> FieldName -> m Bool +-- | Lookup a record project in the environment. Returns a boolean denoting +-- whether or not the record projection has been skolemised. +lookupRec :: MonadEnv m + => ExprVarName + -- ^ The expression variable on which is being projected. + -> FieldName + -- ^ The field name which is being projected. + -> m Bool lookupRec x f = do env <- getEnv let fields = [ fs | SkolRec y fs <- _envskol env , x == y ] @@ -224,14 +314,26 @@ lookupRec x f = do then return (elem f $ head fields) else return False -lookupVal :: MonadEnv m => Qualified ExprValName -> m (Expr, UpdateSet) +-- | Lookup a value name in the environment. Returns its (partially) evaluated +-- definition, together with the updates it performs. +lookupVal :: MonadEnv m + => Qualified ExprValName + -- ^ The value name to lookup. + -> m (Expr, UpdateSet) lookupVal val = do env <- getEnv case lookupValInHMap (_envvals env) val of Just res -> return res Nothing -> throwError (UnknownValue val) -lookupChoice :: MonadEnv m => Qualified TypeConName -> ChoiceName +-- | Lookup a choice name in the environment. Returns a function which, once +-- self, this and args have been instantiated, returns the set of updates it +-- performs. +lookupChoice :: MonadEnv m + => Qualified TypeConName + -- ^ The template name in which this choice is defined. + -> ChoiceName + -- ^ The choice name to lookup. -> m (Expr -> Expr -> Expr -> UpdateSet) lookupChoice tem ch = do env <- getEnv @@ -239,14 +341,23 @@ lookupChoice tem ch = do Nothing -> throwError (UnknownChoice ch) Just (_,_,_,upd) -> return upd -lookupDataCon :: MonadEnv m => TypeConName -> m DefDataType +-- | Lookup a data type definition in the environment. +lookupDataCon :: MonadEnv m + => TypeConName + -- ^ The data constructor to lookup. + -> m DefDataType lookupDataCon tc = do env <- getEnv case HM.lookup tc (_envdats env) of Nothing -> throwError (UnknownDataCons tc) Just def -> return def -lookupCid :: MonadEnv m => Expr -> m ExprVarName +-- | Lookup a contract id in the environment. Returns the variable its fetched +-- contract is bound to. +lookupCid :: MonadEnv m + => Expr + -- ^ The contract id to lookup. + -> m ExprVarName lookupCid exp = do env <- getEnv cid <- expr2cid exp @@ -255,29 +366,48 @@ lookupCid exp = do Just var -> return var -- TODO: There seems to be something wrong with the PackageRef in Qualified. +-- | Helper function to lookup a value definition in a HashMap. lookupValInHMap :: HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) - -> Qualified ExprValName -> Maybe (Expr, UpdateSet) + -- ^ The HashMap in which to look. + -> Qualified ExprValName + -- ^ The value name to lookup. + -> Maybe (Expr, UpdateSet) lookupValInHMap hmap val = listToMaybe $ HM.elems $ HM.filterWithKey (\name _ -> qualObject name == qualObject val && qualModule name == qualModule val) hmap -- TODO: Does this really need to be a seperate function? +-- | Helper function to lookup a choice in a HashMap. Returns the variables for +-- self, this and args used, as well as a function which, given the values for +-- self, this and args, produces the list of updates performed by this choice. lookupChoInHMap :: HM.HashMap (Qualified TypeConName, ChoiceName) (ExprVarName, ExprVarName, ExprVarName, Expr -> Expr -> Expr -> UpdateSet) - -> TypeConName -> ChoiceName + -- ^ The HashMap in which to look. + -> TypeConName + -- ^ The template in which the choice is defined. + -> ChoiceName + -- ^ The choice name to lookup. -> Maybe (ExprVarName, ExprVarName, ExprVarName, Expr -> Expr -> Expr -> UpdateSet) -- TODO: This TypeConName should be qualified -- TODO: The type con name really should be taken into account here lookupChoInHMap hmap _tem cho = listToMaybe $ HM.elems $ HM.filterWithKey (\(_t, c) _ -> c == cho) hmap +-- | Solves the value references by computing the closure of all referenced +-- values, for each value in the environment. +-- It thus empties `_usVal` by collecting all updates made by this closure. +-- TODO: There are undoubtedly more efficient algorithms for computing this. solveValueUpdatesEnv :: Env -> Env solveValueUpdatesEnv env = let hmap0 = _envvals env hmap1 = foldl solveValueUpdate hmap0 (HM.keys hmap0) in env{_envvals = hmap1} +-- | Compute the value reference closure for a single value. solveValueUpdate :: HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) - -> Qualified ExprValName -> HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) + -- ^ The HashMap containing the updates for each value. + -> Qualified ExprValName + -- ^ The current value to solve. + -> HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) solveValueUpdate hmap0 val0 = let (hmap1, _, _) = step (hmap0, emptyUpdateSet, []) val0 in hmap1 @@ -296,19 +426,32 @@ solveValueUpdate hmap0 val0 = in (HM.insert val (expr, nvalupd) nhmap, concatUpdateSet baseupd nvalupd, val:vis) -- TODO: This should work recursively -recTypConFields :: MonadEnv m => TypeConName -> m [(FieldName,Type)] +-- | Lookup the field names and corresponding types, for a given record type +-- constructor name. +recTypConFields :: MonadEnv m + => TypeConName + -- ^ The record type constructor name to lookup. + -> m [(FieldName,Type)] recTypConFields tc = lookupDataCon tc >>= \dat -> case dataCons dat of DataRecord fields -> return fields _ -> throwError ExpectRecord -recTypFields :: MonadEnv m => Type -> m [FieldName] +-- | Lookup the fields for a given record type. +recTypFields :: MonadEnv m + => Type + -- ^ The type to lookup. + -> m [FieldName] recTypFields (TCon tc) = do fields <- recTypConFields $ qualObject tc return $ map fst fields recTypFields (TStruct fs) = return $ map fst fs recTypFields _ = throwError ExpectRecord -recExpFields :: MonadEnv m => Expr -> m [(FieldName, Expr)] +-- | Lookup the record fields and corresponding values from a given expression. +recExpFields :: MonadEnv m + => Expr + -- ^ The expression to lookup. + -> m [(FieldName, Expr)] recExpFields (EVar x) = do env <- getEnv let fss = [ fs | SkolRec y fs <- _envskol env , x == y ] @@ -328,20 +471,36 @@ recExpFields (ERecProj _ f e) = do Nothing -> throwError $ UnknownRecField f recExpFields _ = throwError ExpectRecord -substituteTmUpd :: ExprSubst -> UpdateSet -> UpdateSet +-- | Apply an expression substitution to an update set. +substituteTmUpd :: ExprSubst + -- ^ The substitution to apply. + -> UpdateSet + -- ^ The update set on which to apply the substitution. + -> UpdateSet substituteTmUpd s UpdateSet{..} = UpdateSet susCre susArc _usCho _usVal where susCre = map (substituteTmUpdCreate s) _usCre susArc = map (substituteTmUpdArchive s) _usArc -substituteTmUpdCreate :: ExprSubst -> UpdCreate -> UpdCreate +-- | Apply an expression substitution to a create update. +substituteTmUpdCreate :: ExprSubst + -- ^ The substitution to apply. + -> UpdCreate + -- ^ The create update on which to apply the substitution. + -> UpdCreate substituteTmUpdCreate s UpdCreate{..} = UpdCreate _creTemp (map (second (substituteTmTm s)) _creField) -substituteTmUpdArchive :: ExprSubst -> UpdArchive -> UpdArchive +-- | Apply an expression substitution to an archive update. +substituteTmUpdArchive :: ExprSubst + -- ^ The substitution to apply. + -> UpdArchive + -- ^ The archive update on which to apply the substitution. + -> UpdArchive substituteTmUpdArchive s UpdArchive{..} = UpdArchive _arcTemp (map (second (substituteTmTm s)) _arcField) +-- | Data type representing an error. data Error = UnknownValue (Qualified ExprValName) | UnknownDataCons TypeConName diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index 9837d895931b..0c752464a7a3 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -15,10 +15,14 @@ import DA.Daml.LF.Ast hiding (lookupChoice) import DA.Daml.LF.Verify.Context import DA.Daml.LF.Verify.Subst +-- | Data type denoting the phase of the constraint generator. data Phase = ValuePhase + -- ^ The value phase gathers all value and data type definitions across modules. | TemplatePhase + -- ^ The template phase gathers the updates performed by choices. +-- | Data type denoting the output of the constraint generator. data Output = Output { _oExpr :: Expr -- ^ The expression, evaluated as far as possible. @@ -26,54 +30,113 @@ data Output = Output -- ^ The updates, performed by this expression. } -emptyOut :: Expr -> Output +-- | Construct an output with no updates. +emptyOut :: Expr + -- ^ The evaluated expression. + -> Output emptyOut expr = Output expr emptyUpdateSet -- | Extend a generator output with the updates of the second generator output. --- Note that the end result will contain the first expression. +-- Note that the end result will contain only the first expression. combineOut :: Output -> Output -> Output combineOut out1 out2 = extendOutUpds (_oUpdate out2) out1 +-- | Update an output with a new evaluated expression. updateOutExpr :: Expr -- ^ The new output expression. -> Output - -- ^ The current generator output. + -- ^ The generator output to be updated. -> Output updateOutExpr expr out = out{_oExpr = expr} +-- | Update an output with additional updates. extendOutUpds :: UpdateSet -- ^ The extension of the update set. -> Output - -- ^ The current generator output. + -- ^ The generator output to be updated. -> Output extendOutUpds upds out@Output{..} = out{_oUpdate = concatUpdateSet upds _oUpdate} -addArchiveUpd :: Qualified TypeConName -> [(FieldName, Expr)] -> Output -> Output +-- | Update an output with an additional Archive update. +addArchiveUpd :: Qualified TypeConName + -- ^ The template to be archived. + -> [(FieldName, Expr)] + -- ^ The fields to be archived, with their respective values. + -> Output + -- ^ The generator output to be updated. + -> Output addArchiveUpd temp fs (Output expr upd@UpdateSet{..}) = Output expr upd{_usArc = UpdArchive temp fs : _usArc} -genPackages :: MonadEnv m => Phase -> [(PackageId, (Package, Maybe PackageName))] -> m () +-- | Generate an environment for a given list of packages. +-- Depending on the generator phase, this either adds all value and data type +-- definitions to the environment, or all template definitions with their +-- respective choices. +genPackages :: MonadEnv m + => Phase + -- ^ The current generator phase. + -> [(PackageId, (Package, Maybe PackageName))] + -- ^ The list of packages, as produced by `readPackages`. + -> m () genPackages ph inp = mapM_ (genPackage ph) inp -genPackage :: MonadEnv m => Phase -> (PackageId, (Package, Maybe PackageName)) -> m () +-- | Generate an environment for a given package. +-- Depending on the generator phase, this either adds all value and data type +-- definitions to the environment, or all template definitions with their +-- respective choices. +genPackage :: MonadEnv m + => Phase + -- ^ The current generator phase. + -> (PackageId, (Package, Maybe PackageName)) + -- ^ The package, as produced by `readPackages`. + -> m () genPackage ph (id, (pac, _)) = mapM_ (genModule ph (PRImport id)) (NM.toList $ packageModules pac) -genModule :: MonadEnv m => Phase -> PackageRef -> Module -> m () +-- | Generate an environment for a given module. +-- Depending on the generator phase, this either adds all value and data type +-- definitions to the environment, or all template definitions with their +-- respective choices. +genModule :: MonadEnv m + => Phase + -- ^ The current generator phase. + -> PackageRef + -- ^ A reference to the package in which this module is defined. + -> Module + -- ^ The module to analyse. + -> m () genModule ValuePhase pac mod = do extDatsEnv (NM.toHashMap (moduleDataTypes mod)) mapM_ (genValue pac (moduleName mod)) (NM.toList $ moduleValues mod) genModule TemplatePhase pac mod = mapM_ (genTemplate pac (moduleName mod)) (NM.toList $ moduleTemplates mod) -genValue :: MonadEnv m => PackageRef -> ModuleName -> DefValue -> m () +-- | Analyse a value definition and add to the environment. +genValue :: MonadEnv m + => PackageRef + -- ^ A reference to the package in which this value is defined. + -> ModuleName + -- ^ The name of the module in which this value is defined. + -> DefValue + -- ^ The value to be analysed and added. + -> m () genValue pac mod val = do expOut <- genExpr ValuePhase (dvalBody val) let qname = Qualified pac mod (fst $ dvalBinder val) extValEnv qname (_oExpr expOut) (_oUpdate expOut) +-- | Analyse a choice definition and add to the environment. -- TODO: Handle annotated choices, by returning a set of annotations. -genChoice :: MonadEnv m => Qualified TypeConName -> (ExprVarName,ExprVarName) - -> [FieldName] -> TemplateChoice -> m () +genChoice :: MonadEnv m + => Qualified TypeConName + -- ^ The template in which this choice is defined. + -> (ExprVarName,ExprVarName) + -- ^ The original and renamed variable `this` referencing the contract on + -- which this choice is called. + -> [FieldName] + -- ^ The list of fields available in the template. + -> TemplateChoice + -- ^ The choice to be analysed and added. + -> m () genChoice tem (this',this) temFs TemplateChoice{..} = do let self' = chcSelfBinder arg' = fst chcArgBinder @@ -92,8 +155,16 @@ genChoice tem (this',this) temFs TemplateChoice{..} = do where fields = map (\f -> (f, ERecProj (TypeConApp tem []) f (EVar this))) temFs -genTemplate :: MonadEnv m => PackageRef -> ModuleName -> Template -> m () --- TODO: Take precondition into account? +-- | Analyse a template definition and add all choices to the environment. +genTemplate :: MonadEnv m + => PackageRef + -- ^ A reference to the package in which this template is defined. + -> ModuleName + -- ^ The module in which this template is defined. + -> Template + -- ^ The template to be analysed and added. + -> m () +-- TODO: Take preconditions into account? genTemplate pac mod Template{..} = do let name = Qualified pac mod tplTypeCon fields <- recTypConFields tplTypeCon @@ -110,7 +181,14 @@ genTemplate pac mod Template{..} = do (ExprVarName "arg", TStruct []) (TBuiltin BTUnit) (EUpdate $ UPure (TBuiltin BTUnit) (EBuiltin BEUnit)) -genExpr :: MonadEnv m => Phase -> Expr -> m Output +-- | Analyse an expression, and produce an Output storing its (partial) +-- evaluation result and the set of performed updates. +genExpr :: MonadEnv m + => Phase + -- ^ The current generator phase. + -> Expr + -- ^ The expression to be analysed. + -> m Output genExpr ph = \case ETmApp fun arg -> genForTmApp ph fun arg ETyApp expr typ -> genForTyApp ph expr typ @@ -126,7 +204,15 @@ genExpr ph = \case -- TODO: Extend additional cases e -> return $ emptyOut e -genForTmApp :: MonadEnv m => Phase -> Expr -> Expr -> m Output +-- | Analyse a term application expression. +genForTmApp :: MonadEnv m + => Phase + -- ^ The current generator phase. + -> Expr + -- ^ The function expression. + -> Expr + -- ^ The argument expression. + -> m Output genForTmApp ph fun arg = do funOut <- genExpr ph fun arout <- genExpr ph arg @@ -141,7 +227,15 @@ genForTmApp ph fun arg = do fun' -> return $ updateOutExpr (ETmApp fun' (_oExpr arout)) $ combineOut funOut arout -genForTyApp :: MonadEnv m => Phase -> Expr -> Type -> m Output +-- | Analyse a type application expression. +genForTyApp :: MonadEnv m + => Phase + -- ^ The current generator phase. + -> Expr + -- ^ The function expression. + -> Type + -- ^ The argument type. + -> m Output genForTyApp ph expr typ = do exprOut <- genExpr ph expr case _oExpr exprOut of @@ -152,7 +246,15 @@ genForTyApp ph expr typ = do return $ combineOut resOut exprOut expr' -> return $ updateOutExpr (ETyApp expr' typ) exprOut -genForLet :: MonadEnv m => Phase -> Binding -> Expr -> m Output +-- | Analyse a let binding expression. +genForLet :: MonadEnv m + => Phase + -- ^ The current generator phase. + -> Binding + -- ^ The binding to be bound. + -> Expr + -- ^ The expression in which the binding should be available. + -> m Output genForLet ph bind body = do bindOut <- genExpr ph (bindingBound bind) let subst = singleExprSubst (fst $ bindingBinder bind) (_oExpr bindOut) @@ -160,16 +262,38 @@ genForLet ph bind body = do resOut <- genExpr ph resExpr return $ combineOut resOut bindOut -genForVar :: MonadEnv m => Phase -> ExprVarName -> m Output +-- | Analyse an expression variable. +genForVar :: MonadEnv m + => Phase + -- ^ The current generator phase. + -> ExprVarName + -- ^ The expression variable to be analysed. + -> m Output genForVar _ph name = lookupVar name >> return (emptyOut (EVar name)) -genForVal :: MonadEnv m => Phase -> Qualified ExprValName -> m Output +-- | Analyse a value reference. +genForVal :: MonadEnv m + => Phase + -- ^ The current generator phase. + -> Qualified ExprValName + -- ^ The value reference to be analysed. + -> m Output genForVal ValuePhase w = return $ Output (EVal w) (emptyUpdateSet{_usVal = [w]}) genForVal TemplatePhase w = lookupVal w >>= \ (expr, upds) -> return (Output expr upds) -genForRecProj :: MonadEnv m => Phase -> TypeConApp -> FieldName -> Expr -> m Output +-- | Analyse a record projection expression. +genForRecProj :: MonadEnv m + => Phase + -- ^ The current generator phase. + -> TypeConApp + -- ^ The type constructor of the record which is projected. + -> FieldName + -- ^ The field which is projected. + -> Expr + -- ^ The record expression which is projected. + -> m Output genForRecProj ph tc f body = do bodyOut <- genExpr ph body case _oExpr bodyOut of @@ -185,15 +309,36 @@ genForRecProj ph tc f body = do Just expr -> genExpr ph expr Nothing -> throwError $ UnknownRecField f -genForCreate :: MonadEnv m => Phase -> Qualified TypeConName -> Expr -> m Output +-- | Analyse a create update expression. +genForCreate :: MonadEnv m + => Phase + -- ^ The current generator phase. + -> Qualified TypeConName + -- ^ The template of which a new instance is being created. + -> Expr + -- ^ The argument expression. + -> m Output genForCreate ph tem arg = do arout <- genExpr ph arg fs <- recExpFields (_oExpr arout) return (Output (EUpdate (UCreate tem $ _oExpr arout)) emptyUpdateSet{_usCre = [UpdCreate tem fs]}) -- TODO: We could potentially filter here to only store the interesting fields? -genForExercise :: MonadEnv m => Phase -> Qualified TypeConName -> ChoiceName - -> Expr -> Maybe Expr -> Expr -> m Output +-- | Analyse an exercise update expression. +genForExercise :: MonadEnv m + => Phase + -- ^ The current generator phase. + -> Qualified TypeConName + -- ^ The template on which a choice is being exercised. + -> ChoiceName + -- ^ The choice which is being exercised. + -> Expr + -- ^ The contract id on which the choice is being exercised. + -> Maybe Expr + -- ^ The party which exercises the choice. + -> Expr + -- ^ The arguments with which the choice is being exercised. + -> m Output genForExercise ph tem ch cid par arg = do cidOut <- genExpr ph cid arout <- genExpr ph arg @@ -204,8 +349,16 @@ genForExercise ph tem ch cid par arg = do let updSet = updSubst (_oExpr cidOut) (EVar this) (_oExpr arout) return (Output (EUpdate (UExercise tem ch (_oExpr cidOut) par (_oExpr arout))) updSet) +-- | Analyse a bind update expression. -- TODO: Handle arbitrary update outputs, not just simple fetches -genForBind :: MonadEnv m => Phase -> Binding -> Expr -> m Output +genForBind :: MonadEnv m + => Phase + -- ^ The current generator phase. + -> Binding + -- ^ The binding being bound with this update. + -> Expr + -- ^ The expression in which this binding is being made available. + -> m Output genForBind ph bind body = do bindOut <- genExpr ph (bindingBound bind) case _oExpr bindOut of diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 3d138a89b5db..73a1a5d9e669 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -32,7 +32,10 @@ instance Show ConstraintExpr where show (CAdd e1 e2) = show e1 ++ " + " ++ show e2 show (CSub e1 e2) = show e1 ++ " - " ++ show e2 -exp2CExp :: Expr -> ConstraintExpr +-- | Convert a DAML-LF expression to a constraint expression, if possible. +exp2CExp :: Expr + -- ^ The expression to convert. + -> ConstraintExpr exp2CExp (EVar x) = CVar x exp2CExp (ERecProj _ f (EVar x)) = CVar $ recProj2Var x f exp2CExp (ETmApp (ETmApp (ETyApp (EBuiltin b) _) e1) e2) = case b of @@ -41,11 +44,19 @@ exp2CExp (ETmApp (ETmApp (ETyApp (EBuiltin b) _) e1) e2) = case b of _ -> error ("Builtin: " ++ show b) exp2CExp e = error ("Conversion: " ++ show e) -skol2var :: Skolem -> [ExprVarName] +-- | Gather the variable names bound within a skolem variable. +skol2var :: Skolem + -- ^ The skolem variable to handle. + -> [ExprVarName] skol2var (SkolVar x) = [x] skol2var (SkolRec x fs) = map (recProj2Var x) fs -recProj2Var :: ExprVarName -> FieldName -> ExprVarName +-- | Squash a record projection into a single variable name. +recProj2Var :: ExprVarName + -- ^ The variable on which is being projected. + -> FieldName + -- ^ The field name which is being projected. + -> ExprVarName recProj2Var (ExprVarName x) (FieldName f) = ExprVarName (x `T.append` "." `T.append` f) -- | The set of constraints to be solved. @@ -62,7 +73,17 @@ data ConstraintSet = ConstraintSet -- | Constructs a constraint set from the generator environment, together with -- the template name, the choice and field to be verified. -- TODO: Take choices into account? -constructConstr :: Env -> TypeConName -> ChoiceName -> FieldName -> ConstraintSet +-- TODO: The choice and field don't actually need to be in the same template. +-- Take two templates as arguments. +constructConstr :: Env + -- ^ The generator environment to convert. + -> TypeConName + -- ^ The template name to be verified. + -> ChoiceName + -- ^ The choice name to be verified. + -> FieldName + -- ^ The field name to be verified. + -> ConstraintSet constructConstr env tem ch f = case lookupChoInHMap (_envchs env) tem ch of Just (self, this, arg, updSubst) -> @@ -75,7 +96,12 @@ constructConstr env tem ch f = in ConstraintSet vars creVals arcVals Nothing -> error "Choice not found" -cexp2sexp :: [(ExprVarName,S.SExpr)] -> ConstraintExpr -> IO S.SExpr +-- | Convert a constraint expression into an SMT expression from the solving library. +cexp2sexp :: [(ExprVarName,S.SExpr)] + -- ^ The set of variable names, mapped to their corresponding SMT counterparts. + -> ConstraintExpr + -- ^ The constraint expression to convert. + -> IO S.SExpr cexp2sexp vars (CVar x) = case lookup x vars of Just exp -> return exp Nothing -> error ("Impossible: variable not found " ++ show x) @@ -88,13 +114,26 @@ cexp2sexp vars (CSub ce1 ce2) = do se2 <- cexp2sexp vars ce2 return $ S.sub se1 se2 -declareVars :: S.Solver -> [ExprVarName] -> IO [(ExprVarName,S.SExpr)] +-- | Declare a list of variables for the SMT solver. Returns a list of the +-- declared variables, together with their corresponding SMT counterparts. +declareVars :: S.Solver + -- ^ The SMT solver. + -> [ExprVarName] + -- ^ The variables to be declared. + -> IO [(ExprVarName,S.SExpr)] declareVars s xs = zip xs <$> mapM (\x -> S.declare s (var2str x) S.tReal) xs where var2str :: ExprVarName -> String var2str (ExprVarName x) = T.unpack x -solveConstr :: FilePath -> ConstraintSet -> IO () +-- | Solve a give constraint set. Prints 'unsat' when the constraint set is +-- valid. It asserts that the set of created and archived contracts are not +-- equal. +solveConstr :: FilePath + -- ^ The path to the constraint solver. + -> ConstraintSet + -- ^ The constraint set to solve. + -> IO () solveConstr spath ConstraintSet{..} = do log <- S.newLogger 1 sol <- S.newSolver spath ["-in"] (Just log) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs index 7c857f1bc8ef..f9a44fa45237 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs @@ -19,23 +19,43 @@ import DA.Daml.LF.Ast.Type -- | Substitution of expressions for expression variables. type ExprSubst = Map.Map ExprVarName Expr -singleExprSubst :: ExprVarName -> Expr -> ExprSubst +-- | Create an expression substitution from a single variable and expression. +singleExprSubst :: ExprVarName + -- ^ The expression variable to substitute. + -> Expr + -- ^ The expression to substitute with. + -> ExprSubst singleExprSubst = Map.singleton -singleTypeSubst :: TypeVarName -> Type -> Subst +-- | Create a type substitution from a single type variable and type. +singleTypeSubst :: TypeVarName + -- ^ The type variable to substitute. + -> Type + -- ^ The type to substitute with. + -> Subst singleTypeSubst = Map.singleton -createExprSubst :: [(ExprVarName,Expr)] -> ExprSubst +-- | Create an expression substitution from a list of variables and expressions. +createExprSubst :: [(ExprVarName,Expr)] + -- ^ The variables to substitute, together with the expressions to replace them with. + -> ExprSubst createExprSubst = Map.fromList -substDom :: ExprSubst -> [ExprVarName] +-- | Get the domain from an expression substitution. +substDom :: ExprSubst + -- ^ The substitution to analyse. + -> [ExprVarName] substDom = Map.keys -- | Apply an expression substitution to an expression. -- TODO: We assume that for any substitution x |-> e : x notin e -- and a |-> t : a notin t. -- TODO: I can't help but feel there has to be a nicer way to write this function -substituteTmTm :: ExprSubst -> Expr -> Expr +substituteTmTm :: ExprSubst + -- ^ The expression substitution to apply. + -> Expr + -- ^ The expression to apply the substitution to. + -> Expr substituteTmTm s = \case EVar x | Just e <- Map.lookup x s -> e @@ -66,7 +86,11 @@ substituteTmTm s = \case e -> e -- | Apply an expression substitution to an update. -substituteTmUpd :: ExprSubst -> Update -> Update +substituteTmUpd :: ExprSubst + -- ^ The expression substitution to apply. + -> Update + -- ^ The update to apply the substitution to. + -> Update substituteTmUpd s = \case UPure t e -> UPure t $ substituteTmTm s e UBind Binding{..} e -> UBind (Binding bindingBinder $ substituteTmTm s bindingBound) @@ -78,7 +102,11 @@ substituteTmUpd s = \case u -> u -- | Apply a type substitution to an expression. -substituteTyTm :: Subst -> Expr -> Expr +substituteTyTm :: Subst + -- ^ The type substitution to apply. + -> Expr + -- ^ The expression to apply the substitution to. + -> Expr substituteTyTm s = \case ERecCon t fs -> ERecCon (substituteTyTCApp s t) $ map (over _2 (substituteTyTm s)) fs ERecProj t f e -> ERecProj (substituteTyTCApp s t) f $ substituteTyTm s e @@ -107,7 +135,11 @@ substituteTyTm s = \case e -> e -- | Apply a type substitution to an update. -substituteTyUpd :: Subst -> Update -> Update +substituteTyUpd :: Subst + -- ^ The type substitution to apply. + -> Update + -- ^ The update to apply the substitution to. + -> Update substituteTyUpd s = \case UPure t e -> UPure (substitute s t) (substituteTyTm s e) UBind Binding{..} e -> UBind (Binding (over _2 (substitute s) bindingBinder) (substituteTyTm s bindingBound)) @@ -118,8 +150,18 @@ substituteTyUpd s = \case UEmbedExpr t e -> UEmbedExpr (substitute s t) (substituteTyTm s e) u -> u -substituteTyTCApp :: Subst -> TypeConApp -> TypeConApp +-- | Apply a type substitution to an applied type constructor. +substituteTyTCApp :: Subst + -- ^ The type substitution to apply. + -> TypeConApp + -- ^ The applied type constructor to apply the substitution to. + -> TypeConApp substituteTyTCApp s (TypeConApp n ts) = TypeConApp n (map (substitute s) ts) -substituteTyCaseAlt :: Subst -> CaseAlternative -> CaseAlternative +-- | Apply a type substitution to a case alternative. +substituteTyCaseAlt :: Subst + -- ^ The type substitution to apply. + -> CaseAlternative + -- ^ The case alternative to apply the substitution to. + -> CaseAlternative substituteTyCaseAlt s (CaseAlternative p e) = CaseAlternative p (substituteTyTm s e) From 6651d8db2acfcd47ea48fe71162ca7ab40d4012c Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Wed, 29 Apr 2020 11:35:53 +0200 Subject: [PATCH 24/50] Small bugfix --- compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 73a1a5d9e669..879d6ae59d78 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -42,6 +42,7 @@ exp2CExp (ETmApp (ETmApp (ETyApp (EBuiltin b) _) e1) e2) = case b of BEAddNumeric -> CAdd (exp2CExp e1) (exp2CExp e2) BESubNumeric -> CSub (exp2CExp e1) (exp2CExp e2) _ -> error ("Builtin: " ++ show b) +exp2CExp (ELocation _ e) = exp2CExp e exp2CExp e = error ("Conversion: " ++ show e) -- | Gather the variable names bound within a skolem variable. From a8e6c948b6d9fc8e05a067fbb9b478c9d9aeab7c Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Wed, 29 Apr 2020 11:13:45 +0200 Subject: [PATCH 25/50] Conditionals and forward references --- .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 20 +- .../src/DA/Daml/LF/Verify/Context.hs | 670 +++++++++++++----- .../src/DA/Daml/LF/Verify/Generate.hs | 290 ++++---- .../src/DA/Daml/LF/Verify/Solve.hs | 134 +++- .../src/DA/Daml/LF/Verify/Subst.hs | 226 +++--- 5 files changed, 856 insertions(+), 484 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index c5e1fc2b0e4f..e996d85eef39 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -1,6 +1,8 @@ -- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -- SPDX-License-Identifier: Apache-2.0 +{-# LANGUAGE DataKinds #-} + -- | Static verification of DAML packages. module DA.Daml.LF.Verify ( main ) where @@ -14,6 +16,7 @@ import DA.Daml.LF.Verify.Context import DA.Bazel.Runfiles -- TODO: temporarily hardcoded +-- TODO: Allow for choice and field in different templates. templName :: TypeConName templName = TypeConName ["Iou"] @@ -21,24 +24,27 @@ choiceName :: ChoiceName choiceName = ChoiceName "Iou_Merge" fieldName :: FieldName -fieldName = FieldName "amount" +fieldName = FieldName "content" main :: IO () main = do Options{..} <- execParser optionsParserInfo solver <- locateRunfiles "z3_nix/bin/z3" pkgs <- readPackages optInputDars - putStrLn "Start value phase" >> case runEnv (genPackages ValuePhase pkgs) emptyEnv of + putStrLn "Start value gathering" + case runEnv (genPackages pkgs) (emptyEnv :: Env 'ValueGathering) of Left err-> putStrLn "Value phase finished with error: " >> print err Right env1 -> do putStrLn "Start value solving" - let env2 = solveValueUpdatesEnv env1 - putStrLn "Start template phase" >> case runEnv (genPackages TemplatePhase pkgs) env2 of - Left err -> putStrLn "Template phase finished with error: " >> print err + let env2 = solveValueReferences env1 + putStrLn "Start choice gathering" + case runEnv (genPackages pkgs) env2 of + Left err -> putStrLn "Choice phase finished with error: " >> print err Right env3 -> do - putStrLn "Success!" + putStrLn "Start choice solving" + let env4 = solveChoiceReferences env3 putStrLn "Start constraint solving phase" - let cset = constructConstr env3 templName choiceName fieldName + let cset = constructConstr env4 templName choiceName fieldName putStr "Create: " >> print (_cCres cset) putStr "Archive: " >> print (_cArcs cset) solveConstr solver cset diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 3ff983da0dd1..4b622ae9e7e7 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -2,19 +2,26 @@ -- SPDX-License-Identifier: Apache-2.0 {-# LANGUAGE ConstraintKinds #-} +{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveAnyClass #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} {-# LANGUAGE RankNTypes #-} -- | Contexts for DAML LF static verification module DA.Daml.LF.Verify.Context - ( Env(..) + ( Phase(..) + , GenPhase + , BoolExpr(..) + , Cond(..) + , Env(..) , Error(..) , MonadEnv , UpdateSet(..) - , UpdCreate(..) - , UpdArchive(..) + , Upd(..) , UpdChoice(..) , Skolem(..) + , getEnv , runEnv , genRenamedVar , emptyEnv @@ -24,7 +31,10 @@ module DA.Daml.LF.Verify.Context , concatEnv , emptyUpdateSet , concatUpdateSet - , solveValueUpdatesEnv + , addUpd + , conditionalUpdateSet + , solveValueReferences + , solveChoiceReferences , lookupChoInHMap , fieldName2VarName , recTypConFields, recTypFields, recExpFields @@ -34,7 +44,7 @@ import Control.Monad.Error.Class (MonadError (..), throwError) import Control.Monad.State.Lazy import Data.Hashable import GHC.Generics -import Data.Maybe (listToMaybe, isJust) +import Data.Maybe (listToMaybe, isJust, fromMaybe) import Data.List (find) import Data.Bifunctor import qualified Data.HashMap.Strict as HM @@ -43,22 +53,88 @@ import qualified Data.Text as T import DA.Daml.LF.Ast hiding (lookupChoice) import DA.Daml.LF.Verify.Subst --- | Data type denoting a create update. -data UpdCreate = UpdCreate - { _creTemp :: !(Qualified TypeConName) - -- ^ Qualified type constructor corresponding to the contract template. - , _creField :: ![(FieldName, Expr)] - -- ^ The fields to be verified, together with their value. - } +-- TODO: Move these data types to a seperate file? +-- | Data type denoting the phase of the constraint generator. +data Phase + = ValueGathering + -- ^ The value phase gathers all value and data type definitions across modules. + | ChoiceGathering + -- ^ The choice phase gathers the updates performed in choice definitions. + | Solving + -- ^ During the solving phase, all definitions have been loaded and updates + -- have been inlined. + +-- | Data type denoting a boolean condition expression. This data type was +-- introduced to avoid having to use imported daml-if prelude functions. +data BoolExpr + = BExpr Expr + -- ^ A daml-lf expression. + | BAnd BoolExpr BoolExpr + -- ^ And operator. + | BNot BoolExpr + -- ^ Not operator. deriving Show --- | Data type denoting an archive update. -data UpdArchive = UpdArchive - { _arcTemp :: !(Qualified TypeConName) - -- ^ Qualified type constructor corresponding to the contract template. - , _arcField :: ![(FieldName, Expr)] - -- ^ The fields to be verified, together with their value. - } + +-- | Data type denoting a potentially conditional value. +data Cond a + = Determined a + -- ^ Non-conditional value. + | Conditional BoolExpr a (Maybe a) + -- ^ Conditional value, with a (Boolean) condition, a value in case the + -- condition holds, and possibly a value in case it doesn't. + deriving Show + +instance Functor Cond where + fmap f (Determined x) = Determined (f x) + fmap f (Conditional e x y) = Conditional e (f x) (f <$> y) + +-- | Class covering the types which store conditionals inside. +class Conditional a where + -- | Shift the conditional inside the data type. + introCond :: Cond a -> a + +instance Conditional (UpdateSet ph) where + introCond (Determined upds) = upds + introCond (Conditional e updx updy) = case updx of + UpdateSetVG{} -> UpdateSetVG + (concatCond $ Conditional e (_usvgUpdate updx) (_usvgUpdate <$> updy)) + (concatCond $ Conditional e (_usvgChoice updx) (_usvgChoice <$> updy)) + (concatCond $ Conditional e (_usvgValue updx) (_usvgValue <$> updy)) + UpdateSetCG{} -> UpdateSetCG + (concatCond $ Conditional e (_uscgUpdate updx) (_uscgUpdate <$> updy)) + (concatCond $ Conditional e (_uscgChoice updx) (_uscgChoice <$> updy)) + UpdateSetS{} -> UpdateSetS + (concatCond $ Conditional e (_ussUpdate updx) (_ussUpdate <$> updy)) + +-- | Flatten nested conditionals into a single level. +concatCond :: Cond [Cond a] -> [Cond a] +concatCond (Determined xs) = xs +concatCond (Conditional e xs mys) = case mys of + Just ys -> map (ext_cond e) xs ++ map (ext_cond (BNot e)) ys + Nothing -> map (ext_cond e) xs + where + ext_cond :: BoolExpr -> Cond b -> Cond b + ext_cond e (Determined x) = Conditional e x Nothing + ext_cond e1 (Conditional e2 x y) = Conditional (BAnd e1 e2) x y + +-- | Data type denoting an update. +data Upd + = UpdCreate + -- ^ Data type denoting a create update. + { _creTemp :: !(Qualified TypeConName) + -- ^ Qualified type constructor corresponding to the contract template. + , _creField :: ![(FieldName, Expr)] + -- ^ The fields to be verified, together with their value. + } + | UpdArchive + -- ^ Data type denoting an archive update. + { _arcTemp :: !(Qualified TypeConName) + -- ^ Qualified type constructor corresponding to the contract template. + , _arcField :: ![(FieldName, Expr)] + -- ^ The fields to be verified, together with their value. + } deriving Show + -- | Data type denoting an exercised choice update. data UpdChoice = UpdChoice { _choTemp :: !(Qualified TypeConName) @@ -66,40 +142,84 @@ data UpdChoice = UpdChoice , _choName :: !ChoiceName -- ^ The name of the choice. } - deriving Show - --- | The List of updates being performed -data UpdateSet = UpdateSet - { _usCre :: ![UpdCreate] - -- ^ The list of create updates. - , _usArc :: ![UpdArchive] - -- ^ The list of archive updates. - , _usCho :: ![UpdChoice] - -- ^ The list of choice updates. - , _usVal :: ![Qualified ExprValName] - -- ^ The list of referenced values. These will be replaced by their - -- respective updates after solving. - -- Note that this should be empty after the `ValuePhase`. - } - deriving Show - --- | Create an empty update set. -emptyUpdateSet :: UpdateSet -emptyUpdateSet = UpdateSet [] [] [] [] + deriving (Eq, Generic, Hashable, Show) + +-- | The collection of updates being performed. +data UpdateSet (ph :: Phase) where + UpdateSetVG :: + { _usvgUpdate :: ![Cond Upd] + -- ^ The list of updates. + , _usvgChoice :: ![Cond UpdChoice] + -- ^ The list of exercised choices. + , _usvgValue :: ![Cond (Qualified ExprValName)] + -- ^ The list of referenced values. + } -> UpdateSet 'ValueGathering + UpdateSetCG :: + { _uscgUpdate :: ![Cond Upd] + -- ^ The list of updates. + , _uscgChoice :: ![Cond UpdChoice] + -- ^ The list of exercised choices. + } -> UpdateSet 'ChoiceGathering + UpdateSetS :: + { _ussUpdate :: ![Cond Upd] + -- ^ The list of updates. + } -> UpdateSet 'Solving + +class GenPhase ph where + emptyUpdateSet :: UpdateSet ph + emptyEnv :: Env ph + +instance GenPhase 'ValueGathering where + emptyUpdateSet = UpdateSetVG [] [] [] + emptyEnv = EnvVG [] HM.empty HM.empty HM.empty + +instance GenPhase 'ChoiceGathering where + emptyUpdateSet = UpdateSetCG [] [] + emptyEnv = EnvCG [] HM.empty HM.empty HM.empty HM.empty + +instance GenPhase 'Solving where + emptyUpdateSet = UpdateSetS [] + emptyEnv = EnvS [] HM.empty HM.empty HM.empty HM.empty -- | Combine two update sets. -concatUpdateSet :: UpdateSet +concatUpdateSet :: UpdateSet ph -- ^ The first update set to be combined. - -> UpdateSet + -> UpdateSet ph -- ^ The second update set to be combined. - -> UpdateSet -concatUpdateSet (UpdateSet cres1 arcs1 chos1 vals1) (UpdateSet cres2 arcs2 chos2 vals2) = - UpdateSet (cres1 ++ cres2) (arcs1 ++ arcs2) (chos1 ++ chos2) (vals1 ++ vals2) + -> UpdateSet ph +concatUpdateSet (UpdateSetVG upd1 cho1 val1) (UpdateSetVG upd2 cho2 val2) = + UpdateSetVG (upd1 ++ upd2) (cho1 ++ cho2) (val1 ++ val2) +concatUpdateSet (UpdateSetCG upd1 cho1) (UpdateSetCG upd2 cho2) = + UpdateSetCG (upd1 ++ upd2) (cho1 ++ cho2) +concatUpdateSet (UpdateSetS upd1) (UpdateSetS upd2) = + UpdateSetS (upd1 ++ upd2) + +-- | Add a single Upd to an UpdateSet +addUpd :: UpdateSet ph + -- ^ The update set to extend. + -> Upd + -- ^ The update to add. + -> UpdateSet ph +addUpd upds@UpdateSetVG{..} upd = upds{_usvgUpdate = Determined upd : _usvgUpdate} +addUpd upds@UpdateSetCG{..} upd = upds{_uscgUpdate = Determined upd : _uscgUpdate} +addUpd upds@UpdateSetS{..} upd = upds{_ussUpdate = Determined upd : _ussUpdate} + +-- | Make an update set conditional. A second update set can also be introduced +-- for the case where the condition does not hold. +conditionalUpdateSet :: Expr + -- ^ The condition on which to combine the two update sets. + -> UpdateSet ph + -- ^ The update set in case the condition holds. + -> Maybe (UpdateSet ph) + -- ^ Possibly a second update set. + -> UpdateSet ph +conditionalUpdateSet exp upd1 upd2 = + introCond (Conditional (BExpr exp) upd1 upd2) -- | Refresh a given expression variable by producing a fresh renamed variable. -- TODO: when a renamed var gets renamed again, it might overlap again. --- We should have an additional field in VarName to denote it's number. -genRenamedVar :: MonadEnv m +-- We should have an additional field in VarName to denote its number. +genRenamedVar :: MonadEnv m ph => ExprVarName -- ^ The variable to be renamed. -> m ExprVarName @@ -123,7 +243,7 @@ data Cid deriving (Generic, Hashable, Eq, Show) -- | Convert an expression to a contract id, if possible. -expr2cid :: MonadEnv m +expr2cid :: MonadEnv m ph => Expr -- ^ The expression to be converted. -> m Cid @@ -133,33 +253,59 @@ expr2cid _ = throwError ExpectCid -- TODO: Could we alternatively just declare the variables that occur in the updates and drop the skolems? -- | The environment for the DAML-LF verifier -data Env = Env - { _envskol :: ![Skolem] - -- ^ The skolemised term variables and fields. - , _envvals :: !(HM.HashMap (Qualified ExprValName) (Expr, UpdateSet)) - -- ^ The bound values. - , _envchs :: !(HM.HashMap (Qualified TypeConName, ChoiceName) - (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet)) - -- ^ The set of relevant choices, mapping to functions from self, this and args to its updates. - , _envdats :: !(HM.HashMap TypeConName DefDataType) - -- ^ The set of data constructors. - , _envcids :: !(HM.HashMap Cid ExprVarName) - -- ^ The set of fetched cid's mapped to their variable name. - } - --- | Construct an empty environment. -emptyEnv :: Env -emptyEnv = Env [] HM.empty HM.empty HM.empty HM.empty +data Env (ph :: Phase) where + EnvVG :: + { _envvgskol :: ![Skolem] + -- ^ The skolemised term variables and fields. + , _envvgvals :: !(HM.HashMap (Qualified ExprValName) (Expr, UpdateSet 'ValueGathering)) + -- ^ The bound values. + , _envvgdats :: !(HM.HashMap TypeConName DefDataType) + -- ^ The set of data constructors. + , _envvgcids :: !(HM.HashMap Cid ExprVarName) + -- ^ The set of fetched cid's mapped to their variable name. + } -> Env 'ValueGathering + EnvCG :: + { _envcgskol :: ![Skolem] + -- ^ The skolemised term variables and fields. + , _envcgvals :: !(HM.HashMap (Qualified ExprValName) (Expr, UpdateSet 'ChoiceGathering)) + -- ^ The bound values. + , _envcgdats :: !(HM.HashMap TypeConName DefDataType) + -- ^ The set of data constructors. + , _envcgcids :: !(HM.HashMap Cid ExprVarName) + -- ^ The set of fetched cid's mapped to their variable name. + , _envcgchs :: !(HM.HashMap UpdChoice + (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering)) + -- ^ The set of relevant choices, mapping to functions from self, this and args to its updates. + } -> Env 'ChoiceGathering + EnvS :: + { _envsskol :: ![Skolem] + -- ^ The skolemised term variables and fields. + , _envsvals :: !(HM.HashMap (Qualified ExprValName) (Expr, UpdateSet 'Solving)) + -- ^ The bound values. + , _envsdats :: !(HM.HashMap TypeConName DefDataType) + -- ^ The set of data constructors. + , _envscids :: !(HM.HashMap Cid ExprVarName) + -- ^ The set of fetched cid's mapped to their variable name. + , _envschs :: !(HM.HashMap UpdChoice + (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'Solving)) + -- ^ The set of relevant choices, mapping to functions from self, this and args to its updates. + } -> Env 'Solving -- | Combine two environments. -concatEnv :: Env +concatEnv :: Env ph -- ^ The first environment to be combined. - -> Env + -> Env ph -- ^ The second environment to be combined. - -> Env -concatEnv (Env vars1 vals1 chs1 dats1 cids1) (Env vars2 vals2 chs2 dats2 cids2) = - Env (vars1 ++ vars2) (vals1 `HM.union` vals2) (chs1 `HM.union` chs2) - (dats1 `HM.union` dats2) (cids1 `HM.union` cids2) + -> Env ph +concatEnv (EnvVG vars1 vals1 dats1 cids1) (EnvVG vars2 vals2 dats2 cids2) = + EnvVG (vars1 ++ vars2) (vals1 `HM.union` vals2) (dats1 `HM.union` dats2) + (cids1 `HM.union` cids2) +concatEnv (EnvCG vars1 vals1 dats1 cids1 chos1) (EnvCG vars2 vals2 dats2 cids2 chos2) = + EnvCG (vars1 ++ vars2) (vals1 `HM.union` vals2) (dats1 `HM.union` dats2) + (cids1 `HM.union` cids2) (chos1 `HM.union` chos2) +concatEnv (EnvS vars1 vals1 dats1 cids1 chos1) (EnvS vars2 vals2 dats2 cids2 chos2) = + EnvS (vars1 ++ vars2) (vals1 `HM.union` vals2) (dats1 `HM.union` dats2) + (cids1 `HM.union` cids2) (chos1 `HM.union` chos2) -- TODO: union makes me slightly nervous, as it allows overlapping keys -- (and just uses the first). `unionWith concatUpdateSet` would indeed be better, -- but this still makes me nervous as the expr and exprvarnames wouldn't be merged. @@ -170,68 +316,75 @@ fieldName2VarName = ExprVarName . unFieldName -- | Type class constraint with the required monadic effects for functions -- manipulating the verification environment. -type MonadEnv m = (MonadError Error m, MonadState (Int,Env) m) +type MonadEnv m ph = (MonadError Error m, MonadState (Int,Env ph) m) -- | Fetch the current environment. -getEnv :: MonadEnv m => m Env +getEnv :: MonadEnv m ph => m (Env ph) getEnv = snd <$> get -- | Set the current environment. -putEnv :: MonadEnv m => Env -> m () +putEnv :: MonadEnv m ph => Env ph -> m () putEnv env = get >>= \(uni,_) -> put (uni,env) -- | Generate a new unique name. -fresh :: MonadEnv m => m String +fresh :: MonadEnv m ph => m String fresh = do (cur,env) <- get put (cur + 1,env) return $ show cur -- | Evaluate the MonadEnv to produce an error message or the final environment. -runEnv :: StateT (Int,Env) (Either Error) () +runEnv :: StateT (Int, Env ph) (Either Error) () -- ^ The monadic computation to be evaluated. - -> Env + -> Env ph -- ^ The initial environment to start from. - -> Either Error Env + -> Either Error (Env ph) runEnv comp env0 = do (_res, (_uni,env1)) <- runStateT comp (0,env0) return env1 -- | Skolemise an expression variable and extend the environment. -extVarEnv :: MonadEnv m +extVarEnv :: MonadEnv m ph => ExprVarName -- ^ The expression variable to be skolemised. -> m () -extVarEnv x = do - env@Env{..} <- getEnv - putEnv env{_envskol = SkolVar x : _envskol} +extVarEnv x = extSkolEnv (SkolVar x) -- | Skolemise a list of record projection and extend the environment. -extRecEnv :: MonadEnv m +extRecEnv :: MonadEnv m ph => ExprVarName -- ^ The variable on which is being projected. -> [FieldName] -- ^ The fields which should be skolemised. -> m () -extRecEnv x fs = do - env@Env{..} <- getEnv - putEnv env{_envskol = SkolRec x fs : _envskol} +extRecEnv x fs = extSkolEnv (SkolRec x fs) + +-- | Extend the environment with a new skolem variable. +extSkolEnv :: MonadEnv m ph + => Skolem + -- ^ The skolem variable to add. + -> m () +extSkolEnv skol = getEnv >>= \case + env@EnvVG{..} -> putEnv env{_envvgskol = skol : _envvgskol} + env@EnvCG{..} -> putEnv env{_envcgskol = skol : _envcgskol} + env@EnvS{..} -> putEnv env{_envsskol = skol : _envsskol} -- | Extend the environment with a new value definition. -extValEnv :: MonadEnv m +extValEnv :: MonadEnv m ph => Qualified ExprValName -- ^ The name of the value being defined. -> Expr -- ^ The (partially) evaluated value definition. - -> UpdateSet + -> UpdateSet ph -- ^ The updates performed by this value. -> m () -extValEnv val expr upd = do - env@Env{..} <- getEnv - putEnv env{_envvals = HM.insert val (expr, upd) _envvals} +extValEnv val expr upd = getEnv >>= \case + env@EnvVG{..} -> putEnv env{_envvgvals = HM.insert val (expr, upd) _envvgvals} + env@EnvCG{..} -> putEnv env{_envcgvals = HM.insert val (expr, upd) _envcgvals} + env@EnvS{..} -> putEnv env{_envsvals = HM.insert val (expr, upd) _envsvals} -- | Extends the environment with a new choice. -extChEnv :: MonadEnv m +extChEnv :: MonadEnv m ph => Qualified TypeConName -- ^ The type of the template on which this choice is defined. -> ChoiceName @@ -242,26 +395,29 @@ extChEnv :: MonadEnv m -- ^ Variable to bind the contract on which this choice is exercised on to. -> ExprVarName -- ^ Variable to bind the choice argument to. - -> UpdateSet + -> UpdateSet ph -- ^ The updates performed by the new choice. -> m () -extChEnv tc ch self this arg upd = do - env@Env{..} <- getEnv - let substUpd sExp tExp aExp = substituteTmUpd (createExprSubst [(self,sExp),(this,tExp),(arg,aExp)]) upd - putEnv env{_envchs = HM.insert (tc, ch) (self,this,arg,substUpd) _envchs} +extChEnv tc ch self this arg upd = + let substUpd sExp tExp aExp = substituteTm (createExprSubst [(self,sExp),(this,tExp),(arg,aExp)]) upd + in getEnv >>= \case + EnvVG{} -> error "Impossible: extChEnv is not used in the value gathering phase" + env@EnvCG{..} -> putEnv env{_envcgchs = HM.insert (UpdChoice tc ch) (self,this,arg,substUpd) _envcgchs} + env@EnvS{..} -> putEnv env{_envschs = HM.insert (UpdChoice tc ch) (self,this,arg,substUpd) _envschs} -- | Extend the environment with a list of new data type definitions. -extDatsEnv :: MonadEnv m +extDatsEnv :: MonadEnv m ph => HM.HashMap TypeConName DefDataType -- ^ A hashmap of the data constructor names, with their corresponding definitions. -> m () -extDatsEnv hmap = do - env@Env{..} <- getEnv - putEnv env{_envdats = hmap `HM.union` _envdats} +extDatsEnv hmap = getEnv >>= \case + env@EnvVG{..} -> putEnv env{_envvgdats = hmap `HM.union` _envvgdats} + env@EnvCG{..} -> putEnv env{_envcgdats = hmap `HM.union` _envcgdats} + env@EnvS{..} -> putEnv env{_envsdats = hmap `HM.union` _envsdats} -- | Extend the environment with a new contract id, and the variable to which -- the fetched contract is bound. -extCidEnv :: MonadEnv m +extCidEnv :: MonadEnv m ph => Expr -- ^ The contract id expression. -> ExprVarName @@ -269,19 +425,21 @@ extCidEnv :: MonadEnv m -> m () extCidEnv exp var = do cid <- expr2cid exp - env@Env{..} <- getEnv - putEnv env{_envcids = HM.insert cid var _envcids} + getEnv >>= \case + env@EnvVG{..} -> putEnv env{_envvgcids = HM.insert cid var _envvgcids} + env@EnvCG{..} -> putEnv env{_envcgcids = HM.insert cid var _envcgcids} + env@EnvS{..} -> putEnv env{_envscids = HM.insert cid var _envscids} -- TODO: Is one layer of recursion enough? -- | Recursively skolemise the given record fields, when they have a record -- type. Note that this only works 1 level deep. -extRecEnvLvl1 :: MonadEnv m +extRecEnvLvl1 :: MonadEnv m ph => [(FieldName, Type)] -- ^ The record fields to skolemise, together with their types. -> m () extRecEnvLvl1 = mapM_ step where - step :: MonadEnv m => (FieldName, Type) -> m () + step :: MonadEnv m ph => (FieldName, Type) -> m () step (f,typ) = do { fsRec <- recTypFields typ ; extRecEnv (fieldName2VarName f) fsRec @@ -291,87 +449,103 @@ extRecEnvLvl1 = mapM_ step -- | Lookup an expression variable in the environment. Succeeds if this variable -- has been skolemised, or throws an error if it hasn't. -lookupVar :: MonadEnv m +lookupVar :: MonadEnv m ph => ExprVarName -- ^ The expression variable to look up. - -> m () --- TODO: It might be nicer to return a bool here as well? -lookupVar x = getEnv >>= \ env -> unless (elem (SkolVar x) $ _envskol env) - (throwError $ UnboundVar x) + -> m Bool +lookupVar x = getEnv >>= \case + EnvVG{..} -> return $ elem (SkolVar x) _envvgskol + EnvCG{..} -> return $ elem (SkolVar x) _envcgskol + EnvS{..} -> return $ elem (SkolVar x) _envsskol -- | Lookup a record project in the environment. Returns a boolean denoting -- whether or not the record projection has been skolemised. -lookupRec :: MonadEnv m +lookupRec :: MonadEnv m ph => ExprVarName -- ^ The expression variable on which is being projected. -> FieldName -- ^ The field name which is being projected. -> m Bool lookupRec x f = do - env <- getEnv - let fields = [ fs | SkolRec y fs <- _envskol env , x == y ] + skols <- getEnv >>= \case + EnvVG{..} -> return _envvgskol + EnvCG{..} -> return _envcgskol + EnvS{..} -> return _envsskol + let fields = [ fs | SkolRec y fs <- skols, x == y ] if not (null fields) then return (elem f $ head fields) else return False -- | Lookup a value name in the environment. Returns its (partially) evaluated -- definition, together with the updates it performs. -lookupVal :: MonadEnv m +lookupVal :: MonadEnv m ph => Qualified ExprValName -- ^ The value name to lookup. - -> m (Expr, UpdateSet) + -> m (Expr, UpdateSet ph) lookupVal val = do - env <- getEnv - case lookupValInHMap (_envvals env) val of + vals <- getEnv >>= \case + EnvVG{..} -> return _envvgvals + EnvCG{..} -> return _envcgvals + EnvS{..} -> return _envsvals + case lookupValInHMap vals val of Just res -> return res Nothing -> throwError (UnknownValue val) -- | Lookup a choice name in the environment. Returns a function which, once -- self, this and args have been instantiated, returns the set of updates it -- performs. -lookupChoice :: MonadEnv m +lookupChoice :: MonadEnv m ph => Qualified TypeConName -- ^ The template name in which this choice is defined. -> ChoiceName -- ^ The choice name to lookup. - -> m (Expr -> Expr -> Expr -> UpdateSet) + -> m (Expr -> Expr -> Expr -> UpdateSet ph) lookupChoice tem ch = do - env <- getEnv - case lookupChoInHMap (_envchs env) (qualObject tem) ch of + chs <- getEnv >>= \case + EnvVG{..} -> return HM.empty + EnvCG{..} -> return _envcgchs + EnvS{..} -> return _envschs + case lookupChoInHMap chs (qualObject tem) ch of Nothing -> throwError (UnknownChoice ch) Just (_,_,_,upd) -> return upd -- | Lookup a data type definition in the environment. -lookupDataCon :: MonadEnv m +lookupDataCon :: MonadEnv m ph => TypeConName -- ^ The data constructor to lookup. -> m DefDataType lookupDataCon tc = do - env <- getEnv - case HM.lookup tc (_envdats env) of + dats <- getEnv >>= \case + EnvVG{..} -> return _envvgdats + EnvCG{..} -> return _envcgdats + EnvS{..} -> return _envsdats + case HM.lookup tc dats of Nothing -> throwError (UnknownDataCons tc) Just def -> return def -- | Lookup a contract id in the environment. Returns the variable its fetched -- contract is bound to. -lookupCid :: MonadEnv m +lookupCid :: MonadEnv m ph => Expr -- ^ The contract id to lookup. -> m ExprVarName lookupCid exp = do - env <- getEnv cid <- expr2cid exp - case HM.lookup cid (_envcids env) of + cids <- getEnv >>= \case + EnvVG{..} -> return _envvgcids + EnvCG{..} -> return _envcgcids + EnvS{..} -> return _envscids + case HM.lookup cid cids of Nothing -> throwError $ UnknownCid cid Just var -> return var -- TODO: There seems to be something wrong with the PackageRef in Qualified. -- | Helper function to lookup a value definition in a HashMap. -lookupValInHMap :: HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) +lookupValInHMap :: HM.HashMap (Qualified ExprValName) (Expr, UpdateSet ph) -- ^ The HashMap in which to look. -> Qualified ExprValName -- ^ The value name to lookup. - -> Maybe (Expr, UpdateSet) + -> Maybe (Expr, UpdateSet ph) lookupValInHMap hmap val = listToMaybe $ HM.elems $ HM.filterWithKey (\name _ -> qualObject name == qualObject val && qualModule name == qualModule val) hmap @@ -379,56 +553,164 @@ lookupValInHMap hmap val = listToMaybe $ HM.elems -- | Helper function to lookup a choice in a HashMap. Returns the variables for -- self, this and args used, as well as a function which, given the values for -- self, this and args, produces the list of updates performed by this choice. -lookupChoInHMap :: HM.HashMap (Qualified TypeConName, ChoiceName) - (ExprVarName, ExprVarName, ExprVarName, Expr -> Expr -> Expr -> UpdateSet) +lookupChoInHMap :: HM.HashMap UpdChoice + (ExprVarName, ExprVarName, ExprVarName, Expr -> Expr -> Expr -> UpdateSet ph) -- ^ The HashMap in which to look. -> TypeConName -- ^ The template in which the choice is defined. -> ChoiceName -- ^ The choice name to lookup. - -> Maybe (ExprVarName, ExprVarName, ExprVarName, Expr -> Expr -> Expr -> UpdateSet) + -> Maybe (ExprVarName, ExprVarName, ExprVarName, Expr -> Expr -> Expr -> UpdateSet ph) -- TODO: This TypeConName should be qualified -- TODO: The type con name really should be taken into account here lookupChoInHMap hmap _tem cho = listToMaybe $ HM.elems - $ HM.filterWithKey (\(_t, c) _ -> c == cho) hmap + $ HM.filterWithKey (\upd _ -> _choName upd == cho) hmap -- | Solves the value references by computing the closure of all referenced -- values, for each value in the environment. --- It thus empties `_usVal` by collecting all updates made by this closure. --- TODO: There are undoubtedly more efficient algorithms for computing this. -solveValueUpdatesEnv :: Env -> Env -solveValueUpdatesEnv env = - let hmap0 = _envvals env - hmap1 = foldl solveValueUpdate hmap0 (HM.keys hmap0) - in env{_envvals = hmap1} - --- | Compute the value reference closure for a single value. -solveValueUpdate :: HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) - -- ^ The HashMap containing the updates for each value. - -> Qualified ExprValName - -- ^ The current value to solve. - -> HM.HashMap (Qualified ExprValName) (Expr, UpdateSet) -solveValueUpdate hmap0 val0 = - let (hmap1, _, _) = step (hmap0, emptyUpdateSet, []) val0 - in hmap1 +-- It thus empties `_usValue` by collecting all updates made by this closure. +solveValueReferences :: Env 'ValueGathering -> Env 'ChoiceGathering +solveValueReferences EnvVG{..} = + let valhmap = foldl (\hmap ref -> snd $ solveReference lookup_ref get_refs ext_upds intro_cond [] hmap ref) _envvgvals (HM.keys _envvgvals) + in EnvCG _envvgskol (convertHMap valhmap) _envvgdats _envvgcids HM.empty where - step :: (HM.HashMap (Qualified ExprValName) (Expr, UpdateSet), UpdateSet, [Qualified ExprValName]) - -> Qualified ExprValName - -> (HM.HashMap (Qualified ExprValName) (Expr, UpdateSet), UpdateSet, [Qualified ExprValName]) - step inp@(hmap, baseupd, vis) val = - if val `elem` vis - -- TODO: Mutual recursion! For now, just ignore... - then inp - else case lookupValInHMap hmap val of - Nothing -> error ("Impossible! Undefined value: " ++ (show $ unExprValName $ qualObject val)) - Just (expr, valupd) -> - let (nhmap, nvalupd, _) = foldl step (hmap, valupd{_usVal = []}, val:vis) (_usVal valupd) - in (HM.insert val (expr, nvalupd) nhmap, concatUpdateSet baseupd nvalupd, val:vis) + lookup_ref :: Qualified ExprValName + -> HM.HashMap (Qualified ExprValName) (Expr, UpdateSet 'ValueGathering) + -> (Expr, UpdateSet 'ValueGathering) + lookup_ref ref hmap = fromMaybe (error "Impossible: Undefined value ref while solving") + (lookupValInHMap hmap ref) + + get_refs :: (Expr, UpdateSet 'ValueGathering) + -> ([Cond (Qualified ExprValName)], (Expr, UpdateSet 'ValueGathering)) + get_refs (e, upds@UpdateSetVG{..}) = (_usvgValue, (e, upds{_usvgValue = []})) + + ext_upds :: (Expr, UpdateSet 'ValueGathering) -> (Expr, UpdateSet 'ValueGathering) + -> (Expr, UpdateSet 'ValueGathering) + ext_upds (e, upds1) (_, upds2) = (e, concatUpdateSet upds1 upds2) + + intro_cond :: Cond (Expr, UpdateSet 'ValueGathering) + -> (Expr, UpdateSet 'ValueGathering) + -- Note that the expression is not important here, as it will be ignored in + -- `ext_upds` later on. + intro_cond (Determined x) = x + intro_cond (Conditional cond (e,updx) y) = (e, introCond (Conditional cond updx (snd <$> y))) + + convertHMap :: HM.HashMap (Qualified ExprValName) (Expr, UpdateSet 'ValueGathering) + -> HM.HashMap (Qualified ExprValName) (Expr, UpdateSet 'ChoiceGathering) + convertHMap = HM.map (second updateSetVG2CG) + + updateSetVG2CG :: UpdateSet 'ValueGathering -> UpdateSet 'ChoiceGathering + updateSetVG2CG UpdateSetVG{..} = if null _usvgValue + then UpdateSetCG _usvgUpdate _usvgChoice + else error "Impossible: There should be no references remaining after value solving" + +-- | Solves the choice references by computing the closure of all referenced +-- choices, for each choice in the environment. +-- It thus empties `_usChoice` by collecting all updates made by this closure. +solveChoiceReferences :: Env 'ChoiceGathering -> Env 'Solving +solveChoiceReferences EnvCG{..} = + let chhmap = foldl (\hmap ref -> snd $ solveReference lookup_ref get_refs ext_upds intro_cond [] hmap ref) _envcgchs (HM.keys _envcgchs) + chshmap = convertChHMap chhmap + valhmap = HM.map (inlineChoices chshmap) _envcgvals + in EnvS _envcgskol valhmap _envcgdats _envcgcids chshmap + where + lookup_ref :: UpdChoice + -> HM.HashMap UpdChoice (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering) + -> (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering) + lookup_ref UpdChoice{..} hmap = fromMaybe (error "Impossible: Undefined choice ref while solving") + (lookupChoInHMap hmap (qualObject _choTemp) _choName) + + get_refs :: (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering) + -> ([Cond UpdChoice], (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering)) + -- TODO: This is gonna result in a ton of substitutions + get_refs (self,this,args,updfunc0) = + -- TODO: This seems to be a rather common pattern. Abstract to reduce duplication. + let chos = _uscgChoice $ updfunc0 (EVar self) (EVar this) (EVar args) + updfunc1 (selfexp :: Expr) (thisexp :: Expr) (argsexp :: Expr) = + let upds@UpdateSetCG{..} = updfunc0 selfexp thisexp argsexp + in upds{_uscgChoice = []} + in (chos, (self,this,args,updfunc1)) + + ext_upds :: (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering) + -> (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering) + -> (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering) + ext_upds (self,this,args,updfunc1) (_,_,_,updfunc2) = + let updfunc3 (selfexp :: Expr) (thisexp :: Expr) (argsexp :: Expr) = + updfunc1 selfexp thisexp argsexp `concatUpdateSet` updfunc2 selfexp thisexp argsexp + in (self,this,args,updfunc3) + + intro_cond :: Cond (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet ph) + -> (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet ph) + intro_cond (Determined x) = x + intro_cond (Conditional cond (self,this,args,updfunc1) y) = + let updfunc3 (selfexp :: Expr) (thisexp :: Expr) (argsexp :: Expr) = + introCond (Conditional cond (updfunc1 selfexp thisexp argsexp) + ((\(_,_,_,updfunc2) -> updfunc2 selfexp thisexp argsexp) <$> y)) + in (self,this,args,updfunc3) + + inlineChoices :: HM.HashMap UpdChoice (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'Solving) + -> (Expr, UpdateSet 'ChoiceGathering) + -> (Expr, UpdateSet 'Solving) + inlineChoices chshmap (exp, UpdateSetCG{..}) = + let lookupRes = map + (intro_cond . fmap (\ch -> fromMaybe (error "Impossible: missing choice while solving") (HM.lookup ch chshmap))) + _uscgChoice + chupds = concatMap (\(self,this,args,upds) -> _ussUpdate $ upds (EVar self) (EVar this) (EVar args)) lookupRes + in (exp, UpdateSetS (_uscgUpdate ++ chupds)) + + convertChHMap :: HM.HashMap UpdChoice (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering) + -> HM.HashMap UpdChoice (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'Solving) + convertChHMap = HM.map (\(self,this,args,updfunc) -> + (self,this,args, \(selfExp :: Expr) (thisExp :: Expr) (argsExp :: Expr) -> + updateSetCG2S $ updfunc selfExp thisExp argsExp)) + + updateSetCG2S :: UpdateSet 'ChoiceGathering -> UpdateSet 'Solving + updateSetCG2S UpdateSetCG{..} = if null _uscgChoice + then UpdateSetS _uscgUpdate + else error "Impossible: There should be no references remaining after choice solving" + +-- | Solves a single reference by recursively inlining the references into updates. +solveReference :: forall updset ref. (Eq ref, Hashable ref) + => (ref -> HM.HashMap ref updset -> updset) + -- ^ Function for looking up references in the update set. + -> (updset -> ([Cond ref], updset)) + -- ^ Function popping the references from the update set. + -> (updset -> updset -> updset) + -- ^ Function for concatinating update sets. + -> (Cond updset -> updset) + -- ^ Function for moving conditionals inside the update set. + -> [ref] + -- ^ The references which have already been visited. + -> HM.HashMap ref updset + -- ^ The hashmap mapping references to update sets. + -> ref + -- ^ The reference to be solved. + -> (updset, HM.HashMap ref updset) +solveReference lookup getRefs extUpds introCond vis hmap0 ref0 = + let upd0 = lookup ref0 hmap0 + (refs, upd1) = getRefs upd0 + in if ref0 `elem` vis + -- TODO: Recursion! + then (upd1, hmap0) -- TODO: At least remove the references? + else let (upd2, hmap1) = foldl handle_ref (upd1, hmap0) refs + in (upd1, HM.insert ref0 upd2 hmap1) + where + handle_ref :: (updset, HM.HashMap ref updset) -> Cond ref + -> (updset, HM.HashMap ref updset) + handle_ref (upd_i0, hmap_i0) (Determined ref_i) = + let (upd_i1, hmap_i1) = solveReference lookup getRefs extUpds introCond (ref0:vis) hmap_i0 ref_i + in (extUpds upd_i0 upd_i1, hmap_i1) + handle_ref (upd_i0, hmap_i0) (Conditional cond ref_ia ref_ib) = + let (upd_ia, hmap_ia) = solveReference lookup getRefs extUpds introCond (ref0:vis) hmap_i0 ref_ia + (upd_ib, hmap_ib) = maybe (Nothing, hmap_ia) + (first Just . solveReference lookup getRefs extUpds introCond (ref0:vis) hmap_ia) ref_ib + upd_i1 = extUpds upd_i0 $ introCond $ Conditional cond upd_ia upd_ib + in (upd_i1, hmap_ib) -- TODO: This should work recursively -- | Lookup the field names and corresponding types, for a given record type -- constructor name. -recTypConFields :: MonadEnv m +recTypConFields :: MonadEnv m ph => TypeConName -- ^ The record type constructor name to lookup. -> m [(FieldName,Type)] @@ -437,7 +719,7 @@ recTypConFields tc = lookupDataCon tc >>= \dat -> case dataCons dat of _ -> throwError ExpectRecord -- | Lookup the fields for a given record type. -recTypFields :: MonadEnv m +recTypFields :: MonadEnv m ph => Type -- ^ The type to lookup. -> m [FieldName] @@ -448,13 +730,16 @@ recTypFields (TStruct fs) = return $ map fst fs recTypFields _ = throwError ExpectRecord -- | Lookup the record fields and corresponding values from a given expression. -recExpFields :: MonadEnv m +recExpFields :: MonadEnv m ph => Expr -- ^ The expression to lookup. -> m [(FieldName, Expr)] recExpFields (EVar x) = do - env <- getEnv - let fss = [ fs | SkolRec y fs <- _envskol env , x == y ] + skols <- getEnv >>= \case + EnvVG{..} -> return _envvgskol + EnvCG{..} -> return _envcgskol + EnvS{..} -> return _envsskol + let fss = [ fs | SkolRec y fs <- skols, x == y ] if not (null fss) -- TODO: I would prefer `this.amount` here then return $ zip (head fss) (map (EVar . fieldName2VarName) $ head fss) @@ -471,34 +756,29 @@ recExpFields (ERecProj _ f e) = do Nothing -> throwError $ UnknownRecField f recExpFields _ = throwError ExpectRecord --- | Apply an expression substitution to an update set. -substituteTmUpd :: ExprSubst - -- ^ The substitution to apply. - -> UpdateSet - -- ^ The update set on which to apply the substitution. - -> UpdateSet -substituteTmUpd s UpdateSet{..} = UpdateSet susCre susArc _usCho _usVal - where - susCre = map (substituteTmUpdCreate s) _usCre - susArc = map (substituteTmUpdArchive s) _usArc - --- | Apply an expression substitution to a create update. -substituteTmUpdCreate :: ExprSubst - -- ^ The substitution to apply. - -> UpdCreate - -- ^ The create update on which to apply the substitution. - -> UpdCreate -substituteTmUpdCreate s UpdCreate{..} = UpdCreate _creTemp - (map (second (substituteTmTm s)) _creField) - --- | Apply an expression substitution to an archive update. -substituteTmUpdArchive :: ExprSubst - -- ^ The substitution to apply. - -> UpdArchive - -- ^ The archive update on which to apply the substitution. - -> UpdArchive -substituteTmUpdArchive s UpdArchive{..} = UpdArchive _arcTemp - (map (second (substituteTmTm s)) _arcField) +instance SubstTm BoolExpr where + substituteTm s (BExpr e) = BExpr (substituteTm s e) + substituteTm s (BAnd e1 e2) = BAnd (substituteTm s e1) (substituteTm s e2) + substituteTm s (BNot e) = BNot (substituteTm s e) + +instance SubstTm a => SubstTm (Cond a) where + substituteTm s (Determined x) = Determined $ substituteTm s x + substituteTm s (Conditional e x y) = + Conditional (substituteTm s e) (substituteTm s x) (substituteTm s y) + +instance SubstTm (UpdateSet ph) where + substituteTm s UpdateSetVG{..} = UpdateSetVG susUpdate _usvgChoice _usvgValue + where susUpdate = map (substituteTm s) _usvgUpdate + substituteTm s UpdateSetCG{..} = UpdateSetCG susUpdate _uscgChoice + where susUpdate = map (substituteTm s) _uscgUpdate + substituteTm s UpdateSetS{..} = UpdateSetS susUpdate + where susUpdate = map (substituteTm s) _ussUpdate + +instance SubstTm Upd where + substituteTm s UpdCreate{..} = UpdCreate _creTemp + (map (second (substituteTm s)) _creField) + substituteTm s UpdArchive{..} = UpdArchive _arcTemp + (map (second (substituteTm s)) _arcField) -- | Data type representing an error. data Error diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index 0c752464a7a3..b53bac18506a 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -1,6 +1,10 @@ -- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -- SPDX-License-Identifier: Apache-2.0 +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} + -- | Constraint generator for DAML LF static verification module DA.Daml.LF.Verify.Generate ( genPackages @@ -8,6 +12,7 @@ module DA.Daml.LF.Verify.Generate ) where import Control.Monad.Error.Class (catchError, throwError) +import Data.Maybe (listToMaybe) import qualified Data.NameMap as NM import Debug.Trace @@ -15,46 +20,40 @@ import DA.Daml.LF.Ast hiding (lookupChoice) import DA.Daml.LF.Verify.Context import DA.Daml.LF.Verify.Subst --- | Data type denoting the phase of the constraint generator. -data Phase - = ValuePhase - -- ^ The value phase gathers all value and data type definitions across modules. - | TemplatePhase - -- ^ The template phase gathers the updates performed by choices. - -- | Data type denoting the output of the constraint generator. -data Output = Output +data Output (ph :: Phase) = Output { _oExpr :: Expr -- ^ The expression, evaluated as far as possible. - , _oUpdate :: UpdateSet + , _oUpdate :: UpdateSet ph -- ^ The updates, performed by this expression. } -- | Construct an output with no updates. -emptyOut :: Expr +emptyOut :: GenPhase ph + => Expr -- ^ The evaluated expression. - -> Output + -> Output ph emptyOut expr = Output expr emptyUpdateSet -- | Extend a generator output with the updates of the second generator output. -- Note that the end result will contain only the first expression. -combineOut :: Output -> Output -> Output +combineOut :: Output ph -> Output ph -> Output ph combineOut out1 out2 = extendOutUpds (_oUpdate out2) out1 -- | Update an output with a new evaluated expression. updateOutExpr :: Expr -- ^ The new output expression. - -> Output + -> Output ph -- ^ The generator output to be updated. - -> Output + -> Output ph updateOutExpr expr out = out{_oExpr = expr} -- | Update an output with additional updates. -extendOutUpds :: UpdateSet +extendOutUpds :: UpdateSet ph -- ^ The extension of the update set. - -> Output + -> Output ph -- ^ The generator output to be updated. - -> Output + -> Output ph extendOutUpds upds out@Output{..} = out{_oUpdate = concatUpdateSet upds _oUpdate} -- | Update an output with an additional Archive update. @@ -62,56 +61,52 @@ addArchiveUpd :: Qualified TypeConName -- ^ The template to be archived. -> [(FieldName, Expr)] -- ^ The fields to be archived, with their respective values. - -> Output + -> Output 'ChoiceGathering -- ^ The generator output to be updated. - -> Output -addArchiveUpd temp fs (Output expr upd@UpdateSet{..}) = - Output expr upd{_usArc = UpdArchive temp fs : _usArc} + -> Output 'ChoiceGathering +addArchiveUpd temp fs (Output expr upds) = + Output expr (addUpd upds $ UpdArchive temp fs) -- | Generate an environment for a given list of packages. -- Depending on the generator phase, this either adds all value and data type -- definitions to the environment, or all template definitions with their -- respective choices. -genPackages :: MonadEnv m - => Phase - -- ^ The current generator phase. - -> [(PackageId, (Package, Maybe PackageName))] +genPackages :: (GenPhase ph, MonadEnv m ph) + => [(PackageId, (Package, Maybe PackageName))] -- ^ The list of packages, as produced by `readPackages`. -> m () -genPackages ph inp = mapM_ (genPackage ph) inp +genPackages inp = mapM_ genPackage inp -- | Generate an environment for a given package. -- Depending on the generator phase, this either adds all value and data type -- definitions to the environment, or all template definitions with their -- respective choices. -genPackage :: MonadEnv m - => Phase - -- ^ The current generator phase. - -> (PackageId, (Package, Maybe PackageName)) +genPackage :: (GenPhase ph, MonadEnv m ph) + => (PackageId, (Package, Maybe PackageName)) -- ^ The package, as produced by `readPackages`. -> m () -genPackage ph (id, (pac, _)) = mapM_ (genModule ph (PRImport id)) (NM.toList $ packageModules pac) +genPackage (id, (pac, _)) = mapM_ (genModule (PRImport id)) (NM.toList $ packageModules pac) -- | Generate an environment for a given module. -- Depending on the generator phase, this either adds all value and data type -- definitions to the environment, or all template definitions with their -- respective choices. -genModule :: MonadEnv m - => Phase - -- ^ The current generator phase. - -> PackageRef +genModule :: (GenPhase ph, MonadEnv m ph) + => PackageRef -- ^ A reference to the package in which this module is defined. -> Module -- ^ The module to analyse. -> m () -genModule ValuePhase pac mod = do - extDatsEnv (NM.toHashMap (moduleDataTypes mod)) - mapM_ (genValue pac (moduleName mod)) (NM.toList $ moduleValues mod) -genModule TemplatePhase pac mod = - mapM_ (genTemplate pac (moduleName mod)) (NM.toList $ moduleTemplates mod) +genModule pac mod = getEnv >>= \case + EnvVG{} -> do + extDatsEnv (NM.toHashMap (moduleDataTypes mod)) + mapM_ (genValue pac (moduleName mod)) (NM.toList $ moduleValues mod) + EnvCG{} -> + mapM_ (genTemplate pac (moduleName mod)) (NM.toList $ moduleTemplates mod) + EnvS{} -> error "Impossible: genModule can't be used in the solving phase" -- | Analyse a value definition and add to the environment. -genValue :: MonadEnv m +genValue :: (GenPhase ph, MonadEnv m ph) => PackageRef -- ^ A reference to the package in which this value is defined. -> ModuleName @@ -120,13 +115,13 @@ genValue :: MonadEnv m -- ^ The value to be analysed and added. -> m () genValue pac mod val = do - expOut <- genExpr ValuePhase (dvalBody val) + expOut <- genExpr (dvalBody val) let qname = Qualified pac mod (fst $ dvalBinder val) extValEnv qname (_oExpr expOut) (_oUpdate expOut) -- | Analyse a choice definition and add to the environment. -- TODO: Handle annotated choices, by returning a set of annotations. -genChoice :: MonadEnv m +genChoice :: MonadEnv m 'ChoiceGathering => Qualified TypeConName -- ^ The template in which this choice is defined. -> (ExprVarName,ExprVarName) @@ -146,8 +141,8 @@ genChoice tem (this',this) temFs TemplateChoice{..} = do extVarEnv arg argFs <- recTypFields (snd chcArgBinder) extRecEnv arg argFs - expOut <- genExpr TemplatePhase - $ substituteTmTm (createExprSubst [(self',EVar self),(this',EVar this),(arg',EVar arg)]) chcUpdate + expOut <- genExpr + $ substituteTm (createExprSubst [(self',EVar self),(this',EVar this),(arg',EVar arg)]) chcUpdate let out = if chcConsuming then addArchiveUpd tem fields expOut else expOut @@ -156,7 +151,7 @@ genChoice tem (this',this) temFs TemplateChoice{..} = do fields = map (\f -> (f, ERecProj (TypeConApp tem []) f (EVar this))) temFs -- | Analyse a template definition and add all choices to the environment. -genTemplate :: MonadEnv m +genTemplate :: MonadEnv m 'ChoiceGathering => PackageRef -- ^ A reference to the package in which this template is defined. -> ModuleName @@ -183,119 +178,106 @@ genTemplate pac mod Template{..} = do -- | Analyse an expression, and produce an Output storing its (partial) -- evaluation result and the set of performed updates. -genExpr :: MonadEnv m - => Phase - -- ^ The current generator phase. - -> Expr +genExpr :: (GenPhase ph, MonadEnv m ph) + => Expr -- ^ The expression to be analysed. - -> m Output -genExpr ph = \case - ETmApp fun arg -> genForTmApp ph fun arg - ETyApp expr typ -> genForTyApp ph expr typ - ELet bind body -> genForLet ph bind body - EVar name -> genForVar ph name - EVal w -> genForVal ph w - ERecProj tc f e -> genForRecProj ph tc f e - ELocation _ expr -> genExpr ph expr - EUpdate (UCreate tem arg) -> genForCreate ph tem arg - EUpdate (UExercise tem ch cid par arg) -> genForExercise ph tem ch cid par arg - EUpdate (UBind bind expr) -> genForBind ph bind expr - EUpdate (UPure _ expr) -> genExpr ph expr + -> m (Output ph) +genExpr = \case + ETmApp fun arg -> genForTmApp fun arg + ETyApp expr typ -> genForTyApp expr typ + ELet bind body -> genForLet bind body + EVar name -> genForVar name + EVal w -> genForVal w + ERecProj tc f e -> genForRecProj tc f e + ELocation _ expr -> genExpr expr + EUpdate (UCreate tem arg) -> genForCreate tem arg + EUpdate (UExercise tem ch cid par arg) -> genForExercise tem ch cid par arg + EUpdate (UBind bind expr) -> genForBind bind expr + EUpdate (UPure _ expr) -> genExpr expr + ECase e cs -> genForCase e cs -- TODO: Extend additional cases e -> return $ emptyOut e -- | Analyse a term application expression. -genForTmApp :: MonadEnv m - => Phase - -- ^ The current generator phase. - -> Expr +genForTmApp :: (GenPhase ph, MonadEnv m ph) + => Expr -- ^ The function expression. -> Expr -- ^ The argument expression. - -> m Output -genForTmApp ph fun arg = do - funOut <- genExpr ph fun - arout <- genExpr ph arg + -> m (Output ph) +genForTmApp fun arg = do + funOut <- genExpr fun + arout <- genExpr arg case _oExpr funOut of -- TODO: Should we rename here? ETmLam bndr body -> do let subst = singleExprSubst (fst bndr) (_oExpr arout) - resExpr = substituteTmTm subst body - resOut <- genExpr ph resExpr + resExpr = substituteTm subst body + resOut <- genExpr resExpr return $ combineOut resOut $ combineOut funOut arout fun' -> return $ updateOutExpr (ETmApp fun' (_oExpr arout)) $ combineOut funOut arout -- | Analyse a type application expression. -genForTyApp :: MonadEnv m - => Phase - -- ^ The current generator phase. - -> Expr +genForTyApp :: (GenPhase ph, MonadEnv m ph) + => Expr -- ^ The function expression. -> Type -- ^ The argument type. - -> m Output -genForTyApp ph expr typ = do - exprOut <- genExpr ph expr + -> m (Output ph) +genForTyApp expr typ = do + exprOut <- genExpr expr case _oExpr exprOut of ETyLam bndr body -> do let subst = singleTypeSubst (fst bndr) typ - resExpr = substituteTyTm subst body - resOut <- genExpr ph resExpr + resExpr = substituteTy subst body + resOut <- genExpr resExpr return $ combineOut resOut exprOut expr' -> return $ updateOutExpr (ETyApp expr' typ) exprOut -- | Analyse a let binding expression. -genForLet :: MonadEnv m - => Phase - -- ^ The current generator phase. - -> Binding +genForLet :: (GenPhase ph, MonadEnv m ph) + => Binding -- ^ The binding to be bound. -> Expr -- ^ The expression in which the binding should be available. - -> m Output -genForLet ph bind body = do - bindOut <- genExpr ph (bindingBound bind) + -> m (Output ph) +genForLet bind body = do + bindOut <- genExpr (bindingBound bind) let subst = singleExprSubst (fst $ bindingBinder bind) (_oExpr bindOut) - resExpr = substituteTmTm subst body - resOut <- genExpr ph resExpr + resExpr = substituteTm subst body + resOut <- genExpr resExpr return $ combineOut resOut bindOut -- | Analyse an expression variable. -genForVar :: MonadEnv m - => Phase - -- ^ The current generator phase. - -> ExprVarName +genForVar :: (GenPhase ph, MonadEnv m ph) + => ExprVarName -- ^ The expression variable to be analysed. - -> m Output -genForVar _ph name = lookupVar name >> return (emptyOut (EVar name)) + -> m (Output ph) +genForVar name = lookupVar name >> return (emptyOut (EVar name)) -- | Analyse a value reference. -genForVal :: MonadEnv m - => Phase - -- ^ The current generator phase. - -> Qualified ExprValName +genForVal :: (GenPhase ph, MonadEnv m ph) + => Qualified ExprValName -- ^ The value reference to be analysed. - -> m Output -genForVal ValuePhase w - = return $ Output (EVal w) (emptyUpdateSet{_usVal = [w]}) -genForVal TemplatePhase w - = lookupVal w >>= \ (expr, upds) -> return (Output expr upds) + -> m (Output ph) +genForVal w = getEnv >>= \case + EnvVG{} -> return $ Output (EVal w) (emptyUpdateSet{_usvgValue = [Determined w]}) + EnvCG{} -> lookupVal w >>= \ (expr, upds) -> return (Output expr upds) + EnvS{} -> error "Impossible: genForVal can't be used in the solving phase" -- | Analyse a record projection expression. -genForRecProj :: MonadEnv m - => Phase - -- ^ The current generator phase. - -> TypeConApp +genForRecProj :: (GenPhase ph, MonadEnv m ph) + => TypeConApp -- ^ The type constructor of the record which is projected. -> FieldName -- ^ The field which is projected. -> Expr -- ^ The record expression which is projected. - -> m Output -genForRecProj ph tc f body = do - bodyOut <- genExpr ph body + -> m (Output ph) +genForRecProj tc f body = do + bodyOut <- genExpr body case _oExpr bodyOut of -- TODO: I think we can reduce duplication a bit more here EVar x -> do @@ -306,29 +288,58 @@ genForRecProj ph tc f body = do expr -> do fs <- recExpFields expr case lookup f fs of - Just expr -> genExpr ph expr + Just expr -> genExpr expr Nothing -> throwError $ UnknownRecField f +-- | Analyse a case expression. +-- TODO: Atm only boolean cases are supported +genForCase :: (GenPhase ph, MonadEnv m ph) + => Expr + -- ^ The expression to match on. + -> [CaseAlternative] + -- ^ The list of alternatives. + -> m (Output ph) +genForCase exp cs = do + expOut <- genExpr exp + case findBool True of + Just tru -> do + truOut <- genExpr tru + case findBool False of + Just fal -> do + falOut <- genExpr fal + let resExp = ECase (_oExpr expOut) + [ CaseAlternative (CPBool True) (_oExpr truOut) + , CaseAlternative (CPBool False) (_oExpr falOut) ] + resUpd = _oUpdate expOut `concatUpdateSet` + conditionalUpdateSet (_oExpr expOut) (_oUpdate truOut) (Just $ _oUpdate falOut) + return $ Output resExp resUpd + Nothing -> do + let resExp = ECase (_oExpr expOut) + [ CaseAlternative (CPBool True) (_oExpr truOut) ] + resUpd = _oUpdate expOut `concatUpdateSet` + conditionalUpdateSet (_oExpr expOut) (_oUpdate truOut) Nothing + return $ Output resExp resUpd + Nothing -> return $ emptyOut (ECase exp cs) + where + findBool :: Bool -> Maybe Expr + findBool b1 = listToMaybe $ [e | CaseAlternative (CPBool b2) e <- cs, b1 == b2] + -- | Analyse a create update expression. -genForCreate :: MonadEnv m - => Phase - -- ^ The current generator phase. - -> Qualified TypeConName +genForCreate :: (GenPhase ph, MonadEnv m ph) + => Qualified TypeConName -- ^ The template of which a new instance is being created. -> Expr -- ^ The argument expression. - -> m Output -genForCreate ph tem arg = do - arout <- genExpr ph arg + -> m (Output ph) +genForCreate tem arg = do + arout <- genExpr arg fs <- recExpFields (_oExpr arout) - return (Output (EUpdate (UCreate tem $ _oExpr arout)) emptyUpdateSet{_usCre = [UpdCreate tem fs]}) + return (Output (EUpdate (UCreate tem $ _oExpr arout)) $ addUpd emptyUpdateSet (UpdCreate tem fs)) -- TODO: We could potentially filter here to only store the interesting fields? -- | Analyse an exercise update expression. -genForExercise :: MonadEnv m - => Phase - -- ^ The current generator phase. - -> Qualified TypeConName +genForExercise :: (GenPhase ph, MonadEnv m ph) + => Qualified TypeConName -- ^ The template on which a choice is being exercised. -> ChoiceName -- ^ The choice which is being exercised. @@ -338,36 +349,35 @@ genForExercise :: MonadEnv m -- ^ The party which exercises the choice. -> Expr -- ^ The arguments with which the choice is being exercised. - -> m Output -genForExercise ph tem ch cid par arg = do - cidOut <- genExpr ph cid - arout <- genExpr ph arg + -> m (Output ph) +genForExercise tem ch cid par arg = do + cidOut <- genExpr cid + arout <- genExpr arg updSubst <- lookupChoice tem ch -- TODO: Temporary solution - this <- lookupCid (_oExpr cidOut) `catchError` (\_ -> trace ("Not found: " ++ show (_oExpr cidOut)) $ return $ ExprVarName "this") + this <- lookupCid (_oExpr cidOut) `catchError` + (\_ -> trace ("Not found: " ++ show (_oExpr cidOut)) $ return $ ExprVarName "this") -- TODO: Should we further eval after subst? But how to eval an update set? let updSet = updSubst (_oExpr cidOut) (EVar this) (_oExpr arout) return (Output (EUpdate (UExercise tem ch (_oExpr cidOut) par (_oExpr arout))) updSet) -- | Analyse a bind update expression. -- TODO: Handle arbitrary update outputs, not just simple fetches -genForBind :: MonadEnv m - => Phase - -- ^ The current generator phase. - -> Binding +genForBind :: (GenPhase ph, MonadEnv m ph) + => Binding -- ^ The binding being bound with this update. -> Expr -- ^ The expression in which this binding is being made available. - -> m Output -genForBind ph bind body = do - bindOut <- genExpr ph (bindingBound bind) + -> m (Output ph) +genForBind bind body = do + bindOut <- genExpr (bindingBound bind) case _oExpr bindOut of EUpdate (UFetch tc cid) -> do fs <- recTypConFields $ qualObject tc extRecEnv (fst $ bindingBinder bind) (map fst fs) - cidOut <- genExpr ph cid + cidOut <- genExpr cid extCidEnv (_oExpr cidOut) (fst $ bindingBinder bind) _ -> return () extVarEnv (fst $ bindingBinder bind) - bodyOut <- genExpr ph body + bodyOut <- genExpr body return $ combineOut bodyOut bindOut diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 879d6ae59d78..9828f1cd63a7 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -1,6 +1,8 @@ -- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -- SPDX-License-Identifier: Apache-2.0 +{-# LANGUAGE DataKinds #-} + -- | Constraint solver for DAML LF static verification module DA.Daml.LF.Verify.Solve ( constructConstr @@ -8,7 +10,8 @@ module DA.Daml.LF.Verify.Solve , ConstraintSet(..) ) where -import Data.Maybe (fromJust) +import Data.Bifunctor +import Data.Maybe (fromJust, maybeToList) import Data.List (lookup) import Data.Set (toList, fromList) import qualified Data.Text as T @@ -20,30 +23,58 @@ import DA.Daml.LF.Verify.Context -- TODO: Since S.SExpr is so similar, we could just drop this. -- | A simple form of expressions featuring basic arithmetic. data ConstraintExpr + -- | Boolean value. + = CBool !Bool -- | Reference to an expression variable. - = CVar !ExprVarName + | CVar !ExprVarName -- | Sum of two expressions. | CAdd !ConstraintExpr !ConstraintExpr -- | Subtraction of two expressions. | CSub !ConstraintExpr !ConstraintExpr + -- | Boolean and operator. + | CAnd !ConstraintExpr !ConstraintExpr + -- | Boolean not operator. + | CNot !ConstraintExpr + -- | If then else expression. + | CIf !ConstraintExpr !ConstraintExpr !ConstraintExpr + -- | If then expression. + | CWhen !ConstraintExpr !ConstraintExpr instance Show ConstraintExpr where + show (CBool b) = show b show (CVar x) = T.unpack $ unExprVarName x show (CAdd e1 e2) = show e1 ++ " + " ++ show e2 show (CSub e1 e2) = show e1 ++ " - " ++ show e2 + show (CAnd e1 e2) = show e1 ++ " and " ++ show e2 + show (CNot e) = "not " ++ show e + show (CIf e1 e2 e3) = "if " ++ show e1 ++ " then " ++ show e2 ++ " else " ++ show e3 + show (CWhen e1 e2) = "when " ++ show e1 ++ " then " ++ show e2 --- | Convert a DAML-LF expression to a constraint expression, if possible. -exp2CExp :: Expr - -- ^ The expression to convert. - -> ConstraintExpr -exp2CExp (EVar x) = CVar x -exp2CExp (ERecProj _ f (EVar x)) = CVar $ recProj2Var x f -exp2CExp (ETmApp (ETmApp (ETyApp (EBuiltin b) _) e1) e2) = case b of - BEAddNumeric -> CAdd (exp2CExp e1) (exp2CExp e2) - BESubNumeric -> CSub (exp2CExp e1) (exp2CExp e2) - _ -> error ("Builtin: " ++ show b) -exp2CExp (ELocation _ e) = exp2CExp e -exp2CExp e = error ("Conversion: " ++ show e) +-- | Class covering the types converteable to constraint expressions. +class ConstrExpr a where + -- | Convert the given data type to a constraint expression. + toCExp :: a -> ConstraintExpr + +instance ConstrExpr BoolExpr where + toCExp (BExpr e) = toCExp e + toCExp (BAnd b1 b2) = CAnd (toCExp b1) (toCExp b2) + toCExp (BNot b) = CNot (toCExp b) + +instance ConstrExpr Expr where + toCExp (EVar x) = CVar x + toCExp (ERecProj _ f (EVar x)) = CVar $ recProj2Var x f + toCExp (ETmApp (ETmApp (ETyApp (EBuiltin b) _) e1) e2) = case b of + BEAddNumeric -> CAdd (toCExp e1) (toCExp e2) + BESubNumeric -> CSub (toCExp e1) (toCExp e2) + _ -> error ("Builtin: " ++ show b) + toCExp (ELocation _ e) = toCExp e + toCExp (EBuiltin (BEBool b)) = CBool b + toCExp e = error ("Conversion: " ++ show e) + +instance ConstrExpr a => ConstrExpr (Cond a) where + toCExp (Determined x) = toCExp x + toCExp (Conditional b x Nothing) = CWhen (toCExp b) (toCExp x) + toCExp (Conditional b x (Just y)) = CIf (toCExp b) (toCExp x) (toCExp y) -- | Gather the variable names bound within a skolem variable. skol2var :: Skolem @@ -71,12 +102,50 @@ data ConstraintSet = ConstraintSet } deriving Show +-- | Filters a single update to match the given template, and takes out the +-- field of interest. The update gets converted into a constraint expression. +-- It returns either a create or an archive update. +filterUpd :: TypeConName + -- ^ The template name to filter against. + -> FieldName + -- ^ The field name to be verified. + -> Upd + -- ^ The update expression to convert and filter. + -> (Maybe ConstraintExpr, Maybe ConstraintExpr) +filterUpd tem f UpdCreate{..} = if tem == qualObject _creTemp + then (Just (toCExp $ fromJust $ lookup f _creField), Nothing) + else (Nothing, Nothing) +filterUpd tem f UpdArchive{..} = if tem == qualObject _arcTemp + then (Nothing, Just (toCExp $ fromJust $ lookup f _arcField)) + else (Nothing, Nothing) + +-- | Filters and converts a conditional update into (possibly two) constraint +-- expressions, while splitting it into create and archive updates. +filterCondUpd :: TypeConName + -- ^ The template name to filter against + -> FieldName + -- ^ The field name to be verified. + -> Cond Upd + -- ^ The conditional update expression to convert and filter. + -> ([ConstraintExpr], [ConstraintExpr]) +filterCondUpd tem f (Determined x) = bimap maybeToList maybeToList $ filterUpd tem f x +filterCondUpd tem f (Conditional b x Nothing) = + let cb = toCExp b + cx = bimap maybeToList maybeToList $ filterUpd tem f x + in bimap (map (CWhen cb)) (map (CWhen cb)) cx +filterCondUpd tem f (Conditional b x (Just y)) = + let cb = toCExp b + (cxcre,cxarc) = bimap maybeToList maybeToList $ filterUpd tem f x + (cycre,cyarc) = bimap maybeToList maybeToList $ filterUpd tem f y + -- TODO: We should try to use an if here. + in ( map (CWhen cb) cxcre ++ map (CWhen (CNot cb)) cycre + , map (CWhen cb) cxarc ++ map (CWhen (CNot cb)) cyarc ) + -- | Constructs a constraint set from the generator environment, together with -- the template name, the choice and field to be verified. --- TODO: Take choices into account? -- TODO: The choice and field don't actually need to be in the same template. -- Take two templates as arguments. -constructConstr :: Env +constructConstr :: Env 'Solving -- ^ The generator environment to convert. -> TypeConName -- ^ The template name to be verified. @@ -86,15 +155,14 @@ constructConstr :: Env -- ^ The field name to be verified. -> ConstraintSet constructConstr env tem ch f = - case lookupChoInHMap (_envchs env) tem ch of + case lookupChoInHMap (_envschs env) tem ch of Just (self, this, arg, updSubst) -> - let upds = updSubst (EVar self) (EVar this) (EVar arg) - vars = concatMap skol2var (_envskol env) - creUpds = filter (\UpdCreate{..} -> tem == qualObject _creTemp) (_usCre upds) - creVals = map (exp2CExp . fromJust . lookup f . _creField) creUpds - arcUpds = filter (\UpdArchive{..} -> tem == qualObject _arcTemp) (_usArc upds) - arcVals = map (exp2CExp . fromJust . lookup f . _arcField) arcUpds - in ConstraintSet vars creVals arcVals + let upds = _ussUpdate $ updSubst (EVar self) (EVar this) (EVar arg) + vars = concatMap skol2var (_envsskol env) + (cres, arcs) = foldl + (\(cs,as) upd -> let (cs',as') = filterCondUpd tem f upd in (cs ++ cs',as ++ as')) + ([],[]) upds + in ConstraintSet vars cres arcs Nothing -> error "Choice not found" -- | Convert a constraint expression into an SMT expression from the solving library. @@ -103,6 +171,7 @@ cexp2sexp :: [(ExprVarName,S.SExpr)] -> ConstraintExpr -- ^ The constraint expression to convert. -> IO S.SExpr +cexp2sexp _vars (CBool b) = return $ S.bool b cexp2sexp vars (CVar x) = case lookup x vars of Just exp -> return exp Nothing -> error ("Impossible: variable not found " ++ show x) @@ -114,6 +183,23 @@ cexp2sexp vars (CSub ce1 ce2) = do se1 <- cexp2sexp vars ce1 se2 <- cexp2sexp vars ce2 return $ S.sub se1 se2 +cexp2sexp vars (CAnd ce1 ce2) = do + se1 <- cexp2sexp vars ce1 + se2 <- cexp2sexp vars ce2 + return $ S.and se1 se2 +cexp2sexp vars (CNot ce) = do + se <- cexp2sexp vars ce + return $ S.not se +cexp2sexp vars (CIf ce1 ce2 ce3) = do + se1 <- cexp2sexp vars ce1 + se2 <- cexp2sexp vars ce2 + se3 <- cexp2sexp vars ce3 + return $ S.ite se1 se2 se3 +cexp2sexp vars (CWhen ce1 ce2) = do + se1 <- cexp2sexp vars ce1 + se2 <- cexp2sexp vars ce2 + -- TODO: Temporary hack + return $ S.ite se1 se2 (S.real 0) -- | Declare a list of variables for the SMT solver. Returns a list of the -- declared variables, together with their corresponding SMT counterparts. diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs index f9a44fa45237..902f10bbfec2 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs @@ -7,8 +7,8 @@ module DA.Daml.LF.Verify.Subst , singleExprSubst , singleTypeSubst , createExprSubst - , substituteTmTm - , substituteTyTm + , SubstTm(..) + , SubstTy(..) ) where import Control.Lens hiding (Context) @@ -47,121 +47,111 @@ substDom :: ExprSubst -> [ExprVarName] substDom = Map.keys --- | Apply an expression substitution to an expression. +-- | A class covering the data types to which an expression substitution can be applied. +class SubstTm a where + -- | Apply an expression substitution. + substituteTm :: ExprSubst + -- ^ The expression substitution to apply. + -> a + -- ^ The data to apply the substitution to. + -> a + +-- | A class covering the data types to which a type substitution can be applied. +class SubstTy a where + -- | Apply an type substitution. + substituteTy :: Subst + -- ^ The type substitution to apply. + -> a + -- ^ The data to apply the substitution to. + -> a + -- TODO: We assume that for any substitution x |-> e : x notin e -- and a |-> t : a notin t. --- TODO: I can't help but feel there has to be a nicer way to write this function -substituteTmTm :: ExprSubst - -- ^ The expression substitution to apply. - -> Expr - -- ^ The expression to apply the substitution to. - -> Expr -substituteTmTm s = \case - EVar x - | Just e <- Map.lookup x s -> e - | otherwise -> EVar x - ERecCon t fs -> ERecCon t $ map (over _2 (substituteTmTm s)) fs - ERecProj t f e -> ERecProj t f $ substituteTmTm s e - ERecUpd t f e1 e2 -> ERecUpd t f (substituteTmTm s e1) (substituteTmTm s e2) - EVariantCon t v e -> EVariantCon t v (substituteTmTm s e) - EStructCon fs -> EStructCon $ map (over _2 (substituteTmTm s)) fs - EStructProj f e -> EStructProj f (substituteTmTm s e) - EStructUpd f e1 e2 -> EStructUpd f (substituteTmTm s e1) (substituteTmTm s e2) - ETmApp e1 e2 -> ETmApp (substituteTmTm s e1) (substituteTmTm s e2) - ETyApp e t -> ETyApp (substituteTmTm s e) t - ETmLam (x,t) e -> if x `elem` substDom s - then ETmLam (x,t) e - else ETmLam (x,t) (substituteTmTm s e) - ETyLam (a,k) e -> ETyLam (a,k) (substituteTmTm s e) - ECase e cs -> ECase (substituteTmTm s e) - $ map (\CaseAlternative{..} -> CaseAlternative altPattern (substituteTmTm s altExpr)) cs - ELet Binding{..} e -> ELet (Binding bindingBinder $ substituteTmTm s bindingBound) - (substituteTmTm s e) - ECons t e1 e2 -> ECons t (substituteTmTm s e1) (substituteTmTm s e2) - ESome t e -> ESome t (substituteTmTm s e) - EToAny t e -> EToAny t (substituteTmTm s e) - EFromAny t e -> EFromAny t (substituteTmTm s e) - EUpdate u -> EUpdate $ substituteTmUpd s u - ELocation l e -> ELocation l (substituteTmTm s e) - e -> e - --- | Apply an expression substitution to an update. -substituteTmUpd :: ExprSubst - -- ^ The expression substitution to apply. - -> Update - -- ^ The update to apply the substitution to. - -> Update -substituteTmUpd s = \case - UPure t e -> UPure t $ substituteTmTm s e - UBind Binding{..} e -> UBind (Binding bindingBinder $ substituteTmTm s bindingBound) - (substituteTmTm s e) - UCreate t e -> UCreate t $ substituteTmTm s e - UExercise t c e1 a e2 -> UExercise t c (substituteTmTm s e1) a (substituteTmTm s e2) - UFetch t e -> UFetch t $ substituteTmTm s e - UEmbedExpr t e -> UEmbedExpr t $ substituteTmTm s e - u -> u - --- | Apply a type substitution to an expression. -substituteTyTm :: Subst - -- ^ The type substitution to apply. - -> Expr - -- ^ The expression to apply the substitution to. - -> Expr -substituteTyTm s = \case - ERecCon t fs -> ERecCon (substituteTyTCApp s t) $ map (over _2 (substituteTyTm s)) fs - ERecProj t f e -> ERecProj (substituteTyTCApp s t) f $ substituteTyTm s e - ERecUpd t f e1 e2 -> ERecUpd (substituteTyTCApp s t) f (substituteTyTm s e1) - (substituteTyTm s e2) - EVariantCon t v e -> EVariantCon (substituteTyTCApp s t) v (substituteTyTm s e) - EStructCon fs -> EStructCon $ map (over _2 (substituteTyTm s)) fs - EStructProj f e -> EStructProj f $ substituteTyTm s e - EStructUpd f e1 e2 -> EStructUpd f (substituteTyTm s e1) (substituteTyTm s e2) - ETmApp e1 e2 -> ETmApp (substituteTyTm s e1) (substituteTyTm s e2) - ETyApp e t -> ETyApp (substituteTyTm s e) (substitute s t) - ETmLam (n, t) e -> ETmLam (n, substitute s t) (substituteTyTm s e) - ETyLam b e -> ETyLam b $ substituteTyTm s e - ECase e cs -> ECase (substituteTyTm s e) (map (substituteTyCaseAlt s) cs) - ELet Binding{..} e -> ELet (Binding (over _2 (substitute s) bindingBinder) (substituteTyTm s bindingBound)) - (substituteTyTm s e) - ENil t -> ENil (substitute s t) - ECons t e1 e2 -> ECons (substitute s t) (substituteTyTm s e1) (substituteTyTm s e2) - ESome t e -> ESome (substitute s t) (substituteTyTm s e) - ENone t -> ENone (substitute s t) - EToAny t e -> EToAny (substitute s t) (substituteTyTm s e) - EFromAny t e -> EFromAny (substitute s t) (substituteTyTm s e) - ETypeRep t -> ETypeRep (substitute s t) - EUpdate u -> EUpdate (substituteTyUpd s u) - ELocation l e -> ELocation l (substituteTyTm s e) - e -> e - --- | Apply a type substitution to an update. -substituteTyUpd :: Subst - -- ^ The type substitution to apply. - -> Update - -- ^ The update to apply the substitution to. - -> Update -substituteTyUpd s = \case - UPure t e -> UPure (substitute s t) (substituteTyTm s e) - UBind Binding{..} e -> UBind (Binding (over _2 (substitute s) bindingBinder) (substituteTyTm s bindingBound)) - (substituteTyTm s e) - UCreate n e -> UCreate n (substituteTyTm s e) - UExercise n c e1 a e2 -> UExercise n c (substituteTyTm s e1) a (substituteTyTm s e2) - UFetch n e -> UFetch n (substituteTyTm s e) - UEmbedExpr t e -> UEmbedExpr (substitute s t) (substituteTyTm s e) - u -> u - --- | Apply a type substitution to an applied type constructor. -substituteTyTCApp :: Subst - -- ^ The type substitution to apply. - -> TypeConApp - -- ^ The applied type constructor to apply the substitution to. - -> TypeConApp -substituteTyTCApp s (TypeConApp n ts) = TypeConApp n (map (substitute s) ts) - --- | Apply a type substitution to a case alternative. -substituteTyCaseAlt :: Subst - -- ^ The type substitution to apply. - -> CaseAlternative - -- ^ The case alternative to apply the substitution to. - -> CaseAlternative -substituteTyCaseAlt s (CaseAlternative p e) = CaseAlternative p (substituteTyTm s e) +instance SubstTm Expr where + substituteTm s = \case + EVar x + | Just e <- Map.lookup x s -> e + | otherwise -> EVar x + ERecCon t fs -> ERecCon t $ map (over _2 (substituteTm s)) fs + ERecProj t f e -> ERecProj t f $ substituteTm s e + ERecUpd t f e1 e2 -> ERecUpd t f (substituteTm s e1) (substituteTm s e2) + EVariantCon t v e -> EVariantCon t v (substituteTm s e) + EStructCon fs -> EStructCon $ map (over _2 (substituteTm s)) fs + EStructProj f e -> EStructProj f (substituteTm s e) + EStructUpd f e1 e2 -> EStructUpd f (substituteTm s e1) (substituteTm s e2) + ETmApp e1 e2 -> ETmApp (substituteTm s e1) (substituteTm s e2) + ETyApp e t -> ETyApp (substituteTm s e) t + ETmLam (x,t) e -> if x `elem` substDom s + then ETmLam (x,t) e + else ETmLam (x,t) (substituteTm s e) + ETyLam (a,k) e -> ETyLam (a,k) (substituteTm s e) + ECase e cs -> ECase (substituteTm s e) + $ map (\CaseAlternative{..} -> CaseAlternative altPattern (substituteTm s altExpr)) cs + ELet Binding{..} e -> ELet (Binding bindingBinder $ substituteTm s bindingBound) + (substituteTm s e) + ECons t e1 e2 -> ECons t (substituteTm s e1) (substituteTm s e2) + ESome t e -> ESome t (substituteTm s e) + EToAny t e -> EToAny t (substituteTm s e) + EFromAny t e -> EFromAny t (substituteTm s e) + EUpdate u -> EUpdate $ substituteTm s u + ELocation l e -> ELocation l (substituteTm s e) + e -> e + +instance SubstTm Update where + substituteTm s = \case + UPure t e -> UPure t $ substituteTm s e + UBind Binding{..} e -> UBind (Binding bindingBinder $ substituteTm s bindingBound) + (substituteTm s e) + UCreate t e -> UCreate t $ substituteTm s e + UExercise t c e1 a e2 -> UExercise t c (substituteTm s e1) a (substituteTm s e2) + UFetch t e -> UFetch t $ substituteTm s e + UEmbedExpr t e -> UEmbedExpr t $ substituteTm s e + u -> u + +instance SubstTm a => SubstTm (Maybe a) where + substituteTm s m = substituteTm s <$> m + +instance SubstTy Expr where + substituteTy s = \case + ERecCon t fs -> ERecCon (substituteTy s t) $ map (over _2 (substituteTy s)) fs + ERecProj t f e -> ERecProj (substituteTy s t) f $ substituteTy s e + ERecUpd t f e1 e2 -> ERecUpd (substituteTy s t) f (substituteTy s e1) + (substituteTy s e2) + EVariantCon t v e -> EVariantCon (substituteTy s t) v (substituteTy s e) + EStructCon fs -> EStructCon $ map (over _2 (substituteTy s)) fs + EStructProj f e -> EStructProj f $ substituteTy s e + EStructUpd f e1 e2 -> EStructUpd f (substituteTy s e1) (substituteTy s e2) + ETmApp e1 e2 -> ETmApp (substituteTy s e1) (substituteTy s e2) + ETyApp e t -> ETyApp (substituteTy s e) (substitute s t) + ETmLam (n, t) e -> ETmLam (n, substitute s t) (substituteTy s e) + ETyLam b e -> ETyLam b $ substituteTy s e + ECase e cs -> ECase (substituteTy s e) (map (substituteTy s) cs) + ELet Binding{..} e -> ELet (Binding (over _2 (substitute s) bindingBinder) (substituteTy s bindingBound)) + (substituteTy s e) + ENil t -> ENil (substitute s t) + ECons t e1 e2 -> ECons (substitute s t) (substituteTy s e1) (substituteTy s e2) + ESome t e -> ESome (substitute s t) (substituteTy s e) + ENone t -> ENone (substitute s t) + EToAny t e -> EToAny (substitute s t) (substituteTy s e) + EFromAny t e -> EFromAny (substitute s t) (substituteTy s e) + ETypeRep t -> ETypeRep (substitute s t) + EUpdate u -> EUpdate (substituteTy s u) + ELocation l e -> ELocation l (substituteTy s e) + e -> e + +instance SubstTy Update where + substituteTy s = \case + UPure t e -> UPure (substitute s t) (substituteTy s e) + UBind Binding{..} e -> UBind (Binding (over _2 (substitute s) bindingBinder) (substituteTy s bindingBound)) + (substituteTy s e) + UCreate n e -> UCreate n (substituteTy s e) + UExercise n c e1 a e2 -> UExercise n c (substituteTy s e1) a (substituteTy s e2) + UFetch n e -> UFetch n (substituteTy s e) + UEmbedExpr t e -> UEmbedExpr (substitute s t) (substituteTy s e) + u -> u + +instance SubstTy TypeConApp where + substituteTy s (TypeConApp n ts) = TypeConApp n (map (substitute s) ts) + +instance SubstTy CaseAlternative where + substituteTy s (CaseAlternative p e) = CaseAlternative p (substituteTy s e) From 50c56c387b593d3eb5c76c0428a0bdcbfa521b3a Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Wed, 6 May 2020 10:46:26 +0200 Subject: [PATCH 26/50] Small missing arithmetic --- .../src/DA/Daml/LF/Verify/Solve.hs | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 9828f1cd63a7..1849c0e79b20 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -25,12 +25,18 @@ import DA.Daml.LF.Verify.Context data ConstraintExpr -- | Boolean value. = CBool !Bool + -- | Integer value. + | CInt !Integer + -- | Real value. + | CReal !Rational -- | Reference to an expression variable. | CVar !ExprVarName -- | Sum of two expressions. | CAdd !ConstraintExpr !ConstraintExpr -- | Subtraction of two expressions. | CSub !ConstraintExpr !ConstraintExpr + -- | Equals operator. + | CEq !ConstraintExpr !ConstraintExpr -- | Boolean and operator. | CAnd !ConstraintExpr !ConstraintExpr -- | Boolean not operator. @@ -42,9 +48,12 @@ data ConstraintExpr instance Show ConstraintExpr where show (CBool b) = show b + show (CInt i) = show i + show (CReal i) = show i show (CVar x) = T.unpack $ unExprVarName x show (CAdd e1 e2) = show e1 ++ " + " ++ show e2 show (CSub e1 e2) = show e1 ++ " - " ++ show e2 + show (CEq e1 e2) = show e1 ++ " == " ++ show e2 show (CAnd e1 e2) = show e1 ++ " and " ++ show e2 show (CNot e) = "not " ++ show e show (CIf e1 e2 e3) = "if " ++ show e1 ++ " then " ++ show e2 ++ " else " ++ show e3 @@ -63,12 +72,18 @@ instance ConstrExpr BoolExpr where instance ConstrExpr Expr where toCExp (EVar x) = CVar x toCExp (ERecProj _ f (EVar x)) = CVar $ recProj2Var x f - toCExp (ETmApp (ETmApp (ETyApp (EBuiltin b) _) e1) e2) = case b of - BEAddNumeric -> CAdd (toCExp e1) (toCExp e2) - BESubNumeric -> CSub (toCExp e1) (toCExp e2) - _ -> error ("Builtin: " ++ show b) + toCExp (ETmApp (ETmApp op e1) e2) = case op of + (EBuiltin (BEEqual _)) -> CEq (toCExp e1) (toCExp e2) + (EBuiltin BEAddInt64) -> CAdd (toCExp e1) (toCExp e2) + (EBuiltin BESubInt64) -> CSub (toCExp e1) (toCExp e2) + (ETyApp (EBuiltin BEAddNumeric) _) -> CAdd (toCExp e1) (toCExp e2) + (ETyApp (EBuiltin BESubNumeric) _) -> CSub (toCExp e1) (toCExp e2) + _ -> error ("Builtin: " ++ show op) toCExp (ELocation _ e) = toCExp e toCExp (EBuiltin (BEBool b)) = CBool b + toCExp (EBuiltin (BEInt64 i)) = CInt $ toInteger i + -- TODO + -- toCExp (EBuiltin (BENumeric i)) = CReal i toCExp e = error ("Conversion: " ++ show e) instance ConstrExpr a => ConstrExpr (Cond a) where @@ -172,6 +187,8 @@ cexp2sexp :: [(ExprVarName,S.SExpr)] -- ^ The constraint expression to convert. -> IO S.SExpr cexp2sexp _vars (CBool b) = return $ S.bool b +cexp2sexp _vars (CInt i) = return $ S.int i +cexp2sexp _vars (CReal i) = return $ S.real i cexp2sexp vars (CVar x) = case lookup x vars of Just exp -> return exp Nothing -> error ("Impossible: variable not found " ++ show x) @@ -183,6 +200,10 @@ cexp2sexp vars (CSub ce1 ce2) = do se1 <- cexp2sexp vars ce1 se2 <- cexp2sexp vars ce2 return $ S.sub se1 se2 +cexp2sexp vars (CEq ce1 ce2) = do + se1 <- cexp2sexp vars ce1 + se2 <- cexp2sexp vars ce2 + return $ S.eq se1 se2 cexp2sexp vars (CAnd ce1 ce2) = do se1 <- cexp2sexp vars ce1 se2 <- cexp2sexp vars ce2 From d880fa52fe67491f832545a88d6a1d8b91ef1118 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Wed, 6 May 2020 11:34:04 +0200 Subject: [PATCH 27/50] More small missing arithmetic --- compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 1849c0e79b20..311fff9f426c 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -78,6 +78,10 @@ instance ConstrExpr Expr where (EBuiltin BESubInt64) -> CSub (toCExp e1) (toCExp e2) (ETyApp (EBuiltin BEAddNumeric) _) -> CAdd (toCExp e1) (toCExp e2) (ETyApp (EBuiltin BESubNumeric) _) -> CSub (toCExp e1) (toCExp e2) + (ETmApp (ETyApp (EVal (Qualified _ _ (ExprValName "+"))) _) _) -> + CAdd (toCExp e1) (toCExp e2) + (ETmApp (ETyApp (EVal (Qualified _ _ (ExprValName "-"))) _) _) -> + CSub (toCExp e1) (toCExp e2) _ -> error ("Builtin: " ++ show op) toCExp (ELocation _ e) = toCExp e toCExp (EBuiltin (BEBool b)) = CBool b From aef855a893a402e62a348f8a0328cf2b8e869d2f Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Wed, 6 May 2020 13:04:58 +0200 Subject: [PATCH 28/50] Fix daml 1.0.1 bug --- .../src/DA/Daml/LF/Verify/Context.hs | 7 ++++++ .../src/DA/Daml/LF/Verify/Generate.hs | 23 +++++++++++++++++++ .../src/DA/Daml/LF/Verify/Solve.hs | 1 + 3 files changed, 31 insertions(+) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 4b622ae9e7e7..55168b060e14 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -249,6 +249,7 @@ expr2cid :: MonadEnv m ph -> m Cid expr2cid (EVar x) = return $ CidVar x expr2cid (ERecProj _ f (EVar x)) = return $ CidRec x f +expr2cid (EStructProj f (EVar x)) = return $ CidRec x f expr2cid _ = throwError ExpectCid -- TODO: Could we alternatively just declare the variables that occur in the updates and drop the skolems? @@ -745,6 +746,7 @@ recExpFields (EVar x) = do then return $ zip (head fss) (map (EVar . fieldName2VarName) $ head fss) else throwError $ UnboundVar x recExpFields (ERecCon _ fs) = return fs +recExpFields (EStructCon fs) = return fs recExpFields (ERecUpd _ f recExp fExp) = do fs <- recExpFields recExp unless (isJust $ find (\(n, _) -> n == f) fs) (throwError $ UnknownRecField f) @@ -754,6 +756,11 @@ recExpFields (ERecProj _ f e) = do case lookup f fields of Just e' -> recExpFields e' Nothing -> throwError $ UnknownRecField f +recExpFields (EStructProj f e) = do + fields <- recExpFields e + case lookup f fields of + Just e' -> recExpFields e' + Nothing -> throwError $ UnknownRecField f recExpFields _ = throwError ExpectRecord instance SubstTm BoolExpr where diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index b53bac18506a..24af3f6847a7 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -189,6 +189,7 @@ genExpr = \case EVar name -> genForVar name EVal w -> genForVal w ERecProj tc f e -> genForRecProj tc f e + EStructProj f e -> genForStructProj f e ELocation _ expr -> genExpr expr EUpdate (UCreate tem arg) -> genForCreate tem arg EUpdate (UExercise tem ch cid par arg) -> genForExercise tem ch cid par arg @@ -291,6 +292,28 @@ genForRecProj tc f body = do Just expr -> genExpr expr Nothing -> throwError $ UnknownRecField f +-- | Analyse a struct projection expression. +genForStructProj :: (GenPhase ph, MonadEnv m ph) + => FieldName + -- ^ The field which is projected. + -> Expr + -- ^ The record expression which is projected. + -> m (Output ph) +genForStructProj f body = do + bodyOut <- genExpr body + case _oExpr bodyOut of + -- TODO: I think we can reduce duplication a bit more here + EVar x -> do + skol <- lookupRec x f + if skol + then return $ updateOutExpr (EStructProj f (EVar x)) bodyOut + else error ("Impossible: expected skolem record: " ++ show x ++ "." ++ show f) + expr -> do + fs <- recExpFields expr + case lookup f fs of + Just expr -> genExpr expr + Nothing -> throwError $ UnknownRecField f + -- | Analyse a case expression. -- TODO: Atm only boolean cases are supported genForCase :: (GenPhase ph, MonadEnv m ph) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 311fff9f426c..aeb822481eda 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -72,6 +72,7 @@ instance ConstrExpr BoolExpr where instance ConstrExpr Expr where toCExp (EVar x) = CVar x toCExp (ERecProj _ f (EVar x)) = CVar $ recProj2Var x f + toCExp (EStructProj f (EVar x)) = CVar $ recProj2Var x f toCExp (ETmApp (ETmApp op e1) e2) = case op of (EBuiltin (BEEqual _)) -> CEq (toCExp e1) (toCExp e2) (EBuiltin BEAddInt64) -> CAdd (toCExp e1) (toCExp e2) From 6c86c22fe208e741cbb9d08ceadc5370d99e7a69 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Thu, 7 May 2020 09:33:43 +0200 Subject: [PATCH 29/50] Read arguments and support fields in different templates --- .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 20 +++++-------- .../src/DA/Daml/LF/Verify/Read.hs | 30 +++++++++++++++---- .../src/DA/Daml/LF/Verify/Solve.hs | 10 ++++--- 3 files changed, 38 insertions(+), 22 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index e996d85eef39..48bdf42eef03 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -6,6 +6,7 @@ -- | Static verification of DAML packages. module DA.Daml.LF.Verify ( main ) where +import Data.Text import Options.Applicative import DA.Daml.LF.Ast.Base @@ -15,22 +16,15 @@ import DA.Daml.LF.Verify.Read import DA.Daml.LF.Verify.Context import DA.Bazel.Runfiles --- TODO: temporarily hardcoded --- TODO: Allow for choice and field in different templates. -templName :: TypeConName -templName = TypeConName ["Iou"] - -choiceName :: ChoiceName -choiceName = ChoiceName "Iou_Merge" - -fieldName :: FieldName -fieldName = FieldName "content" - main :: IO () main = do Options{..} <- execParser optionsParserInfo + let choiceTmpl = TypeConName [pack optChoiceTmpl] + choiceName = ChoiceName (pack optChoiceName) + fieldTmpl = TypeConName [pack optFieldTmpl] + fieldName = FieldName (pack optFieldName) solver <- locateRunfiles "z3_nix/bin/z3" - pkgs <- readPackages optInputDars + pkgs <- readPackages [optInputDar] putStrLn "Start value gathering" case runEnv (genPackages pkgs) (emptyEnv :: Env 'ValueGathering) of Left err-> putStrLn "Value phase finished with error: " >> print err @@ -44,7 +38,7 @@ main = do putStrLn "Start choice solving" let env4 = solveChoiceReferences env3 putStrLn "Start constraint solving phase" - let cset = constructConstr env4 templName choiceName fieldName + let cset = constructConstr env4 choiceTmpl choiceName fieldTmpl fieldName putStr "Create: " >> print (_cCres cset) putStr "Archive: " >> print (_cArcs cset) solveConstr solver cset diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Read.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Read.hs index 12c3eeed556c..9d3cf2a68bb1 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Read.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Read.hs @@ -24,15 +24,35 @@ import Options.Applicative import DA.Daml.LF.Ast data Options = Options - { optInputDars :: [FilePath] + { optInputDar :: FilePath + , optChoiceTmpl :: String + , optChoiceName :: String + , optFieldTmpl :: String + , optFieldName :: String } optionsParser :: Parser Options optionsParser = Options - <$> some ( argument str - ( metavar "DAR-FILES" - <> help "DAR files to analyse" - ) ) + <$> argument str + ( metavar "DAR-FILE" + <> help "DAR file to analyse" + ) + <*> argument str + ( metavar "CHOICE-TEMPLATE" + <> help "Template of the choice to analyse" + ) + <*> argument str + ( metavar "CHOICE-NAME" + <> help "Name of the choice to analyse" + ) + <*> argument str + ( metavar "FIELD-TEMPLATE" + <> help "Template of the field to verify" + ) + <*> argument str + ( metavar "FIELD-NAME" + <> help "Name of the field to verify" + ) optionsParserInfo :: ParserInfo Options optionsParserInfo = info (optionsParser <**> helper) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index aeb822481eda..a08d03090381 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -168,19 +168,21 @@ filterCondUpd tem f (Conditional b x (Just y)) = constructConstr :: Env 'Solving -- ^ The generator environment to convert. -> TypeConName - -- ^ The template name to be verified. + -- ^ The template name of the choice to be verified. -> ChoiceName -- ^ The choice name to be verified. + -> TypeConName + -- ^ The template name of the field to be verified. -> FieldName -- ^ The field name to be verified. -> ConstraintSet -constructConstr env tem ch f = - case lookupChoInHMap (_envschs env) tem ch of +constructConstr env chtem ch ftem f = + case lookupChoInHMap (_envschs env) chtem ch of Just (self, this, arg, updSubst) -> let upds = _ussUpdate $ updSubst (EVar self) (EVar this) (EVar arg) vars = concatMap skol2var (_envsskol env) (cres, arcs) = foldl - (\(cs,as) upd -> let (cs',as') = filterCondUpd tem f upd in (cs ++ cs',as ++ as')) + (\(cs,as) upd -> let (cs',as') = filterCondUpd ftem f upd in (cs ++ cs',as ++ as')) ([],[]) upds in ConstraintSet vars cres arcs Nothing -> error "Choice not found" From 1c21ff2782fbfda6e5952ff3bdfca59a6e0c3ffe Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Thu, 7 May 2020 17:00:19 +0200 Subject: [PATCH 30/50] Proper verify output for testing, generate counter example, proper var filtering --- .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 32 ++++++++- .../src/DA/Daml/LF/Verify/Solve.hs | 68 +++++++++++++++---- 2 files changed, 85 insertions(+), 15 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index 48bdf42eef03..e350c2b7eefa 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -4,7 +4,10 @@ {-# LANGUAGE DataKinds #-} -- | Static verification of DAML packages. -module DA.Daml.LF.Verify ( main ) where +module DA.Daml.LF.Verify + ( main + , verify + ) where import Data.Text import Options.Applicative @@ -25,15 +28,38 @@ main = do fieldName = FieldName (pack optFieldName) solver <- locateRunfiles "z3_nix/bin/z3" pkgs <- readPackages [optInputDar] + verify pkgs solver choiceTmpl choiceName fieldTmpl fieldName >>= print + +-- | Execute the full verification pipeline. +verify :: [(PackageId, (Package, Maybe PackageName))] + -- ^ The packages to load. + -> FilePath + -- ^ The solver to use. + -> TypeConName + -- ^ The template in which the given choice is defined. + -> ChoiceName + -- ^ The choice to be verified. + -> TypeConName + -- ^ The template in which the given field is defined. + -> FieldName + -- ^ The field to be verified. + -> IO Result +verify pkgs solver choiceTmpl choiceName fieldTmpl fieldName = do putStrLn "Start value gathering" case runEnv (genPackages pkgs) (emptyEnv :: Env 'ValueGathering) of - Left err-> putStrLn "Value phase finished with error: " >> print err + Left err-> do + putStrLn "Value phase finished with error: " + print err + return Unknown Right env1 -> do putStrLn "Start value solving" let env2 = solveValueReferences env1 putStrLn "Start choice gathering" case runEnv (genPackages pkgs) env2 of - Left err -> putStrLn "Choice phase finished with error: " >> print err + Left err -> do + putStrLn "Choice phase finished with error: " + print err + return Unknown Right env3 -> do putStrLn "Start choice solving" let env4 = solveChoiceReferences env3 diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index a08d03090381..37f4bd18c8fa 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -8,12 +8,12 @@ module DA.Daml.LF.Verify.Solve ( constructConstr , solveConstr , ConstraintSet(..) + , Result(..) ) where import Data.Bifunctor import Data.Maybe (fromJust, maybeToList) -import Data.List (lookup) -import Data.Set (toList, fromList) +import Data.List (lookup, union, intersect) import qualified Data.Text as T import qualified SimpleSMT as S @@ -96,6 +96,23 @@ instance ConstrExpr a => ConstrExpr (Cond a) where toCExp (Conditional b x Nothing) = CWhen (toCExp b) (toCExp x) toCExp (Conditional b x (Just y)) = CIf (toCExp b) (toCExp x) (toCExp y) +-- | Gather all free variables in a constraint expression. +gatherFreeVars :: ConstraintExpr + -- ^ The constraint expression to traverse. + -> [ExprVarName] +gatherFreeVars (CBool _) = [] +gatherFreeVars (CInt _) = [] +gatherFreeVars (CReal _) = [] +gatherFreeVars (CVar x) = [x] +gatherFreeVars (CAdd e1 e2) = gatherFreeVars e1 `union` gatherFreeVars e2 +gatherFreeVars (CSub e1 e2) = gatherFreeVars e1 `union` gatherFreeVars e2 +gatherFreeVars (CEq e1 e2) = gatherFreeVars e1 `union` gatherFreeVars e2 +gatherFreeVars (CAnd e1 e2) = gatherFreeVars e1 `union` gatherFreeVars e2 +gatherFreeVars (CNot e) = gatherFreeVars e +gatherFreeVars (CIf e1 e2 e3) = gatherFreeVars e1 `union` + gatherFreeVars e2 `union` gatherFreeVars e3 +gatherFreeVars (CWhen e1 e2) = gatherFreeVars e1 `union` gatherFreeVars e2 + -- | Gather the variable names bound within a skolem variable. skol2var :: Skolem -- ^ The skolem variable to handle. @@ -161,10 +178,19 @@ filterCondUpd tem f (Conditional b x (Just y)) = in ( map (CWhen cb) cxcre ++ map (CWhen (CNot cb)) cycre , map (CWhen cb) cxarc ++ map (CWhen (CNot cb)) cyarc ) +-- | Filter the given set of skolems, to only include those that occur in the +-- given constraint expressions. Remove duplicates in the process. +filterVars :: [ExprVarName] + -- ^ The list of skolems to filter. + -> [ConstraintExpr] + -- ^ The constraint expressions in which the skolems should occur. + -> [ExprVarName] +filterVars vars cexprs = + let freevars = foldl (\fv e -> fv `union` gatherFreeVars e) [] cexprs + in freevars `intersect` vars + -- | Constructs a constraint set from the generator environment, together with -- the template name, the choice and field to be verified. --- TODO: The choice and field don't actually need to be in the same template. --- Take two templates as arguments. constructConstr :: Env 'Solving -- ^ The generator environment to convert. -> TypeConName @@ -241,6 +267,24 @@ declareVars s xs = zip xs <$> mapM (\x -> S.declare s (var2str x) S.tReal) xs var2str :: ExprVarName -> String var2str (ExprVarName x) = T.unpack x +-- | Data type denoting the outcome of the solver. +data Result + = Success + -- ^ The total field amount remains preserved. + | Fail [(S.SExpr, S.Value)] + -- ^ The total field amound does not remain the same. A counter example is + -- provided. + | Unknown + -- ^ The result is inconclusive. + +instance Show Result where + show Success = "Success!" + show (Fail cs) = "Fail. Counter example:" ++ foldl (flip step) "" cs + where + step :: (S.SExpr, S.Value) -> String -> String + step (var, val) str = ("\n" ++) $ S.ppSExpr var $ (" = " ++) $ S.ppSExpr (S.value val) str + show Unknown = "Inconclusive." + -- | Solve a give constraint set. Prints 'unsat' when the constraint set is -- valid. It asserts that the set of created and archived contracts are not -- equal. @@ -248,17 +292,17 @@ solveConstr :: FilePath -- ^ The path to the constraint solver. -> ConstraintSet -- ^ The constraint set to solve. - -> IO () + -> IO Result solveConstr spath ConstraintSet{..} = do log <- S.newLogger 1 sol <- S.newSolver spath ["-in"] (Just log) - vars <- declareVars sol $ filterDups _cVars + vars <- declareVars sol $ filterVars _cVars (_cCres ++ _cArcs) cre <- foldl S.add (S.real 0) <$> mapM (cexp2sexp vars) _cCres arc <- foldl S.add (S.real 0) <$> mapM (cexp2sexp vars) _cArcs S.assert sol (S.not (cre `S.eq` arc)) - S.check sol >>= print - where - -- TODO: Filter vars beforehand - -- TODO: Where does this "_" come from? - filterDups :: [ExprVarName] -> [ExprVarName] - filterDups = filter (\(ExprVarName x) -> x /= "_") . toList . fromList + S.check sol >>= \case + S.Sat -> do + counter <- S.getExprs sol $ map snd vars + return $ Fail counter + S.Unsat -> return Success + S.Unknown -> return Unknown From a33365cb7621aff9ee6e795304a3a56c9b8189ac Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Fri, 8 May 2020 16:07:44 +0200 Subject: [PATCH 31/50] Working testing framework, with some basic test cases --- compiler/daml-lf-verify/BUILD.bazel | 68 +++++++++++- compiler/daml-lf-verify/data/conditionals.dar | Bin 0 -> 261817 bytes compiler/daml-lf-verify/data/quickstart.dar | Bin 0 -> 342780 bytes .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 35 ++++--- .../src/DA/Daml/LF/Verify/Generate.hs | 6 +- .../src/DA/Daml/LF/Verify/Solve.hs | 1 + .../tests/DA/Daml/LF/Verify/Tests.hs | 97 ++++++++++++++++++ 7 files changed, 188 insertions(+), 19 deletions(-) create mode 100644 compiler/daml-lf-verify/data/conditionals.dar create mode 100644 compiler/daml-lf-verify/data/quickstart.dar create mode 100644 compiler/daml-lf-verify/tests/DA/Daml/LF/Verify/Tests.hs diff --git a/compiler/daml-lf-verify/BUILD.bazel b/compiler/daml-lf-verify/BUILD.bazel index dd0772cc5b83..e6ca87ab0971 100644 --- a/compiler/daml-lf-verify/BUILD.bazel +++ b/compiler/daml-lf-verify/BUILD.bazel @@ -1,7 +1,7 @@ # Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. # SPDX-License-Identifier: Apache-2.0 -load("//bazel_tools:haskell.bzl", "da_haskell_binary") +load("//bazel_tools:haskell.bzl", "da_haskell_binary", "da_haskell_library", "da_haskell_test") da_haskell_binary( name = "daml-lf-verify", @@ -45,3 +45,69 @@ da_haskell_binary( "//libs-haskell/da-hs-base", ], ) + +da_haskell_library( + name = "daml-lf-verify-lib", + srcs = glob(["src/**/*.hs"]), + data = [ + "@z3_nix//:bin/z3", + ], + hackage_deps = [ + "aeson", + "base", + "bytestring", + "containers", + "deepseq", + "Decimal", + "extra", + "filepath", + "ghc-lib-parser", + "hashable", + "lens", + "mtl", + "optparse-applicative", + "recursion-schemes", + "safe", + "scientific", + "simple-smt", + "template-haskell", + "text", + "time", + "unordered-containers", + "zip-archive", + ], + src_strip_prefix = "src", + visibility = ["//visibility:public"], + deps = [ + "//compiler/daml-lf-ast", + "//compiler/daml-lf-proto", + "//compiler/daml-lf-reader", + "//compiler/daml-lf-tools", + "//libs-haskell/bazel-runfiles", + "//libs-haskell/da-hs-base", + ], +) + +da_haskell_test( + name = "verify-tests", + srcs = glob(["tests/**/*.hs"]), + data = glob(["data/*.dar"]), + hackage_deps = [ + "base", + "containers", + "filepath", + "tasty", + "tasty-hunit", + ], + main_function = "DA.Daml.LF.Verify.Tests.mainTest", + src_strip_prefix = "tests", + visibility = ["//visibility:public"], + deps = [ + ":daml-lf-verify-lib", + "//compiler/daml-lf-ast", + "//libs-haskell/bazel-runfiles", + "//libs-haskell/da-hs-base", + "//libs-haskell/test-utils", + ], +) + diff --git a/compiler/daml-lf-verify/data/conditionals.dar b/compiler/daml-lf-verify/data/conditionals.dar new file mode 100644 index 0000000000000000000000000000000000000000..0f2a0fb7a8f19ea46578b85ebbeab652655b8de6 GIT binary patch literal 261817 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 z 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 z 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�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 literal 0 HcmV?d00001 diff --git a/compiler/daml-lf-verify/data/quickstart.dar b/compiler/daml-lf-verify/data/quickstart.dar new file mode 100644 index 0000000000000000000000000000000000000000..40e4b9674c768899b370412a66b38b51f5c74180 GIT binary patch literal 342780 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

cEGit$xJYI!sw2-|(W1*>=t0eH(STS~m5knQ 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
  • !(cW z&ye<)#SsB8A9R!Yrx}(X=#vqKTnZzXF`WM?v>;KL0(V0EC)JyOAZT4>xwYLZe7nkW zdskUuw9pk9?8hqo6-4^WHGn-rawmB6l~yi3BU~&Jl=*^(^jE@kq%9gGczN@cp5A<= zr#D~8bTyM#rt!F6iiTEyW^DCm8T1D?$2j!IO~;;p&-UlBbtXP7O;aj=g^%lVE#RvLZ#XIfv6 znHv+dW(bb^?d>}B2l$L26Rv-KI`tW5&giU3nq>4)G2FquX zA$Z0wSoo=*Qy;@N0Bo(KAuef560o!E#hK!)qbPR>uPqPmE++m9Zijd|_76xHObjkB z@+8)0jYu`BRa{K&IH3==o51Tu>X=L%!;tR>rXthBw)EuYbVxo-s$7|_EK3(_Vaw91 zU2Cj%t-V@{jje@Xa5BwQBAuX#b=s=mp{uq`?wp z^+Ir5U^tD_4j|j9kQq`x0PGpc??x#W3Tyg<#Ky(rcpYGvbp4LZky6yCl*W zDu@q?rQqnDO{dpu!0B=agy&kd$oNar$}^xm3|&Ak%T!?t(KXUyK7RpEPtWW_t!&pt z$3Lf^GCCqWx9W(Z)%v12NTl+T%X=XnlsX0ldKH`i`#Rs)QYy#NLTOf2fX- zr6L4tQYZKnjKRx5ll1*s5hyFC^4MG}ypl3f*Um?IcvS&JtJA0qWmVKBozFf1+~2T4 zr^iq5;zQuA$UWd2G7R^C>mg)=F@$W$U_VwDvLVC#K)yPp%Nq&RA2{VZ&Jvt98Yyqg zpg$JJfy?L7#jfs1?unw;=YL4UQx@)e+R7M)>#K#8&Rl*6j)s-%FjNyF!5(k|x(ABN zeNi=rBx$d%fLEnK@kXKxQ7lc~q^szoEn`^mnE{9`ujS}^Y64LgPQc9)FnR6PEp~q^(Y-9<_ zU&w|Y1}8ok3}G-a1Zg<<4R$nm2-FKq!I5^GYUuc3ONJr4O=SRA2MzaYWmO1?7Ou)Q zQK%2l4GeZP1a?pkL2T%tA1cg@AK}HP;9jUlV+qLmPIN(b?dV~9n=x!}a~LgH`}MXA z^8?fMcB8J%Lxb(cI=1@`4KT!ebolwQ{7ST0eqX2ljiJthHcr#A+$%Xb0Gv34)Cs&* z7bfz}7)p7JQqz`pQ+MLqwISOpxNE)wTgOGIomS)3YK{LAtK?O-<};w!rfQogjqz0C zq{yCYFgo=xooo7{GOS^09F7>9s&UZ-gI=o-6JM5J#?#Iv#l=_TNrLo3?0HBF&vuOO z$S~aSX545}PHsU`z-Q3ZSbA67k-^?r6~80H{IIxKasgy<-^r@mMXGzhm@>8)p4!Yu zj&<(Luv}ugD}$Cx$7quGx8%2@GfaIB@D`+gX$~-U7EuNmq2YxT>z_j zW8JkA^LX`mhsoS03VtNpYgEdqRKDlLew@;q6Kl)6GYoxwr?Ic^bm;4KAk!$>OBz7Z z*jg&ejeQ_7$Tfb%=qlgaIf80j4}+uMt(_%(8xPdqj$TgAk{;A%WpC${f@1Le8emx! z-v)Rk6vIfmHj~qpSWZ`&XR2y9c!Y6=Dd0Y0GNc&Bsb$RY$61=e&gH#@eFhlPJmh4; z6xc^3?+(c<|FK`Yky#Y!=c$dRT1+BO_ zE^eW3fOrc(ro{`8c&9vBkXpuWfgJC|m0TNX;^MjX+Wphs4D&-rlxzokg7y(w|5jdi zcS;!MVd8sUkYB)daJxMsOcWSoZI;$NONDjQ@II7m#IkmsGS z)+*A{w4)IhmxyHR4`lxr*$JgLkwO(W7p)MIp9+}tK|*@Apv)A+O0sAmf6z$&ASG{! z!MOMr+T%wfND@>o{~P)dyA+PXIb9L%)<)=cJe$rgbfSqt==bCi2vUlbO5EWp7z|rS zOF))Gpv&9(X+;K$4JSbxOlXJVL(;|9k5E)!hTJ1yA*Zh-%qRr(F7^h`)O9dZ@V*D$U!-XHi)1}isrZCpNup1}PO zL2jIi`6EKET^mEU4zaHNgP(8#=%658g9o*rr_st-znlcS=O>|PwxwTAg3b-) zxWkBDIA0&}jfM4Xdg7y!kcg;S0&Zz=_7WJpuMRE)_*IG4NWGlOJoKWx6Gux?Z_+T! z0A__meHR1zni!Czr$~wbLfJxurK0Cjssx3V4fFEJF!`ITE=gf`G?eR$26AS}C$%I- z#X#I8nE&}E!;tf+IJ^=K{$~n^7?&(w6es$-Ctd37B3vuOfrIwht` zKxgVoKrL@@M!2kkN-hxbZs`h>*4%hPyue_XnJjP#ECBY$z}k{Fc7P&E<vwkNZjJmUyhrtg(0LF)~3(G zO7dBxk=x4V6EYWnL_^5}lnRMf_OLLGH`QEHLx})NIpad{SuozS>PqYS07vG| zz`ftmjQH<7w#li?CQta;5n= z7Ho1MGL=X(=qg)lPHxRbZ%mBgY$*U}zWgjRqUpg1-iv3+M$`+jIXuC_l*`yZs$;y5 zkp@+s){k6u_$}4p4H`}ia2h6RyM4C*R`Zq^xIO?kC`8#TMKvyKL@KT0L7=1td;OpKDj8L4 zlTmX%=ZB2=IHbL;3~%E*P+uf^h~jjH`QaH2zq*Pazh4ZDn+*#L+7jsL3{$!TOtBVF z#Fp>_4sty9(wq7G4eA$6+<-U^b+tF4nyK*GkB_Cv+xh5^8S&2aKw57O?i9rWPyE1% z|Hym6*&n7*M+%@8UpfStS*n!iL{hHl3g6Gk2RILkriWGshPA(RIM+`YH+^rn%7_Np3@mV+ry7o1EHqr?HFzQGi6Sp$_!A^MSh(ZF`!gTtL% zb+J>Ji#_A#V$axJ>>0a@J(FR6U@rEjATIVNYybVp)_;G}UF8OO;6IZZPYTL$_c8d-)-m|c*7@(x zwrz-*@Njwp_7IW_QM7b^cX~#|u2ulv;+i9D$B-gd`4TZ8-vJ zIHIayV>;~!*f!W2 zLUI$B`>%xV3PJhQ-Q0h*n)|O-bH`-bQR5!K$%D9P{wLZz zm6cU?ou~e4wj72~-Y`$aWtCJSFi$m1Mh8JGgbJM|qtkg4`H~t+98ek#)@!t0ks& z6HI6(4Wh$2c{oUREOHeshE_#Or+C9*(1LMd?o&LBQBni02Egj(ZUcpyq}E^*8US!3 zP#P6GVOosinZbYL*}U{->zrGS+=nxh-g-osoiC(%xJm9iSfOASWNi2hB3yYVIQvDsil7!eiT%Z+1hRn3DJ2(h(Q@(I-DewZEe$Zw zHq?SX=7Rp3tLaKV93A3v%BamvoIxVHR*Dr~1=mV>574bVm>zD^$W>6uDc4vB=osj# zzNjMOPtp*gfKU;_BpIJSqP?j`*mcmvY)4IClsbUY(5Q(+uwVjo)DH4Ic6!ffDry2M zy47o%=PP*QG!Ij}9w^=dI;K4dn;0%hj~^9qPnsdnp48E=Cv~*lEU)X}pibqt#y zzT}hJU?Hv(seCoBtmIvLQYTwa>SXIlm{140I((dyPjJzj6Q?~juL;W;!pchRCv`j1Y=W zZkt+PC$rl=0l^jH#NC~4C(SBPfQLSzt_WZu>lEsfT7yw&2EaENj16nyIJoVB#l#Ph zJWG(qqSz?-UfC^7zs+@L|MUo((gu^&T{T5pn1)Vxz~GL%GB6PQU?SvLKP_t%X<)KX zj9yu)=!mWZVIp6oCAY#FR8PiTFZNGw!shHWWoDXqEgm}RjP^7#+RKH}o`lifa46<9 zM~f^&PK>*qu2@avgE{#~pD-xt3w^+e>e~BJZ!ig(I0?s~I38gKXjgO4)O8we8Ne;q z^y&bpl%Z2_Z4@ZA57MZV2P&2OqIZ~*8=GHM@M|mkmKf1FtEkcp##tZA8FdWUuCe_U zj}H*UM)GWyv#4*_kh4ff$Hmsq{J3ZhpIoKpNF+!Ld1W4Nnatr=<7qsYfqgs|y*hs& zJ?(xY?ntyHGq{`_c?K6P)fd$iO~_iO=ogMyzU$++pKBwUrBu^1ff7`c_=pqB=asXr zE|}1-GvlOM`&y*o%cRcv$e4|r?PW6|nI3M_2$TZ?741W$eug1ZKdsBmgo)ftGLfT0 zq#Lz2l?X3&9fFj=XqMEVYXEdj!@hc~Caj52{17i*ClBSNYhsPCiu)54lf)1}1Q%FW zz50jE4+HpQUoejW1h*rvwBsQsI5B8k`aS(-H2V}`h`KdQHz)h+L?>pTmDZ-r2cU}my;>a#~OEts$)4up`->ZslcjBc^wbi>86GS zKm{{?1>4jxKvU2Ha2g9#_pWVfSO8jHpt^v1qPYt83cJ98;fP*XQH59Qy$+93n`jJ` z28JT+%!gj@d}!=^)t4L2d<-yH@&Gn4z(Su3AN^Ky;%)L^Ub-pP9P4Tj(UtYfE-of6 z!RiGDh0PDgQSxgTT?{64_9A5$vML9^V|QgQ<>aMYw0dGT5?kcmXxY+Yt!r@D{NV83 zFiuGF8UoMe*wu2CrIBS<(M^d6n^z372FC=UWwyb{wid1rYpFd%jFf=2F&hkxWNd9 z+uRv``wmMG^*W)m66ioBaHqNnQZfU`a5?CWT3I<2$;toB6&Qt*8gwNU+8|2YvK8Qe zeum|pnQVFI-LTK{&bwjT@(wPtF7MzXvb@uaOLm9loe_j?YfkyqeR*euZQ?V+Hu1rP z=2P8_;^a|y5T2NbY!PUlU`DxxUI7ck9gI^y(a?2?VT5^Ni&3ryl(;%uxKS%?KmYf)82`E)rh2zsfZ6lf5Mmwu*w42&S zhs_V$xa4L~+ZaM;C8sRo#LMMI23lhnEq2OnJtwaR@eTFX+L*A%gQ4;3L2K(BwT1!N zwwv`JXtmlg=-jKl!Az{G!+x9*JOh?A;3_IG92+q6T|?!_iEpYjBC2q_u$b6Pp3icX zj|&@em0RP)xUf^vkYdS!aE@s_LG4;h=~N8sNwmRY063upm2ctX?Oe2Z{_b=VKpZyC zV(7)`YEXDT9RD~ye|kEZ0pE;4sl(X{vf2vq)4}1)7Z{n68gvyEx)8k|mJX(|!TXnK z3CSa3J zTqicntMAz8&v}Q+7HE~>X~hTO$Rb{=v%IRB#3bHJ(>-Qt3Kb7ocQt*8MI>f9r; zO;=YfD7`U(T}{ipTh3iwE_Gf9)N@s(9YD%n2c>KRssgF2!M%M8g!SoZ;meb?Kq1PqaECro95h&_^Fz|Ba5s!ZCv6p0Vy-RByC&!bg0n5&98#OFl<1C})4 z8Y-|QKJNrS1N=I*igp@ejK$)ELgL->a9(N^Yl+QyYS@qgOE=}IVV6U0Q|%!e7kw-w zr^6PBX@uH%K^Y@xA)8Q~7Ir+>hKtY86}9g<`3!DCexduhHVnNQ_W3NQwt1S%$ySlt zB0N^?04Ll|ie4I-7B)ZJr_m`dpN7ES+)WA7G$ml*s{pu)VaLj8m_?sf#{wDB`&?f% zhBLEGS51C^)t4W*Xi2YA7ZxVzBJ4>qvJPofN)uV(c&t+{2b3$MLb(s6>>}$YaKQLp zj7|^7Y3_?N&`hYSuAs=vt{DqZS*VpubkY5kH+&?2(Ffip+69? zWsadIvVH^01f;g8w;(_0QZ=7;+=I#skQ@rX^T^VI>6Fr-b5v-OgFixZ zX|vQ-@U{c5-rqzUhbzVfLj32D_>{buB|VuFc1(JLi}fT0_`x^n$(*qHp;IW?9=iEl zLjR1QoEES#&kGwWnQN?Mu0tiC(C)qw$(!LIBMxcT~=^^VnU%mhKoTq!;wP3HX7+TfkAfXHLx7Q_gT(?Z&M|HjW~_WG$Vr!2aqKv+U9gN zq}l{0B{#u&_1fSH=V={z6P%*kq~h5M8#Pw1B%-YAns;EXHVfJenWHwV z$42L|kcLfYBb-8;QXE_VQfB=NovnYN(J&VVu>OT%^TWJi$=R@CvWU>1SWNk#nAQ3h z87o<2uf+OU1A`o-i!1Zg>$*y|MVr#$gm5)^aagJpiDJNVQpEnHc2St7x!z4RzW`1r zFMz9jKDVzSeN${d7u~6H0B!Zfo6XeJaSySl)9}>2kq9^9sN&t>)9t z)e6f%VI_xE&CML+O{Wl5fq^UW49H?xFj=gj5qA;DViBaOo5zWD^J<%IYq8)%hI~hf z;*RDChas-^?}4MheN_+V!sQx?i9 zr9>tQC>5bkmelyHpbD-KEe?yHAuRgk!9+h?zo|`to6jmhdeKIC4a}mS#Ei$Am^m>% zq_HfgQ7;A5OWV^9S#5hUNNKTpUIbgue-i(va$^Y!-fYkZL;Xu2O5ko9_7HDL%Y}J` zXgPCO^VC}&)8j`W?aK<5_GM+*C+*8h`*-t|Ve>;*l4tS}+VC$0h%z`MTLc67Y`7ErZe$k1C;)Rf=Yb8t5wVG|o`aJBDrVB$_ z({z0vW^b(W_&jWWI8-co0G#z2R^3`s-P&TxYL7HsYr>W^U2DU%T#LlCD}F^0h0w!*D})$;9)4Q+4U&=}+yvtC`g<2h{;Rd#};aW~6DrR{-#> ziBT!0>(XhZE{0vax%Rq=)eZ@}mI{7E`|EVd6FPV*_AaLkwWaJ@V+_@6!l|e1GD{p= zj%&&;4bnYjmrm?e`k5R2sA_0W(xhEAwHFe+xI7V|*|;R_MJe?KgasYAETLitzEXVw z&cCiEvkD-ys;)hJ4ej9;eyYP-YAy8WI5z=RE=wyYYMNmVLuUdMoI^LAiP$c zhEeK`RqF9)MNa~CV6R?GL%IQwnv;|*jhKX%!+qOO4&p2g`||V`H^GaW^=TOP3CqE+ zf69vq`7=R!Aa);iIqQkbX&Jf2G!R{HG`#f=15xV+g!ODOhJ9PzVEndf8G&vvQs3Y| z0^I<+Na#X3l6OKr(Gw`>RWEdOw-Zbfqn33a-EGiDcROJyxKmBCv5Ql)O48B_r1qo- zi3c^{ss#9E*T7|}uns`S)nS)jSRV=-8g`M8_7{ueS=cS|DnYt2b^{jnCL-(xk+@5o z+GO7{vWaPoh2_lw!t!P zx5ncy!n9mkM6GrolJ|k>O+o5N-)%m=opGWUVOnt_#C7E>LBbFBSXT^*^qFD-;i*JeF(H8Y<^(2w=;n4?bK{< zEt1#5=-t8g77GlP+TL0iVyn=u`5w)-M~D}Xe}#1g_deE))qo7Dgh6Y2c7@Fk<56-9 zv}ZQ~AB2?t))hJYsx>u>ZoJ$bmgHU~OLBKqx-8z3aNQl2<7*4=e_c{S8HHDXkb6mz_8L(c23oAq6RfYv7TvkP`S5F9yWzz=~aEQak_C7PV{m#a=KWu&&%_T>I z8V(R}lJwQA2K?$5YHWjH<0n?bH^^pfLqQEggIL=EO&LQ$8AFLOre;V3nKF8y{I19$ zDKy6XC)UBsG&eS=U+cpub^?C@?C*eCtwyk!C@d{#dky%ePZ)jo{^x ze6)K0N@VLaBl(;x^`%FrDbVzUp-ZXIJfz+uw6v)BXK#lt2LxL_mFh&2XcO_arYY|+prQmAp@{($lP zA=HHGHN7leOM6)cURKzF%8E=X+N<*FD^TPU&AFUw;(yiN)Kn?%K({ia>$O*PiIi%Y z<|nwkK9n~wctKp&5Xu_CtWMlS-NRwco#N)*0L{D6U^Q3=W58+-3gR2`EM7{+Ucp)} zWaG52h`Jw*B(Pqs2lEPD4(5FoHUn9`ZK3h~SNf6Cqpa4iNv%tHWf3nn#d@&TeAK1p zufrxF%hzU%b(}`d4|&|Bqh<2<%b~_QQP^H zmzVL;+w!MyWXqq)b}-yPj-}%0PMy>;@Lej-StMSsm6eCGs+L=eSa}675xuO63JV>( zw5$z0m%&GKTwYtvlraKs%VIgRmchqru$#b% zu=#-{S^hTcn`9Y-&?L)qd3i2`|2te|fMIEp<+;!!RA{#(%io5LNtOxiwD=at=e1U# z`Mgeree!vo3ft00owB$7RM`BmA0_ud>%Sx9Hz8%c`(YIfG>s09Ht_NWY)^?%$QVr7 zm_@JRyDaDkGdS`cPcdL7Aw`+Q~pQj^O zZ|sAo8hhAh8W&MRM$T>qea5{AwF!YcMcXB@;j`2b*Fg5@Jzk~p<`EN7oJv^_z7uB0 zL)AG;eh${u@dDL(_-IJj0;6Ka`)lyC5M4j}y5hgap)qWb608g=cj8zOU?zyp!LRuT zp1)6rDYhj#D))i#D);7$eCY+fBN@E>XDR9McMCNmyg>9sbmyZf&SRXx) zKi!dj?F=9JS>*cS1vAbIUIQND)>p3xWMmK$01u%s_P1I>3~tETHPD=wgM+Jtp@0U2WrtIN+1dDKv_CzGSD3rD2Cpl_CN2q1UtB0$%{UTL&cZ^ z5>ny`Q}KxW35VA2>)XZ%3YivO&-AqHjzGkrvCi(p zN+}Is2faa$@UmH693Reb#;XBcJcsvsw_l4+)`p@ z$A}wBdvp^thi^eqZij&;J@@wyk48mkmnt`hi6wat9A$jn8t|X)JxF0 z7(OP8vc+#PF>!_ypImD&Fln|9-BC9qVQ}4ki|K0^NwpN}?~1FM4e$v7-Xf#ICXTO; zo1&DT?+vZM)>5}4yP-W=nNBY%Xx~e9OAH)K<+m8~GEyiK-#|xa9Z;bX?Y+0uyt;Fw zYXZ=+o~o7+E^=dwJRKQ!x@LBA^4!KysSRiMG(f@oMPlc?vKx;s%+p(-;=HiTx%w5B zGSq%`-x$n;?MV-Jg#LOQJ`=86g%?^|Wj{E}wnIA0yS3~Rq`)3cyEr*Y!47V4k`gR` zgvhtv#BSKzd|-XB#5K1GKXWe>aM?^BZ-IR;t!#|tMv3ikKWnoh3wre25?yg%SF>_^ zl1FsIbt696;&t96P84LqO-+y%B}T`6wqHsKz0NzZ1+Jsvq6ds=_NW7Vw zRBl8qD~&SsvS4v_8pq9B+phYF>z9wR?jlt4yP?(a5kr)aJ{EHHTrmN}d4CtgLY`bz zV}3OFOQ0c>k9+D&o{$LoIJ#pmbUwIlbk_W9bB=gU34KYlE{E8aSNvzo_P?zdZxGTV z+QaB>+v;FFBw;l|qI<8*;OdlOg%5P$r%uxveWD=zzXVW$%+KGK!0Dkn5H(uo@=*G_ zmrdAe@zf&H&7!%#o0oS~zp#3OmLb6U47H?@ZdJ#|1J4dxxeegQjK@Z7HGpSVsrrI1 zu@aT5{kfgNU#v%KOoCjYZ%HMr$?ObED7x>&p#x=#Ea2y5^M0=o@BvEDGR6` zPrrc@vLt!!mxx0FEXG@jIIS0W4Vh}_t-&?PEod1cQBAd^>09b2uK*>RDfa_;P^DGN zFckhiH(KR4`UGdrP~i;yh+fJ`(;s2fI#}bshD4d-5VGWX_4tD#L))H0m&OBeK!!<; zR{gHfzc>(B4jwpO7zlhPA2tB4)+( zZU#fRj!nti1;!i^pCRMRFrO&G@ObD+kk%W%5>fC0cv_ZaQe&DcPZwb#4L3eB7+(Y( z_fC=&1x3^M>x%-7@6wI;%-3);A9Ei0hI^Wod72$967`GwfR7rN)>weXU>=*5xeKbV zjU6h>?MHeWWrZsh*TVILO2vV~^FgolV|zD4csHZlI{{Pb5i}&m`Kh*$Axbez#_u#X zyD3vGJTtKD={5dbq}Un9iMYDVd_X|uuvkqB zX1kV@I=s))U$CPO)LRS}LpRu%N2lFY@umDW`%NTzu! zR+yt3lu}C}p$VC6?Vu=KqUEsVK#Nboj(HIeU1&DL zq@*_Aq)M(@9eH&3L~QqZr0kx$8J0!$jP(-i(G_Zuvxh9%kzI9quX;ug30u;NiIfX* zvjx1Wk$S(HTA%`%Qie?$SF4YA!!l9XtX zq2_YZ+y2pAiVUUr1o9fzL~39c_Dr{3Bii*Z!)eE77{G|3SPnHKsBSRzC0Jzs;U@cResjn=IYbE%OG2SGP91P52pdGWkX-;6^TYFfrgpJPN za|;#>m^d&lx}mD$Gjwvn4Ky)|b5y@?QvfcqVgBZzQ1PT8t79A#K+0AXHH>Oem2FD4 zc~eN}g@*W}5&k&bA6U5k5AdnNmEzq!>+36ouhtP>P|XV2Rle`$G$2Qym7VgeKhlu>$QO32-40#!I#m?e zz2`X9iV9nti3KRkhjy*>Z%g)MONBgBxV3MjqQvG`{msqL3N@lDjrn9B* zm`ci%=H3vk>5Q|wLUk%_ouEUK`~Z%sNa@EVHxrH|yam1_`1a;<0+sCLJybjMZcijC6y{S6!;Ki&)N z{A=9-Ox!2V2I_d~60bj?cv<2V5s!Fg%n_G(X37zV*f;A)px3u6$Gke915UsJ#mryP zM)5lv`rB6d`!kKz8>Q%TdqQ+_gq`Tt_SH?$63xP*LpqWrJqx`dhV^ug=I(W|<}Nh} z<2Kx}Mfv@oF=wpKv8keA3)^J~n@_nTKQ>l_@TVKXN2m0s8=cjHm_%wjAc_x6@X4ax zMZ%Nku1q*{Y=*{)@>Y6TDb97DZwZuA_m}PI2Td68;}1h|h$ceeg=p37%4lZ9GMC1| zv2fIL**BfP-*d$`U9jJC`8S=R<0_EjYM*Fsv|rrN_n3{)87cL$WVU(sqU5vaRmfJ9 z2U%%*&82uJ`!O>l%7~7Z`9=8 zp{7m~i-qe3f5Dm{d6}O|qxxDVFJ#6~>&A|tpS%=GK=zU|RyLaBVokXUZ)#w7EA1m2 zJnNsI%4;;C1bD9&(zQOVRTy1ro7wGPn(tuJX+<{G`Y5){x@rAcyxh>Y+u<<(Y4}4u z2!zMxjzj3OFq#+dB$L3a=qv%tMvBJ?_uC!mM9a0X@#nqvC?RjjX373 zLoN~+D^$8VmA_Y_2X#d!2z4=f)!>GN9W)mDl(ay< zT~)tzC&89~9kC>F7o2?7dA;L1uEam+TwE8pSO_=K*@RnL4F1q7q6E{w>1kia z>&bsnCui8I+Kw1%*lCIZ&e&>cAZGZoX9(q4)aPB-Qp&3j8n{2xB62b@)z(R^!F}@KK0w;AZb?nqo zL)UeRq?=Y3TCGc}i8BkVclOmfEGc4g%jwW7N^{(ZznKikiUmA@GCb3n)X)g(T{& zI1&94xZ}&#pB$n!jOns0u?bV%q)dBe-dFztQBGZp>>u0>DiJ}PZCN^}%rr4dT#ha2 z)!IZb=}GX_F8JzrEDk!ic%~ziAd!~bt6OvV#YiDoT$`Um3EaNW;B6=&no4hETbGAO z+hD#>r1A`$R$U)z`SeGy9;PUv6*riY+9r(1mJ?nJZ=*lfA$06OJ_zDI_#>Wta-9g` z|Lr}=1Lw)9gjEur}9MtnOtcT5C6BO zR`(B2TGyZ2gO;IcLz>zSbDmoJEGO|6i(c`ucES68$xZ3(AvHhp`lSs?YZJMF)OQro zkIOR>hz23K6x6Jp|LuG;= z)N%`4T^iJK4;-Vcus$GOSA!Rk5-A^ws_0PeL8ETgWKhI+F&mRatHy&y3+P|PunnrW zbo6nvWZO9V?fB0P6B&EgbR}kK`TUOQlfEI)aU~C`&5IxY>bI{VR+wSoQnctr)CS#C zj6YN;-!?W=ejtt(>-LSC+<-gK{OF(jgn_ObX%@g@$@+&mbX#dAl-5 zw%YhN`-q$@4N7{;@qLpd-dAldhxTFWes~VA#v&J}dHh`N2p>%)_M{V>Xs}=q7w83n zl33BzHji5O<~ODn_SulkacdZ9RV@CosG#^wYLZ96`W%Yl*;{!rJhxM-x7H_94_R3| z6kEaZm~saWEJ|WU zpyb|UcjYd=+H_Lnk`cQD5#e7<$r*tPwF(ty9Fq|~zu3a?D3)29M-poHx8X@SW0kE| zLy&xfV2M8>2yamna#LdSR~5}KfR|T;s_Ma)NAQSZvg3%H;zd8|s6b_D2~-WofGOrN z+NpMd0=Ol7ooV)Elm{i@J#lhzrb`#MuQ`sie`a}{wLF8SK+l&Oj{P8733`H zEE<%A5X-=ZsL^^K9Tn85XlqJTd`@hL;*u$dkHy6v92IQZhey3-NTWMaHXG8FP6ev& z2D@>0$&81P(knY!4U2%izGERNdxBP;#F)DlL{2ANH9=|0{{3f)MCbCVoxomTDw!l} zDJiepQ1neEUE$8CHLw3DtbASY`gaI*_ah&AyW}bV6jKUMcDn1B*aYE@9j+YTatWL7 zlK=Qy^_WtAD+rk}`}p&e=Tv&MAj2n%18F?YG6Nc~DVxOzHwbJYS{o-PB!OA!pqy7} zJr4*J`gBfY;EOlkZ7ebS48h2MG;0JXCHzAaOT#a>py3NWXL*N6^gI_w$`?~ga)cjt z;x}P2V zdJh6A3#X)0m7g0gQbjbvp}cOzhj5TxiY#8vc4f`%7_@+$D7{-}7izD;{h4{r+*4VpXAaHJ=2uyXT#Czwlqg4~-?t4fM-d4?k8Lft za8zZ70=MDh!^Fn|^?wr$^YKM1RAh^8TkRpS4X^YWFdMB3Jt}o*UXM4uMt6~Xzq{Vw z^9i+&F7@B9{yH^Nbm|Uz5aD;?86FG4qYi?AMe=S3?6YiMdSI>TeBlXxP4FtX>-$XO z6hH`r4Br3+7|wD+MDlv(aez1H2wepT*`!4=e^V_0zm;J>D3YJlZsoDIo8u%1+}7CT zt)h_p@D9VG5`TaUkHyCbLZK4#f)3|6A)tEEuzl5Zd;SdQfDGp(fr$D~EDGG_NVjei zyF2dvqIiO$gO~&vmfYPXc?$vsulHmpm)S1)w=6k(ljr_`L*aWVd3)|3AcRtmMIrY3 zqYyC2uoqu|q4Stp`_D*jr6@QIs#+(W$$wTE{aCg2V-=7BkG|V$C-^J&v%p?}OBSaH zd?;9C{m-RWPH?E5j{@}=mRsk)C>BH8IqvP4aP#8Y1@WB%`L6!=uEc{yI`jk>y2T4H zF4HSS|Cn_hW(_Bl=f1b30|HP9)ZfFQlTP6Pz2wx^*JTg%&B=9zgY@VFr(M|mmn5HTrO02Kj-fj`dg1UOyGsLJy(PQU zn+y0V&*DHHHbQv--{Wt6Z~O^y)+psL-rBqvUwte;A~J7dagKL^HUlyuIbPFm8C<_0 zX#1;r>eLg|i?LGQ?H(*|_qA~3^O@s3Gx|;6q!aY$A>0Tx^dsT-YIPR1L@%OiGNXk) zh!cn91>=*UHQ9R?SMflO&T`)w+m77E%wG+RP&2lnrH$Nls}M}xIb#)TDO=%Qu7=msF?$HN1x8}gQgu%^+PCK>VT5V z7iKtpPg$}@S@0HSK>AHyCQGs_{ex8f9-0!P^S4Tz4{a<-C)N%`U zcBuwLvz2v>uFk0*rpgNdixCoNb|El7o8>s-u&++h1_w}6JkLS+wCXr(Hp{ME;fuMG zSFHWao8&lu`!F4%6w?9n=CS#6$bvKY#rQ2N^h|iXr$x}%S~;%&)H9=%SY$a9nnPhhr&mB?2r;<|e2UzZB=9hl44fkJ zXi$eN@2CSbSm|al>3==!Ig!h^ZUpGO6OM^K{yr?AiYW{(6nV(}?4lIkSkO`7cZk6M z`m3W7)IQ{YKQ7A3r@bDDoH=7g_2A3qiXEZXFR_`}CS8@FzQ$zXi2C$eTEujU4#5Em z_>h!1i!tO?plUS%OwY@Ons;(l8tD0;DD<6ok~xe+>rj0jm=$FS2E2zgK{RWH3}G9X zLbYNsn5nZXY6l00k-0Up9ByhaswlA!Y|f<)m2Q))gA>$G1qI7C<1WdlV48qM!b^|i zCdjA+7)!)5EJrW)HEuY$23sjOs!G8j2v6*yqJG8=!5SWPg{Dxt2)N>+-AYnLzUWO0 zhAi#i4tEqS$|VF*DPaFFLV(4IV#r;W>^fn5kpt!fzLDF>IqU`M_`Dm)bEWQ|942h#su0Ab z0-F?~`y)E_r}S5s1PzMm6}+jDK?CH(?92DxDHzcsRuXR|@fDo$QKuyr8^Gix7>>%Q z9F5y-7uEx)LT+I=Q-2C}S+cDyY817!?I+NFeVawK{;_W1&_+rn@-UIeh%t6whKhHDqY+OHsbxZ_1jb)0`Q$<$Tu7N@+Yx zIMTUDx$hgc;H;$o-!P)Cb;^ANL5<+uF`)%`q)$e|QJqY60L}61SYv-ozGjhyy}ouu z>9-HD=b<5UL7eJyqnI0iV^u@0P4XuW{j*c?dY@)dK%?ZRQ`gok4M;JlS35p7g9E=; z+o2pC+7-FeL|B#vJhm>olfdEuzvU)Ty*lXUUt# zR!zTpddF6Wfu(bfqsX=KDPc?J&{g@Cs4>&`>^aRv^o}=Fa_im;4hZ}M&k2kaR*C6I zQzAV81UqOEy4f;rNavOF8RG=YHWC2DqW1ci1Ji%RjE@Bdo@0Q6n)_h^C-^R|sG0uvulUXnkv`v*8&XVg- z<8ATLu7vN#Lz#7Pt25fhxM@=A9UCPA5*OdXh$77>$knsQ0*eXO7SOpG?tG91DW=lB zjuDNU9@`%!=Ty6FnKL>+NV#l(tvF<>88fdr@--#5q!Z+5Fq~fwwl_pZL4Rli@8z}V z!{bngeoJg)CXf}bhV7TM=B#fV^%1T6K8j#E~NzH~$bLw)Z*D>wCN6&iM*k zoSFXzPoP6XWQkQ4a}wPPD9SEd!iev0Vok7BvHe>BX6@Y~8Uase=2xUeXO6O9f#N?? z0_407p4Ye*7dtJKa=%{+b%S28+Lc74?uL50kKdjX!*hV$&eK8<9;dmJcc@NzJIl15 z(>qLpQu}gk?PwKIh{s-1HEPlI@(YAJ!{6{gIbkpp!0z2FLD&405_m8Ws$EGhmCgE+ z=)%UTyBT&!OK1TZX#>ew)iklkT#2Lhi&I7baBJI2SVh8WH0DY%zYc%K3_s!U7}=6F zKOfMYWDQDIseUgszLu|owL)6t4A)M+v9um0$W`jaE*ITz&xF~D=}HK*-X!eo=W3>4 zYQ_U@9>sRMKkZ)C7Sn3p--2@_gd&!8CLmAR$hA>W(r4U(HEzu>Z;MWpJav3L4v&5T zm&A`20gvpE%1!EwKJEr_aGFo8b(GfAKbASabU;K~eU!OyAjisMyoaYeoC0d)clO=p z(t_1eggrxTp%r^AhtVr`w;b;bHH=WSXku0{#_~ZUnbt7}_w_R>5Fzxvc{ zrB3l`BGv6?DDk>$c-@^1rhWbSrF8vx)~&7hRpNBny@cawHx4?chS|o=zrT@P$?0t7 zm8?B)^V!J&FLcMoOH$jo{^?n{Wp@KJe&`wO61)U&OPDTDy^_}@#8mv_L_&>+d23nFHCZP~k_j1pwKL%rU$kE}!HZ1wgII z*wm5>Z-|dD=gOr*D}Hd&ipNt@p$?R1S(@YVdb8iDP|`Uwtz{<{<$rb_l;dMe==As% zXTfc{e_j5HE9}h(-PiWe$XwMUu|k=e=~^bkjJ{tF9vsDMZH~CoX@E_Yx?YP&qE}FS zz$-_zTtazw{&6|Q{x*ciH3N%pP-ORA{OR-`W2+CI{*V}N!{2SNCdw;)G50+Jfo z^16FPwgOkU$z8lAKM^?hb*kqvJP)7qS=X{+o$_&WY(S8U-p1c+vm~BG;1T~$+`6go# ziQj4>3&?TOzSa|;^P=tR6zxtO_oV!6Qre)3>-hfjDFR6dV0lf<{|kgKVMNLafQq*Q zC~#o}EaVBK!ax<)&*jILS-D{iu@T%~eh(`>Y5NiL z2v#MNcyg4^QwdBA6kpF*kiSuD$E`@PP&RN7JBaqIVYp}dQPD&7MVjCJytCa&b9F{a z=i36h=HuvzWNZJe7ocUmWUQ)OrQk78prsEKvr1@&eAO-0q|!#|MvTfrd=ipxrMGRd z6?jwBJ;5lpI(LW)>e4ioY0Uu{b}JQGEAmeQ$gZh25%=|y&8IBmMPnBbQV)-3wG)huSKp;?yI>2)f(Supf;D#^$HQ~dF=K4G&h3XV<`$!gKCl!d}IouW;yZCB`XX}4?1 zXUoA356ni`e~_E4>Cbx^Gg{>Xyeim6+J^YVh# ziYX%eh}jAmtGkr4xKSrt(6hpFWl(v-`+3xR->-EL<`_<;(o28Aj6alZ#+rVj&!(i*pr_0FVyjSv?amFkEfPGd> z^*P&qPHjHvu~I&scIZ1!S)2R^!BZ%0)ws&p`B=g+Z`T zh;0N}ca)Nbd{SzFPn&{qy&uQ*ri#fNqDJ8{1=o7tGy}(ijU{%(aK#lrw3R)VQU22k zVbU@peE5MMFA)k`o7t$82)xF|_vQXoNc7uiXAi7C`+3#A?0m6@l1jEqW^2H_wzbu+ zyW8iC*SIS6BD!I5a`}WsaA>2Xe`G}XZDgb`@_Bu=OuEm?sBotCU_^}FhRfF48MMX5 z+M1ZePkOwM{bpi4YO9ZY4bGcF9KH+1vHm9Y{@Vco{VTjSBy}X^U)%I-K;m{!*2B}@ z(B!{t&N3tmY>$WPHT-hoV!d;br;v=my^}9f%RkBt>LvkZx5)~cT3K-55#Bt z2Omy)MXRu!^5exz)GJK8TVCMp)GLwhj)f3o2%`S_`Tmhny0w3t-30k_LG10B-+hh#pif0V?blgs`k?-eGv}5MN^& zt*uhq9qJGK=KyO2ls1R$jb|ms0D+C?%{DicTL7x64BNF&vD;>!5y7+WpErpiLeJ-=#{-~Fnd#hYNRNTJ{;=a_HK*qb$M};fA6letL~k_tJ4;m79O~VSLbHI#U~W7% z^u<=b@C-j|cy|wS;c}d`(?Jiy8;(*O5C&Z8ta;i>Xyzoh*D$ZVO%kZ1_LdC^9c5Za zZ5Ic$_rr*yr$oe=qf2sFPfgQSnjV;d!mF!?SmgYuqLMc$wuR}4dN{rtIAruna&m=V zkI{wYpnizp#>o{6zKQuoT)ezHo3QRJs1tg4Ej&+znu&P%l3l;U7523t_9^a(AsR{) zb)r86+{9RQaFgly>BSbLlo)l)f!Mp{4;qMjnDEX~3*kLL8O6y662x%K#-TU9tCW3^ z3};*A6S_YMz=V3xB|)4_fXEl|BUvW<^@3Jap?;%L7D%emr<;qqc9ejbDn&rlsk6Qt zldrd~uOFc`dn&zrzhlnZ`p5j7b0DfP{zF&-E7UNExB9qxEc2@6fMdfcF+Me{6*zHi z+nMeaP-^k8mz0As!UAI1@ozZ)6rbMWEpGY22P3RxR%iYJzxouC4ng+YS#rUzsRX~{ zZ^l;+M(IzrL5Vk@A9^v%4wT5IXUro`TNby(*aI;q_Mi3L`)}W7e#iVJUx~|I{&UGCwcZ~1m9w*?n*bv>x99)-O@}q$R8yT_>!gN{&lsT4^wV&@&L=X*`E}fTV?A- zw%oEKk-ibuqboj4YE;mRH=-QbMD`@+bMAB<3vK}R z;VbuVd0=f*3yif@Sm@4wmo(iZutDV}Y1%x0NkXto(e~8OV#|&WS^7w5pplOyP)Fh= z5iy1U13Bk5|JR|=0KShoSbO{pBtDiP9SP5+F!5MO@Q&A99p*=D{3`r-^+FK>#WMO6 z-@|zQ1;k0F(Tnqi^S=(na-c!hxI@c7@z|nRyWf-2N6{^Qk*hti2H$zie}3u%^Soe^ zQ3QdnpzLFr96%mQHJnV2F})pW^gAlYOR$Dz{ z1sRyr)OJ@-Z77*GTAxoFsC@YE`z2aGtrBCX z?-dfohQqV{-O=LXjCzr$;YqH7sP`iKjPY&YF}aV;~0_7ZX0Rr!HfQc$zx76 z$P4+lkt~QnN6)^rsXEgh_B`pzb(C#a;|ov`$p-5u%GeNEm#`$$!nbP@523%q4*{A= zc1b4zL!l(`d~wOQ-YlbgW9zi&uL;EkShAHK>L3BhQ$mknZ)+vyS7@#xHqiw3^n6zdKwQu);8MM3rC%>OiXU^UKK!Yw zJpxqMPZOk~w2Gf~^^;wDislQ{PC+p=igoGAo61z*{(>u?%IV=m9oAUPL!n~-D^_ao znb9te6Zygt(1a&`1Ql50YyEn*dYO-mPwHaYIoDI0dnvEcwFR|&c(bnH${AO@msQ!t3;861(A3$Np^@rlS^t1YA{Hi z-FzxG#HpWn%f6cVw-xzPH#c{QXB0C%HwmQx89{^J3v2Ln&kX<7a>vqw{Ue-7NKy)e zw|`1b(H%kn!Zp##H4r6xl%hmj9AL^&FXGa<>Zvs>)-$FH`$x(L(AhzFjp)BQ4F4(s zbU0%>1_?^w<|s@D<-a)x|Ed6Vh+sPw21?NCCeor|_a0w1*1b?7k*Hx?=Sa z>DB(XXL{7{HuQO6l1&)79kEfY`M~LtP4JS8@JB4@QN8|~R zMXQbeFKZ$B>fQB@wmVQgDYfg+-EQBuUQCbm2NJO|fup@OTDkNNc)>vWmtDW%QsPLw z(%IVKSX7YONtMCIMlr$GGdc);@MZB3e5*2`%5)bw*+UH{aK&K%54e{MTS@0nXV1wL zDYrcr?EkpWdSIJ*;uxt-+HkPjJiVZ0EFeB*bcL3sMlCKedjW(T76W+BlB>_3KfSl)D&oga@A%Vy{vP0)j`$`= zlug_Y?=E4_v1WDn^^^_R=q}Rac5Gg;+Asq|$zR2N{C1=VBgP+z_KxiYBp%>8b;Wqc zwgP4i#Ps|V-T`_$YDLzL{7Out%F9kXCNb3R%(oESH}@pA4~ck?o&WxVTd_0FKogvC zvMDb7Kxo3g{pimk{Q}E22Hplbd(L62)>0n9DO`2`UQ|D7Qc>pr4C*A%Iwnb;$HcU?ReYOu=2S62vMcj>J^ z%Ag@lTuN}O=Dx<0QptQ?|8iP944LqJ%A!SPd;4c=v3v~^?`Yu0o`fwp<-hbCYNzOP zu3P^LRtk_OSK?b}59^GiaNcNYZ80h*9CzjYNgasoH>-`l_u-;~1z#bLsnf~0(5odM zh6svNJ~xA>>&SnrwoMyZavS2n`_cgSULHEx{{TP#48ZsL9Tr8;H2??Y*=W{_j}mva zT>YI%+&oy#1C5GlB5W3m*=fhzg=>mWv>|+>r9z{4*K_r_MD5%4xsrU<%y0IUki%H+ zRr_ntBgKp@R=b3eyLgo9Fl<+&o%X%)qafdX%Dc3i z;Jyjcc*o8`{C&;qu;aekp3(_-4RBcpeE7#4%RrqwkgkEiPyUD(VGyf9e03=Bb>Mt; ziEwpc-umR&`iSp+at3uNa=myFvmp6htBDpq_eZnV$H&kS=m*V4jw) z7>PGVUE%Pd4lGYNRBcO&gp*xUlcU5GDeo^bsDRY^1);Zg>wJHNTik67)h$M zH2VFomIQ$)fYIzOa<8m!zn~?Q)SY9;AFSO(~lHp(@z5BEoPDMMvV_X_eiC7S1 zFw$_MlK>(jX$ZlFNH7!V%ACkw;7Ql2>gva5SLxufowNMTDHYFp-72R`=N0ndYGV0A zuw#2R0lXp^apSY(6^=PjOBlKFSja~T7{Cji78a_@t-+}QBD_Ikv-
  • %Dv;<1wp%r%)LiAJeBQp9x(Y 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 print + result <- verify optInputDar True choiceTmpl choiceName fieldTmpl fieldName + print result -- | Execute the full verification pipeline. -verify :: [(PackageId, (Package, Maybe PackageName))] - -- ^ The packages to load. - -> FilePath - -- ^ The solver to use. +verify :: FilePath + -- ^ The DAR file to load. + -> Bool + -- ^ Enable print outs. -> TypeConName -- ^ The template in which the given choice is defined. -> ChoiceName @@ -44,27 +47,29 @@ verify :: [(PackageId, (Package, Maybe PackageName))] -> FieldName -- ^ The field to be verified. -> IO Result -verify pkgs solver choiceTmpl choiceName fieldTmpl fieldName = do - putStrLn "Start value gathering" +verify dar verbose choiceTmpl choiceName fieldTmpl fieldName = do + pkgs <- readPackages [dar] + solver <- getSolver + when verbose $ putStrLn "Start value gathering" case runEnv (genPackages pkgs) (emptyEnv :: Env 'ValueGathering) of Left err-> do putStrLn "Value phase finished with error: " print err return Unknown Right env1 -> do - putStrLn "Start value solving" + when verbose $ putStrLn "Start value solving" let env2 = solveValueReferences env1 - putStrLn "Start choice gathering" + when verbose $ putStrLn "Start choice gathering" case runEnv (genPackages pkgs) env2 of Left err -> do putStrLn "Choice phase finished with error: " print err return Unknown Right env3 -> do - putStrLn "Start choice solving" + when verbose $ putStrLn "Start choice solving" let env4 = solveChoiceReferences env3 - putStrLn "Start constraint solving phase" + when verbose $ putStrLn "Start constraint solving phase" let cset = constructConstr env4 choiceTmpl choiceName fieldTmpl fieldName - putStr "Create: " >> print (_cCres cset) - putStr "Archive: " >> print (_cArcs cset) + when verbose $ putStr "Create: " >> print (_cCres cset) + when verbose $ putStr "Archive: " >> print (_cArcs cset) solveConstr solver cset diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index 24af3f6847a7..c4616ba6c61d 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -14,7 +14,6 @@ module DA.Daml.LF.Verify.Generate import Control.Monad.Error.Class (catchError, throwError) import Data.Maybe (listToMaybe) import qualified Data.NameMap as NM -import Debug.Trace import DA.Daml.LF.Ast hiding (lookupChoice) import DA.Daml.LF.Verify.Context @@ -377,9 +376,10 @@ genForExercise tem ch cid par arg = do cidOut <- genExpr cid arout <- genExpr arg updSubst <- lookupChoice tem ch - -- TODO: Temporary solution + -- TODO: Temporary solution. To be fixed urgently. this <- lookupCid (_oExpr cidOut) `catchError` - (\_ -> trace ("Not found: " ++ show (_oExpr cidOut)) $ return $ ExprVarName "this") + -- (\_ -> trace ("Not found: " ++ show (_oExpr cidOut)) $ return $ ExprVarName "this") + (\_ -> return $ ExprVarName "this") -- TODO: Should we further eval after subst? But how to eval an update set? let updSet = updSubst (_oExpr cidOut) (EVar this) (_oExpr arout) return (Output (EUpdate (UExercise tem ch (_oExpr cidOut) par (_oExpr arout))) updSet) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 37f4bd18c8fa..f7ef3906876e 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -276,6 +276,7 @@ data Result -- provided. | Unknown -- ^ The result is inconclusive. + deriving Eq instance Show Result where show Success = "Success!" diff --git a/compiler/daml-lf-verify/tests/DA/Daml/LF/Verify/Tests.hs b/compiler/daml-lf-verify/tests/DA/Daml/LF/Verify/Tests.hs new file mode 100644 index 000000000000..2b0b7d35c5d0 --- /dev/null +++ b/compiler/daml-lf-verify/tests/DA/Daml/LF/Verify/Tests.hs @@ -0,0 +1,97 @@ +-- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + +module DA.Daml.LF.Verify.Tests + ( mainTest + ) where + +import System.FilePath +import Test.Tasty +import Test.Tasty.HUnit + +import DA.Daml.LF.Ast.Base +import DA.Daml.LF.Verify +import DA.Daml.LF.Verify.Solve +import DA.Bazel.Runfiles + +-- TODO: Build the dar files from within bazel, instead of passing them in manually. + +mainTest :: IO () +mainTest = defaultMain $ testGroup "DA.Daml.LF.Verify" + [ quickstartTests + , conditionalTests + ] + +quickstartTests :: TestTree +quickstartTests = testGroup "Quickstart" + [ testCase "Iou_Split" $ do + quickstartDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/data/quickstart.dar") + let tmpl = TypeConName ["Iou"] + choice = ChoiceName "Iou_Split" + field = FieldName "amount" + result <- verify quickstartDar False tmpl choice tmpl field + assertEqual "Verification failed for Iou_Split - amount" + Success result + , testCase "Iou_Merge" $ do + quickstartDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/data/quickstart.dar") + let tmpl = TypeConName ["Iou"] + choice = ChoiceName "Iou_Merge" + field = FieldName "amount" + result <- verify quickstartDar False tmpl choice tmpl field + assertEqual "Verification failed for Iou_Merge - amount" + Success result + ] + +conditionalTests :: TestTree +conditionalTests = testGroup "Conditionals" + [ testCase "Success A" $ do + condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/data/conditionals.dar") + let tmpl = TypeConName ["Iou"] + choice = ChoiceName "SuccA" + field = FieldName "content" + result <- verify condDar False tmpl choice tmpl field + assertEqual "Verification failed for SuccA - content" + Success result + , testCase "Success B" $ do + condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/data/conditionals.dar") + let tmpl = TypeConName ["Iou"] + choice = ChoiceName "SuccB" + field = FieldName "content" + result <- verify condDar False tmpl choice tmpl field + assertEqual "Verification failed for SuccB - content" + Success result + , testCase "Success C" $ do + condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/data/conditionals.dar") + let tmpl = TypeConName ["Iou"] + choice = ChoiceName "SuccC" + field = FieldName "content" + result <- verify condDar False tmpl choice tmpl field + assertEqual "Verification failed for SuccC - content" + Success result + , testCase "Success D" $ do + condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/data/conditionals.dar") + let tmpl = TypeConName ["Iou"] + choice = ChoiceName "SuccD" + field = FieldName "content" + result <- verify condDar False tmpl choice tmpl field + assertEqual "Verification failed for SuccD - content" + Success result + , testCase "Fail A" $ do + condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/data/conditionals.dar") + let tmpl = TypeConName ["Iou"] + choice = ChoiceName "FailA" + field = FieldName "content" + verify condDar False tmpl choice tmpl field >>= \case + Success -> assertFailure "Verification wrongfully passed for FailA - content" + Unknown -> assertFailure "Verification inconclusive for FailA - content" + Fail _ -> return () + , testCase "Fail B" $ do + condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/data/conditionals.dar") + let tmpl = TypeConName ["Iou"] + choice = ChoiceName "FailB" + field = FieldName "content" + verify condDar False tmpl choice tmpl field >>= \case + Success -> assertFailure "Verification wrongfully passed for FailB - content" + Unknown -> assertFailure "Verification inconclusive for FailB - content" + Fail _ -> return () + ] From 64370c21ec7b9ead094d7fe1f1bd8d65f892f28e Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Tue, 12 May 2020 16:54:10 +0200 Subject: [PATCH 32/50] Testing: build daml instead of storing dar files --- compiler/daml-lf-verify/BUILD.bazel | 18 +- .../daml/conditionals/.dlint.yaml | 8 + .../daml/conditionals/.gitignore | 1 + .../daml/conditionals/daml.yaml | 17 + .../daml/conditionals/daml/Iou.daml | 61 +++ .../daml/conditionals/daml/Main.daml | 7 + .../daml/conditionals/daml/Setup.daml | 6 + .../daml/conditionals/frontend-config.js | 385 ++++++++++++++++++ .../daml-lf-verify/daml/conditionals/pom.xml | 117 ++++++ .../digitalasset/quickstart/iou/IouMain.java | 143 +++++++ .../src/main/resources/logback.xml | 17 + .../daml/quickstart/.dlint.yaml | 8 + .../daml-lf-verify/daml/quickstart/.gitignore | 1 + .../daml-lf-verify/daml/quickstart/daml.yaml | 15 + .../daml/quickstart/daml/Iou.daml | 86 ++++ .../daml/quickstart/daml/IouTrade.daml | 49 +++ .../daml/quickstart/daml/Main.daml | 40 ++ .../daml/quickstart/daml/Tests/Iou.daml | 148 +++++++ .../daml/quickstart/daml/Tests/Trade.daml | 76 ++++ .../daml/quickstart/frontend-config.js | 385 ++++++++++++++++++ .../daml-lf-verify/daml/quickstart/pom.xml | 117 ++++++ .../digitalasset/quickstart/iou/IouMain.java | 143 +++++++ .../quickstart/src/main/resources/logback.xml | 17 + compiler/daml-lf-verify/data/conditionals.dar | Bin 261817 -> 0 bytes compiler/daml-lf-verify/data/quickstart.dar | Bin 342780 -> 0 bytes .../tests/DA/Daml/LF/Verify/Tests.hs | 16 +- 26 files changed, 1872 insertions(+), 9 deletions(-) create mode 100644 compiler/daml-lf-verify/daml/conditionals/.dlint.yaml create mode 100644 compiler/daml-lf-verify/daml/conditionals/.gitignore create mode 100644 compiler/daml-lf-verify/daml/conditionals/daml.yaml create mode 100644 compiler/daml-lf-verify/daml/conditionals/daml/Iou.daml create mode 100644 compiler/daml-lf-verify/daml/conditionals/daml/Main.daml create mode 100644 compiler/daml-lf-verify/daml/conditionals/daml/Setup.daml create mode 100644 compiler/daml-lf-verify/daml/conditionals/frontend-config.js create mode 100644 compiler/daml-lf-verify/daml/conditionals/pom.xml create mode 100644 compiler/daml-lf-verify/daml/conditionals/src/main/java/com/digitalasset/quickstart/iou/IouMain.java create mode 100644 compiler/daml-lf-verify/daml/conditionals/src/main/resources/logback.xml create mode 100644 compiler/daml-lf-verify/daml/quickstart/.dlint.yaml create mode 100644 compiler/daml-lf-verify/daml/quickstart/.gitignore create mode 100644 compiler/daml-lf-verify/daml/quickstart/daml.yaml create mode 100644 compiler/daml-lf-verify/daml/quickstart/daml/Iou.daml create mode 100644 compiler/daml-lf-verify/daml/quickstart/daml/IouTrade.daml create mode 100644 compiler/daml-lf-verify/daml/quickstart/daml/Main.daml create mode 100644 compiler/daml-lf-verify/daml/quickstart/daml/Tests/Iou.daml create mode 100644 compiler/daml-lf-verify/daml/quickstart/daml/Tests/Trade.daml create mode 100644 compiler/daml-lf-verify/daml/quickstart/frontend-config.js create mode 100644 compiler/daml-lf-verify/daml/quickstart/pom.xml create mode 100644 compiler/daml-lf-verify/daml/quickstart/src/main/java/com/digitalasset/quickstart/iou/IouMain.java create mode 100644 compiler/daml-lf-verify/daml/quickstart/src/main/resources/logback.xml delete mode 100644 compiler/daml-lf-verify/data/conditionals.dar delete mode 100644 compiler/daml-lf-verify/data/quickstart.dar diff --git a/compiler/daml-lf-verify/BUILD.bazel b/compiler/daml-lf-verify/BUILD.bazel index e6ca87ab0971..6a8f954b31af 100644 --- a/compiler/daml-lf-verify/BUILD.bazel +++ b/compiler/daml-lf-verify/BUILD.bazel @@ -1,6 +1,7 @@ # Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. # SPDX-License-Identifier: Apache-2.0 +load("//rules_daml:daml.bzl", "daml_compile") load("//bazel_tools:haskell.bzl", "da_haskell_binary", "da_haskell_library", "da_haskell_test") da_haskell_binary( @@ -88,10 +89,25 @@ da_haskell_library( ], ) +daml_compile( + name = "quickstart", + srcs = glob(["daml/quickstart/**/*.daml"]), + version = "1.0.0" +) + +daml_compile( + name = "conditionals", + srcs = glob(["daml/conditionals/**/*.daml"]), + version = "1.0.0" +) + da_haskell_test( name = "verify-tests", srcs = glob(["tests/**/*.hs"]), - data = glob(["data/*.dar"]), + data = [ + ":quickstart.dar", + ":conditionals.dar", + ], hackage_deps = [ "base", "containers", diff --git a/compiler/daml-lf-verify/daml/conditionals/.dlint.yaml b/compiler/daml-lf-verify/daml/conditionals/.dlint.yaml new file mode 100644 index 000000000000..add1b6066c20 --- /dev/null +++ b/compiler/daml-lf-verify/daml/conditionals/.dlint.yaml @@ -0,0 +1,8 @@ +# This file controls the behaviour of the dlint linting tool. Below are two +# examples of how to enable or disable a rule. + +# This rule is enabled by default. Uncomment to disable. +#- ignore: {name: Use fewer imports} + +# This rule is disabled by default. Uncomment to enable. +#- suggest: {name: Use module export list} diff --git a/compiler/daml-lf-verify/daml/conditionals/.gitignore b/compiler/daml-lf-verify/daml/conditionals/.gitignore new file mode 100644 index 000000000000..2c9a6a50f077 --- /dev/null +++ b/compiler/daml-lf-verify/daml/conditionals/.gitignore @@ -0,0 +1 @@ +/.daml diff --git a/compiler/daml-lf-verify/daml/conditionals/daml.yaml b/compiler/daml-lf-verify/daml/conditionals/daml.yaml new file mode 100644 index 000000000000..6d760fc351d1 --- /dev/null +++ b/compiler/daml-lf-verify/daml/conditionals/daml.yaml @@ -0,0 +1,17 @@ +# sdk-version: 0.13.55 +sdk-version: 1.0.1 +name: quickstart +source: daml +init-script: Setup:initialize +parties: + - Alice + - Bob + - USD_Bank + - EUR_Bank +version: 0.0.1 +exposed-modules: + - Main +dependencies: + - daml-prim + - daml-stdlib + - daml-script diff --git a/compiler/daml-lf-verify/daml/conditionals/daml/Iou.daml b/compiler/daml-lf-verify/daml/conditionals/daml/Iou.daml new file mode 100644 index 000000000000..6cc0393785dd --- /dev/null +++ b/compiler/daml-lf-verify/daml/conditionals/daml/Iou.daml @@ -0,0 +1,61 @@ +-- Copyright (c) 2020 The DAML Authors. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + + +module Iou where + +template Iou with + owner: Party + content: Int + where + signatory owner + + choice SuccA: ContractId Iou + controller owner + do + if False + then create Iou with owner; content = content + else create Iou with owner; content = content + + choice SuccB: ContractId Iou + controller owner + do + if 1 == 1 + then create Iou with owner; content = content + else create Iou with owner; content = 0 + + choice SuccC: ContractId Iou + controller owner + do + if True + then do + _ <- create Iou with owner; content = content + create Iou with owner; content = 0 + else create Iou with owner; content = content + + choice SuccD: ContractId Iou + controller owner + do + if True + then do + cid1 <- create Iou with owner; content = content + archive cid1 + create Iou with owner; content = content + else create Iou with owner; content = content + + choice FailA: ContractId Iou + controller owner + do + if 1 == 1 + then create Iou with owner; content = 0 + else create Iou with owner; content = content + + choice FailB: ContractId Iou + controller owner + do + if False + then create Iou with owner; content = content + else do + _ <- create Iou with owner; content = content + create Iou with owner; content = content + diff --git a/compiler/daml-lf-verify/daml/conditionals/daml/Main.daml b/compiler/daml-lf-verify/daml/conditionals/daml/Main.daml new file mode 100644 index 000000000000..ecf17cc46a5b --- /dev/null +++ b/compiler/daml-lf-verify/daml/conditionals/daml/Main.daml @@ -0,0 +1,7 @@ +-- Copyright (c) 2020 The DAML Authors. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + + +module Main where + +import Iou() \ No newline at end of file diff --git a/compiler/daml-lf-verify/daml/conditionals/daml/Setup.daml b/compiler/daml-lf-verify/daml/conditionals/daml/Setup.daml new file mode 100644 index 000000000000..06650c0bab7a --- /dev/null +++ b/compiler/daml-lf-verify/daml/conditionals/daml/Setup.daml @@ -0,0 +1,6 @@ +-- Copyright (c) 2020 The DAML Authors. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + +module Setup where + +import Iou() \ No newline at end of file diff --git a/compiler/daml-lf-verify/daml/conditionals/frontend-config.js b/compiler/daml-lf-verify/daml/conditionals/frontend-config.js new file mode 100644 index 000000000000..6c5986fa98d1 --- /dev/null +++ b/compiler/daml-lf-verify/daml/conditionals/frontend-config.js @@ -0,0 +1,385 @@ +// Copyright (c) 2020 The DAML Authors. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { DamlLfValue } from '@da/ui-core'; + +export const version = { + schema: 'navigator-config', + major: 2, + minor: 0, +}; + +export const customViews = (userId, party, role) => ({ + issued_ious: { + type: "table-view", + title: "Issued Ious", + source: { + type: "contracts", + filter: [ + { + field: "argument.issuer", + value: party, + }, + { + field: "template.id", + value: "Iou:Iou", + } + ], + search: "", + sort: [ + { + field: "id", + direction: "ASCENDING" + } + ] + }, + columns: [ + { + key: "id", + title: "Contract ID", + createCell: ({rowData}) => ({ + type: "text", + value: rowData.id + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.owner", + title: "Owner", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).owner + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.currency", + title: "Currency", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).currency + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.amount", + title: "Amount", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).amount + }), + sortable: true, + width: 80, + weight: 3, + alignment: "left" + } + ] + }, + owned_ious: { + type: "table-view", + title: "Owned Ious", + source: { + type: "contracts", + filter: [ + { + field: "argument.owner", + value: party, + }, + { + field: "template.id", + value: "Iou:Iou", + } + ], + search: "", + sort: [ + { + field: "id", + direction: "ASCENDING" + } + ] + }, + columns: [ + { + key: "id", + title: "Contract ID", + createCell: ({rowData}) => ({ + type: "text", + value: rowData.id + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.issuer", + title: "Issuer", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).issuer + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.currency", + title: "Currency", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).currency + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.amount", + title: "Amount", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).amount + }), + sortable: true, + width: 80, + weight: 3, + alignment: "left" + } + ] + }, + transfers: { + type: "table-view", + title: "Iou Transfers", + source: { + type: "contracts", + filter: [ + { + field: "template.id", + value: "Iou:IouTransfer", + } + ], + search: "", + sort: [ + { + field: "id", + direction: "ASCENDING" + } + ] + }, + columns: [ + { + key: "id", + title: "Contract ID", + createCell: ({rowData}) => ({ + type: "text", + value: rowData.id + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.iou.owner", + title: "Sender", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).iou.owner + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.iou.newOwner", + title: "Receiver", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).newOwner + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.iou.issuer", + title: "Issuer", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).iou.issuer + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.iou.currency", + title: "Currency", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).iou.currency + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.iou.amount", + title: "Amount", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).iou.amount + }), + sortable: true, + width: 80, + weight: 3, + alignment: "left" + } + ] + }, + trades: { + type: "table-view", + title: "Trades", + source: { + type: "contracts", + filter: [ + { + field: "template.id", + value: "IouTrade:IouTrade@", + } + ], + search: "", + sort: [ + { + field: "id", + direction: "ASCENDING" + } + ] + }, + columns: [ + { + key: "id", + title: "Contract ID", + createCell: ({rowData}) => ({ + type: "text", + value: rowData.id + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.buyer", + title: "Buyer", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).buyer + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.seller", + title: "Seller", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).seller + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.baseIssuer", + title: "Base Issuer", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).baseIssuer + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.baseCurrency", + title: "Base Currency", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).baseCurrency + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.baseAmount", + title: "Base Amount", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).baseAmount + }), + sortable: true, + width: 80, + weight: 3, + alignment: "left" + }, + { + key: "argument.quoteIssuer", + title: "Quote Issuer", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).quoteIssuer + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.quoteCurrency", + title: "Quote Currency", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).quoteCurrency + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.quoteAmount", + title: "Quote Amount", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).quoteAmount + }), + sortable: true, + width: 80, + weight: 3, + alignment: "left" + }, + ] + } +}) diff --git a/compiler/daml-lf-verify/daml/conditionals/pom.xml b/compiler/daml-lf-verify/daml/conditionals/pom.xml new file mode 100644 index 000000000000..d010cc3794e6 --- /dev/null +++ b/compiler/daml-lf-verify/daml/conditionals/pom.xml @@ -0,0 +1,117 @@ + + + 4.0.0 + + quickstart + daml-quickstart-java + jar + 1.0.0 + + + UTF-8 + 1.8 + 1.8 + ${project.build.directory}/generated-sources/iou + localhost + 6865 + Alice + 8080 + + + + + com.daml.ledger + bindings-rxjava + 100.13.55 + + + com.google.protobuf + protobuf-lite + + + + + ch.qos.logback + logback-classic + 1.2.3 + + + com.sparkjava + spark-core + 2.7.2 + + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + + com.daml.java + codegen + 100.13.55 + jar + + + + + daml-codegen-java + generate-sources + + java + + + false + true + com.digitalasset.daml.lf.codegen.Main + + -o + ${daml-codegen-java.output} + -d + com.digitalasset.quickstart.iou.TemplateDecoder + ${project.basedir}/.daml/dist/quickstart-0.0.1.dar=com.digitalasset.quickstart.model + + + + + run-quickstart + + java + + + com.digitalasset.quickstart.iou.IouMain + + ${ledgerhost} + ${ledgerport} + ${party} + ${restport} + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.0.0 + + + add-source + generate-sources + + add-source + + + + ${daml-codegen-java.output} + + + + + + + + diff --git a/compiler/daml-lf-verify/daml/conditionals/src/main/java/com/digitalasset/quickstart/iou/IouMain.java b/compiler/daml-lf-verify/daml/conditionals/src/main/java/com/digitalasset/quickstart/iou/IouMain.java new file mode 100644 index 000000000000..33ae2e4e0703 --- /dev/null +++ b/compiler/daml-lf-verify/daml/conditionals/src/main/java/com/digitalasset/quickstart/iou/IouMain.java @@ -0,0 +1,143 @@ +// Copyright (c) 2020 The DAML Authors. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.digitalasset.quickstart.iou; + +import com.daml.ledger.rxjava.DamlLedgerClient; +import com.daml.ledger.rxjava.LedgerClient; +import com.daml.ledger.javaapi.data.*; +import com.digitalasset.quickstart.model.iou.Iou; +import com.google.common.collect.BiMap; + +import com.google.common.collect.HashBiMap; +import com.google.common.collect.Maps; +import com.google.gson.Gson; +import com.google.protobuf.Empty; +import io.reactivex.disposables.Disposable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import spark.Spark; + +import java.time.Instant; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; + + +public class IouMain { + + private final static Logger logger = LoggerFactory.getLogger(IouMain.class); + + // application id used for sending commands + public static final String APP_ID = "IouApp"; + + public static void main(String[] args) { + // Extract host and port from arguments + if (args.length < 4) { + System.err.println("Usage: LEDGER_HOST LEDGER_PORT PARTY REST_PORT"); + System.exit(-1); + } + String ledgerhost = args[0]; + int ledgerport = Integer.valueOf(args[1]); + String party = args[2]; + int restport = Integer.valueOf(args[3]); + + // Create a client object to access services on the ledger. + DamlLedgerClient client = DamlLedgerClient.forHostWithLedgerIdDiscovery(ledgerhost, ledgerport, Optional.empty()); + + // Connects to the ledger and runs initial validation. + client.connect(); + + String ledgerId = client.getLedgerId(); + + logger.info("ledger-id: {}", ledgerId); + + TransactionFilter iouFilter = filterFor(Iou.TEMPLATE_ID, party); + + AtomicLong idCounter = new AtomicLong(0); + ConcurrentHashMap contracts = new ConcurrentHashMap<>(); + BiMap idMap = Maps.synchronizedBiMap(HashBiMap.create()); + AtomicReference acsOffset = new AtomicReference<>(LedgerOffset.LedgerBegin.getInstance()); + + client.getActiveContractSetClient().getActiveContracts(iouFilter, true) + .blockingForEach(response -> { + response.getOffset().ifPresent(offset -> acsOffset.set(new LedgerOffset.Absolute(offset))); + response.getCreatedEvents().stream() + .map(Iou.Contract::fromCreatedEvent) + .forEach(contract -> { + long id = idCounter.getAndIncrement(); + contracts.put(id, contract.data); + idMap.put(id, contract.id); + }); + }); + + Disposable ignore = client.getTransactionsClient().getTransactions(acsOffset.get(), iouFilter, true) + .forEach(t -> { + for (Event event : t.getEvents()) { + if (event instanceof CreatedEvent) { + CreatedEvent createdEvent = (CreatedEvent) event; + long id = idCounter.getAndIncrement(); + Iou.Contract contract = Iou.Contract.fromCreatedEvent(createdEvent); + contracts.put(id, contract.data); + idMap.put(id, contract.id); + } else if (event instanceof ArchivedEvent) { + ArchivedEvent archivedEvent = (ArchivedEvent) event; + long id = idMap.inverse().get(new Iou.ContractId(archivedEvent.getContractId())); + contracts.remove(id); + idMap.remove(id); + } + } + }); + + Gson g = new Gson(); + Spark.port(restport); + Spark.get("/iou", "application/json", (req, res) -> g.toJson(contracts)); + Spark.get("/iou/:id", "application/json", (req, res) -> + g.toJson(contracts.getOrDefault(Long.parseLong(req.params("id")), null)) + ); + Spark.put("/iou", (req, res) -> { + Iou iou = g.fromJson(req.body(), Iou.class); + CreateCommand iouCreate = iou.create(); + submit(client, party, iouCreate); + return "Iou creation submitted."; + }, g::toJson); + Spark.post("/iou/:id/transfer", "application/json", (req, res) -> { + Map m = g.fromJson(req.body(), Map.class); + Iou.ContractId contractId = idMap.get(Long.parseLong(req.params("id"))); + ExerciseCommand exerciseCommand = contractId.exerciseIou_Transfer(m.get("newOwner").toString()); + submit( + client, + party, + exerciseCommand + ); + return "Iou transfer submitted."; + }, g::toJson); + + // Run until user terminates. + while (true) + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + private static Empty submit(LedgerClient client, String party, Command c) { + return client.getCommandSubmissionClient().submit( + UUID.randomUUID().toString(), + "IouApp", + UUID.randomUUID().toString(), + party, + Instant.EPOCH, + Instant.EPOCH.plusSeconds(10), + Collections.singletonList(c)) + .blockingGet(); + } + + private static TransactionFilter filterFor(Identifier templateId, String party) { + InclusiveFilter inclusiveFilter = new InclusiveFilter(Collections.singleton(templateId)); + Map filter = Collections.singletonMap(party, inclusiveFilter); + return new FiltersByParty(filter); + } +} diff --git a/compiler/daml-lf-verify/daml/conditionals/src/main/resources/logback.xml b/compiler/daml-lf-verify/daml/conditionals/src/main/resources/logback.xml new file mode 100644 index 000000000000..a21d0bc04c45 --- /dev/null +++ b/compiler/daml-lf-verify/daml/conditionals/src/main/resources/logback.xml @@ -0,0 +1,17 @@ + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} [ %X{packageIdShort} %X{moduleName}:%X{entityName} - %X{entityType} ] - %msg%n + + + + + + + + + + \ No newline at end of file diff --git a/compiler/daml-lf-verify/daml/quickstart/.dlint.yaml b/compiler/daml-lf-verify/daml/quickstart/.dlint.yaml new file mode 100644 index 000000000000..add1b6066c20 --- /dev/null +++ b/compiler/daml-lf-verify/daml/quickstart/.dlint.yaml @@ -0,0 +1,8 @@ +# This file controls the behaviour of the dlint linting tool. Below are two +# examples of how to enable or disable a rule. + +# This rule is enabled by default. Uncomment to disable. +#- ignore: {name: Use fewer imports} + +# This rule is disabled by default. Uncomment to enable. +#- suggest: {name: Use module export list} diff --git a/compiler/daml-lf-verify/daml/quickstart/.gitignore b/compiler/daml-lf-verify/daml/quickstart/.gitignore new file mode 100644 index 000000000000..2c9a6a50f077 --- /dev/null +++ b/compiler/daml-lf-verify/daml/quickstart/.gitignore @@ -0,0 +1 @@ +/.daml diff --git a/compiler/daml-lf-verify/daml/quickstart/daml.yaml b/compiler/daml-lf-verify/daml/quickstart/daml.yaml new file mode 100644 index 000000000000..2a8ead4555be --- /dev/null +++ b/compiler/daml-lf-verify/daml/quickstart/daml.yaml @@ -0,0 +1,15 @@ +sdk-version: 1.0.1 +name: quickstart +source: daml +init-script: Setup:initialize +parties: + - Alice + - Bob + - USD_Bank + - EUR_Bank +version: 0.0.1 +exposed-modules: + - Main +dependencies: + - daml-prim + - daml-stdlib diff --git a/compiler/daml-lf-verify/daml/quickstart/daml/Iou.daml b/compiler/daml-lf-verify/daml/quickstart/daml/Iou.daml new file mode 100644 index 000000000000..eff39d605d6b --- /dev/null +++ b/compiler/daml-lf-verify/daml/quickstart/daml/Iou.daml @@ -0,0 +1,86 @@ +-- Copyright (c) 2020 The DAML Authors. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + + +module Iou where + +type IouCid = ContractId Iou + +template Iou + with + issuer : Party + owner : Party + currency : Text + amount : Decimal + observers : [Party] + where + ensure amount > 0.0 + + signatory issuer, owner + + observer observers + + controller owner can + + -- Split the IOU by dividing the amount. + Iou_Split : (IouCid, IouCid) + with + splitAmount: Decimal + do + let restAmount = amount - splitAmount + splitCid <- create this with amount = splitAmount + restCid <- create this with amount = restAmount + return (splitCid, restCid) + + -- Merge two IOUs by aggregating their amounts. + Iou_Merge : IouCid + with + otherCid: IouCid + do + otherIou <- fetch otherCid + -- Check the two IOU's are compatible + assert ( + currency == otherIou.currency && + owner == otherIou.owner && + issuer == otherIou.issuer + ) + -- Retire the old Iou + archive otherCid + -- Return the merged Iou + create this with amount = amount + otherIou.amount + + Iou_Transfer : ContractId IouTransfer + with + newOwner : Party + do create IouTransfer with iou = this; newOwner + + Iou_AddObserver : IouCid + with + newObserver : Party + do create this with observers = newObserver :: observers + + Iou_RemoveObserver : IouCid + with + oldObserver : Party + do create this with observers = filter (/= oldObserver) observers + +template IouTransfer + with + iou : Iou + newOwner : Party + where + signatory iou.issuer, iou.owner + + controller iou.owner can + IouTransfer_Cancel : IouCid + do create iou + + controller newOwner can + IouTransfer_Reject : IouCid + do create iou + + IouTransfer_Accept : IouCid + do + create iou with + owner = newOwner + observers = [] diff --git a/compiler/daml-lf-verify/daml/quickstart/daml/IouTrade.daml b/compiler/daml-lf-verify/daml/quickstart/daml/IouTrade.daml new file mode 100644 index 000000000000..3556961764d7 --- /dev/null +++ b/compiler/daml-lf-verify/daml/quickstart/daml/IouTrade.daml @@ -0,0 +1,49 @@ +-- Copyright (c) 2020 The DAML Authors. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + + +module IouTrade where + +import DA.Assert + +import Iou + +template IouTrade + with + buyer : Party + seller : Party + baseIouCid : IouCid + baseIssuer : Party + baseCurrency : Text + baseAmount : Decimal + quoteIssuer : Party + quoteCurrency : Text + quoteAmount : Decimal + where + signatory buyer + + controller seller can + IouTrade_Accept : (IouCid, IouCid) + with + quoteIouCid : IouCid + do + baseIou <- fetch baseIouCid + baseIssuer === baseIou.issuer + baseCurrency === baseIou.currency + baseAmount === baseIou.amount + buyer === baseIou.owner + quoteIou <- fetch quoteIouCid + quoteIssuer === quoteIou.issuer + quoteCurrency === quoteIou.currency + quoteAmount === quoteIou.amount + seller === quoteIou.owner + quoteIouTransferCid <- exercise quoteIouCid Iou_Transfer with + newOwner = buyer + transferredQuoteIouCid <- exercise quoteIouTransferCid IouTransfer_Accept + baseIouTransferCid <- exercise baseIouCid Iou_Transfer with + newOwner = seller + transferredBaseIouCid <- exercise baseIouTransferCid IouTransfer_Accept + return (transferredQuoteIouCid, transferredBaseIouCid) + + TradeProposal_Reject : () + do return () diff --git a/compiler/daml-lf-verify/daml/quickstart/daml/Main.daml b/compiler/daml-lf-verify/daml/quickstart/daml/Main.daml new file mode 100644 index 000000000000..56120d39eb18 --- /dev/null +++ b/compiler/daml-lf-verify/daml/quickstart/daml/Main.daml @@ -0,0 +1,40 @@ +-- Copyright (c) 2020 The DAML Authors. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + + +module Main where + +import Iou +import IouTrade() + +setup : Scenario IouCid +setup = scenario do + alice <- getParty "Alice" + bob <- getParty "Bob" + usBank <- getParty "USD_Bank" + eurBank <- getParty "EUR_Bank" + + -- Banks issue IOU transfers. + iouTransferAliceCid <- submit eurBank do + iouCid <- create Iou with + issuer = eurBank + owner = eurBank + currency = "EUR" + amount = 100.0 + observers = [] + exercise iouCid Iou_Transfer with newOwner = alice + + iouTransferBobCid <- submit usBank do + iouCid <- create Iou with + issuer = usBank + owner = usBank + currency = "USD" + amount = 110.0 + observers = [] + exercise iouCid Iou_Transfer with newOwner = bob + + -- Bob and Alice accept. + submit alice do + exercise iouTransferAliceCid IouTransfer_Accept + submit bob do + exercise iouTransferBobCid IouTransfer_Accept diff --git a/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Iou.daml b/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Iou.daml new file mode 100644 index 000000000000..fa1089cf953f --- /dev/null +++ b/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Iou.daml @@ -0,0 +1,148 @@ +-- Copyright (c) 2020 The DAML Authors. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + + +module Tests.Iou where + +import Iou + +iou_test = scenario do + bank <- getParty "Acme Bank" + alice <- getParty "Alice" + bob <- getParty "Bob" + charlie <- getParty "Charlie" + + let + issuer = bank + currency = "USD" + + -- Bank creates IOU transfers for Alice and Bob. + iouTransferAliceCid <- submit bank do + iouCid <- create Iou with + issuer + owner = issuer + currency + amount = 100.0 + observers = [] + + exercise iouCid Iou_Transfer with newOwner = alice + + iouTransferBobCid <- submit bank do + iouCid <- create Iou with + issuer + owner = issuer + currency + amount = 30.0 + observers = [] + exercise iouCid Iou_Transfer with newOwner = bob + + iouAliceCid <- submit alice do + exercise iouTransferAliceCid IouTransfer_Accept + + iouBobCid <- submit bob do + exercise iouTransferBobCid IouTransfer_Accept + + -- Alice splits the IOU and transfers part of it to Bob. + split <- submit alice do + exercise iouAliceCid Iou_Split with splitAmount = 40.0 + iouTransferCid <- submit alice do + exercise (fst split) Iou_Transfer with newOwner = bob + + -- Bob accepts and merges it with the one he already has. + iouOtherCid <- submit bob do + exercise iouTransferCid IouTransfer_Accept + + iouTotalCid <- submit bob do + exercise iouBobCid Iou_Merge with otherCid = iouOtherCid + + -- Assert things are as they should be. + submit alice do + aliceIou <- fetch (snd split) + assert $ aliceIou == Iou with + issuer = bank + owner = alice + currency = "USD" + amount = 60.0 + observers = [] + + submit bob do + bobIou <- fetch iouTotalCid + assert $ bobIou == Iou with + issuer = bank + owner = bob + currency = "USD" + amount = 70.0 + observers = [] + + -- Issuers can archive IOUs they own. + iouBankCid <- submit bank do + create Iou with + issuer = bank + owner = bank + currency = "USD" + amount = 100.0 + observers = [] + + submit bank do exercise iouBankCid Archive + submitMustFail bank do fetch iouBankCid + + -- Alice can't create IOUs that are backed by Acme Bank. + submitMustFail alice do + create Iou with + issuer = bank + owner = alice + currency = "USD" + amount = 50.0 + observers = [] + + -- Acme Bank can't create IOUs with a negative amount. + submitMustFail bank do + create Iou with + issuer = bank + owner = alice + currency = "USD" + amount = -20.0 + observers = [] + + submitMustFail bank do + create Iou with + issuer = bank + owner = alice + currency = "USD" + amount = -20.0 + observers = [] + + -- SplitAmount needs to be between 0 and amount. + submitMustFail alice do exercise (snd split) Iou_Split with splitAmount = 80.0 + + -- Double spend gets prevented by archiving the contract. + submitMustFail alice do exercise (fst split) Iou_Transfer with newOwner = charlie + + -- Similarly, a merged contract gets archived as well. + submitMustFail bank do exercise iouOtherCid Iou_Transfer with newOwner = charlie + + -- Only the owner can exercise the transfer choice. + submitMustFail bank do exercise (snd split) Iou_Transfer with newOwner = charlie + + -- Issuer can't archive something Bob owns. + submitMustFail bank do exercise (fst split) Archive + + -- Issuer can't archive something Alice owns. + submitMustFail bank do exercise (snd split) Archive + + -- Alice didn't disclose her remaining IOUs to Bob. + submitMustFail bob do fetch (snd split) + + -- Only matching IOUs can be merged. + iouTransferEURCid <- submit bank do + iouCid <- create Iou with + issuer = bank + owner = bank + currency = "EUR" + amount = 60.0 + observers = [] + exercise iouCid Iou_Transfer with newOwner = alice + + submitMustFail alice do + iouEURCid <- exercise iouTransferEURCid IouTransfer_Accept + exercise (snd split) Iou_Merge with otherCid = iouEURCid diff --git a/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Trade.daml b/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Trade.daml new file mode 100644 index 000000000000..369a60b65936 --- /dev/null +++ b/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Trade.daml @@ -0,0 +1,76 @@ +-- Copyright (c) 2020 The DAML Authors. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + + +module Tests.Trade where + +import DA.Assert + +import Iou +import IouTrade + +trade_test = scenario do + alice <- getParty "Alice" + bob <- getParty "Bob" + usBank <- getParty "USD_Bank" + eurBank <- getParty "EUR_Bank" + + -- Banks issue IOU transfers. + iouTransferAliceCid <- submit eurBank do + iouCid <- create Iou with + issuer = eurBank + owner = eurBank + currency = "EUR" + amount = 100.0 + observers = [] + exercise iouCid Iou_Transfer with newOwner = alice + + iouTransferBobCid <- submit usBank do + iouCid <- create Iou with + issuer = usBank + owner = usBank + currency = "USD" + amount = 110.0 + observers = [] + exercise iouCid Iou_Transfer with newOwner = bob + + -- Bob and Alice accept. + iouAliceCid <- submit alice do + exercise iouTransferAliceCid IouTransfer_Accept + iouBobCid <- submit bob do + exercise iouTransferBobCid IouTransfer_Accept + + -- Alice makes her EUR IOU visible to Bob. + iouAliceCid <- submit alice do + exercise iouAliceCid Iou_AddObserver with newObserver = bob + + -- Alice makes a trade proposal to swap her EUR for Bob's USD. + tradePropCid <- submit alice do + create IouTrade with + buyer = alice + seller = bob + baseIouCid = iouAliceCid + baseIssuer = eurBank + baseCurrency = "EUR" + baseAmount = 100.0 + quoteIssuer = usBank + quoteCurrency = "USD" + quoteAmount = 110.0 + + -- Bob accepts. + newIous <- submit bob do + exercise tradePropCid IouTrade_Accept with quoteIouCid = iouBobCid + + submit alice do + iou <- fetch (fst newIous) + alice === iou.owner + usBank === iou.issuer + "USD" === iou.currency + 110.0 === iou.amount + + submit bob do + iou <- fetch (snd newIous) + bob === iou.owner + eurBank === iou.issuer + "EUR" === iou.currency + 100.0 === iou.amount diff --git a/compiler/daml-lf-verify/daml/quickstart/frontend-config.js b/compiler/daml-lf-verify/daml/quickstart/frontend-config.js new file mode 100644 index 000000000000..6c5986fa98d1 --- /dev/null +++ b/compiler/daml-lf-verify/daml/quickstart/frontend-config.js @@ -0,0 +1,385 @@ +// Copyright (c) 2020 The DAML Authors. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +import { DamlLfValue } from '@da/ui-core'; + +export const version = { + schema: 'navigator-config', + major: 2, + minor: 0, +}; + +export const customViews = (userId, party, role) => ({ + issued_ious: { + type: "table-view", + title: "Issued Ious", + source: { + type: "contracts", + filter: [ + { + field: "argument.issuer", + value: party, + }, + { + field: "template.id", + value: "Iou:Iou", + } + ], + search: "", + sort: [ + { + field: "id", + direction: "ASCENDING" + } + ] + }, + columns: [ + { + key: "id", + title: "Contract ID", + createCell: ({rowData}) => ({ + type: "text", + value: rowData.id + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.owner", + title: "Owner", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).owner + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.currency", + title: "Currency", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).currency + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.amount", + title: "Amount", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).amount + }), + sortable: true, + width: 80, + weight: 3, + alignment: "left" + } + ] + }, + owned_ious: { + type: "table-view", + title: "Owned Ious", + source: { + type: "contracts", + filter: [ + { + field: "argument.owner", + value: party, + }, + { + field: "template.id", + value: "Iou:Iou", + } + ], + search: "", + sort: [ + { + field: "id", + direction: "ASCENDING" + } + ] + }, + columns: [ + { + key: "id", + title: "Contract ID", + createCell: ({rowData}) => ({ + type: "text", + value: rowData.id + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.issuer", + title: "Issuer", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).issuer + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.currency", + title: "Currency", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).currency + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.amount", + title: "Amount", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).amount + }), + sortable: true, + width: 80, + weight: 3, + alignment: "left" + } + ] + }, + transfers: { + type: "table-view", + title: "Iou Transfers", + source: { + type: "contracts", + filter: [ + { + field: "template.id", + value: "Iou:IouTransfer", + } + ], + search: "", + sort: [ + { + field: "id", + direction: "ASCENDING" + } + ] + }, + columns: [ + { + key: "id", + title: "Contract ID", + createCell: ({rowData}) => ({ + type: "text", + value: rowData.id + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.iou.owner", + title: "Sender", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).iou.owner + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.iou.newOwner", + title: "Receiver", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).newOwner + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.iou.issuer", + title: "Issuer", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).iou.issuer + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.iou.currency", + title: "Currency", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).iou.currency + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.iou.amount", + title: "Amount", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).iou.amount + }), + sortable: true, + width: 80, + weight: 3, + alignment: "left" + } + ] + }, + trades: { + type: "table-view", + title: "Trades", + source: { + type: "contracts", + filter: [ + { + field: "template.id", + value: "IouTrade:IouTrade@", + } + ], + search: "", + sort: [ + { + field: "id", + direction: "ASCENDING" + } + ] + }, + columns: [ + { + key: "id", + title: "Contract ID", + createCell: ({rowData}) => ({ + type: "text", + value: rowData.id + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.buyer", + title: "Buyer", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).buyer + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.seller", + title: "Seller", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).seller + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.baseIssuer", + title: "Base Issuer", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).baseIssuer + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.baseCurrency", + title: "Base Currency", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).baseCurrency + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.baseAmount", + title: "Base Amount", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).baseAmount + }), + sortable: true, + width: 80, + weight: 3, + alignment: "left" + }, + { + key: "argument.quoteIssuer", + title: "Quote Issuer", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).quoteIssuer + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.quoteCurrency", + title: "Quote Currency", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).quoteCurrency + }), + sortable: true, + width: 80, + weight: 0, + alignment: "left" + }, + { + key: "argument.quoteAmount", + title: "Quote Amount", + createCell: ({rowData}) => ({ + type: "text", + value: DamlLfValue.toJSON(rowData.argument).quoteAmount + }), + sortable: true, + width: 80, + weight: 3, + alignment: "left" + }, + ] + } +}) diff --git a/compiler/daml-lf-verify/daml/quickstart/pom.xml b/compiler/daml-lf-verify/daml/quickstart/pom.xml new file mode 100644 index 000000000000..d010cc3794e6 --- /dev/null +++ b/compiler/daml-lf-verify/daml/quickstart/pom.xml @@ -0,0 +1,117 @@ + + + 4.0.0 + + quickstart + daml-quickstart-java + jar + 1.0.0 + + + UTF-8 + 1.8 + 1.8 + ${project.build.directory}/generated-sources/iou + localhost + 6865 + Alice + 8080 + + + + + com.daml.ledger + bindings-rxjava + 100.13.55 + + + com.google.protobuf + protobuf-lite + + + + + ch.qos.logback + logback-classic + 1.2.3 + + + com.sparkjava + spark-core + 2.7.2 + + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + + com.daml.java + codegen + 100.13.55 + jar + + + + + daml-codegen-java + generate-sources + + java + + + false + true + com.digitalasset.daml.lf.codegen.Main + + -o + ${daml-codegen-java.output} + -d + com.digitalasset.quickstart.iou.TemplateDecoder + ${project.basedir}/.daml/dist/quickstart-0.0.1.dar=com.digitalasset.quickstart.model + + + + + run-quickstart + + java + + + com.digitalasset.quickstart.iou.IouMain + + ${ledgerhost} + ${ledgerport} + ${party} + ${restport} + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.0.0 + + + add-source + generate-sources + + add-source + + + + ${daml-codegen-java.output} + + + + + + + + diff --git a/compiler/daml-lf-verify/daml/quickstart/src/main/java/com/digitalasset/quickstart/iou/IouMain.java b/compiler/daml-lf-verify/daml/quickstart/src/main/java/com/digitalasset/quickstart/iou/IouMain.java new file mode 100644 index 000000000000..33ae2e4e0703 --- /dev/null +++ b/compiler/daml-lf-verify/daml/quickstart/src/main/java/com/digitalasset/quickstart/iou/IouMain.java @@ -0,0 +1,143 @@ +// Copyright (c) 2020 The DAML Authors. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +package com.digitalasset.quickstart.iou; + +import com.daml.ledger.rxjava.DamlLedgerClient; +import com.daml.ledger.rxjava.LedgerClient; +import com.daml.ledger.javaapi.data.*; +import com.digitalasset.quickstart.model.iou.Iou; +import com.google.common.collect.BiMap; + +import com.google.common.collect.HashBiMap; +import com.google.common.collect.Maps; +import com.google.gson.Gson; +import com.google.protobuf.Empty; +import io.reactivex.disposables.Disposable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import spark.Spark; + +import java.time.Instant; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; + + +public class IouMain { + + private final static Logger logger = LoggerFactory.getLogger(IouMain.class); + + // application id used for sending commands + public static final String APP_ID = "IouApp"; + + public static void main(String[] args) { + // Extract host and port from arguments + if (args.length < 4) { + System.err.println("Usage: LEDGER_HOST LEDGER_PORT PARTY REST_PORT"); + System.exit(-1); + } + String ledgerhost = args[0]; + int ledgerport = Integer.valueOf(args[1]); + String party = args[2]; + int restport = Integer.valueOf(args[3]); + + // Create a client object to access services on the ledger. + DamlLedgerClient client = DamlLedgerClient.forHostWithLedgerIdDiscovery(ledgerhost, ledgerport, Optional.empty()); + + // Connects to the ledger and runs initial validation. + client.connect(); + + String ledgerId = client.getLedgerId(); + + logger.info("ledger-id: {}", ledgerId); + + TransactionFilter iouFilter = filterFor(Iou.TEMPLATE_ID, party); + + AtomicLong idCounter = new AtomicLong(0); + ConcurrentHashMap contracts = new ConcurrentHashMap<>(); + BiMap idMap = Maps.synchronizedBiMap(HashBiMap.create()); + AtomicReference acsOffset = new AtomicReference<>(LedgerOffset.LedgerBegin.getInstance()); + + client.getActiveContractSetClient().getActiveContracts(iouFilter, true) + .blockingForEach(response -> { + response.getOffset().ifPresent(offset -> acsOffset.set(new LedgerOffset.Absolute(offset))); + response.getCreatedEvents().stream() + .map(Iou.Contract::fromCreatedEvent) + .forEach(contract -> { + long id = idCounter.getAndIncrement(); + contracts.put(id, contract.data); + idMap.put(id, contract.id); + }); + }); + + Disposable ignore = client.getTransactionsClient().getTransactions(acsOffset.get(), iouFilter, true) + .forEach(t -> { + for (Event event : t.getEvents()) { + if (event instanceof CreatedEvent) { + CreatedEvent createdEvent = (CreatedEvent) event; + long id = idCounter.getAndIncrement(); + Iou.Contract contract = Iou.Contract.fromCreatedEvent(createdEvent); + contracts.put(id, contract.data); + idMap.put(id, contract.id); + } else if (event instanceof ArchivedEvent) { + ArchivedEvent archivedEvent = (ArchivedEvent) event; + long id = idMap.inverse().get(new Iou.ContractId(archivedEvent.getContractId())); + contracts.remove(id); + idMap.remove(id); + } + } + }); + + Gson g = new Gson(); + Spark.port(restport); + Spark.get("/iou", "application/json", (req, res) -> g.toJson(contracts)); + Spark.get("/iou/:id", "application/json", (req, res) -> + g.toJson(contracts.getOrDefault(Long.parseLong(req.params("id")), null)) + ); + Spark.put("/iou", (req, res) -> { + Iou iou = g.fromJson(req.body(), Iou.class); + CreateCommand iouCreate = iou.create(); + submit(client, party, iouCreate); + return "Iou creation submitted."; + }, g::toJson); + Spark.post("/iou/:id/transfer", "application/json", (req, res) -> { + Map m = g.fromJson(req.body(), Map.class); + Iou.ContractId contractId = idMap.get(Long.parseLong(req.params("id"))); + ExerciseCommand exerciseCommand = contractId.exerciseIou_Transfer(m.get("newOwner").toString()); + submit( + client, + party, + exerciseCommand + ); + return "Iou transfer submitted."; + }, g::toJson); + + // Run until user terminates. + while (true) + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + private static Empty submit(LedgerClient client, String party, Command c) { + return client.getCommandSubmissionClient().submit( + UUID.randomUUID().toString(), + "IouApp", + UUID.randomUUID().toString(), + party, + Instant.EPOCH, + Instant.EPOCH.plusSeconds(10), + Collections.singletonList(c)) + .blockingGet(); + } + + private static TransactionFilter filterFor(Identifier templateId, String party) { + InclusiveFilter inclusiveFilter = new InclusiveFilter(Collections.singleton(templateId)); + Map filter = Collections.singletonMap(party, inclusiveFilter); + return new FiltersByParty(filter); + } +} diff --git a/compiler/daml-lf-verify/daml/quickstart/src/main/resources/logback.xml b/compiler/daml-lf-verify/daml/quickstart/src/main/resources/logback.xml new file mode 100644 index 000000000000..a21d0bc04c45 --- /dev/null +++ b/compiler/daml-lf-verify/daml/quickstart/src/main/resources/logback.xml @@ -0,0 +1,17 @@ + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} [ %X{packageIdShort} %X{moduleName}:%X{entityName} - %X{entityType} ] - %msg%n + + + + + + + + + + \ No newline at end of file diff --git a/compiler/daml-lf-verify/data/conditionals.dar b/compiler/daml-lf-verify/data/conditionals.dar deleted file mode 100644 index 0f2a0fb7a8f19ea46578b85ebbeab652655b8de6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261817 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 z 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 z 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�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 diff --git a/compiler/daml-lf-verify/data/quickstart.dar b/compiler/daml-lf-verify/data/quickstart.dar deleted file mode 100644 index 40e4b9674c768899b370412a66b38b51f5c74180..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 342780 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

    cEGit$xJYI!sw2-|(W1*>=t0eH(STS~m5knQ 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
  • !(cW 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
  • %Dv;<1wp%r%)LiAJeBQp9x(Y z3dV7@Fexvuh`+f2d;!lSo@7R(5Uxm2z+yGh*2o`7x@Eb4B0-H5iGm7P6%@)0zvu)n zlgyYFi3>K39O71EPMlX|-VMvE<0U>39p z7tIf5xRn=Hw8kIhr|n6m_{EBtaQ?W`{03q&|&wkJdr zqt=E(+G@~^$8_GjTD3ALQroCt*io&QY>N2nHEJA@fHdNTSg|aN16guU$QdzrR2`z* zFcb)fxhOz;aWaqkk-b8_xVBuKHnKbBWn_ONT_{L`_piD{S)Sc)_>PX_B0W#G#N8S} z5gMD^x)*+kR^&DD>4eZ?L>#a+H#QYunaFM+^(lq@rh0zvEnQ3G!2hr<5duZrf zsb_Lsq5j~V9Cjx-w#2TPf(@SEs+mQ(3@bw8mG7UrVcviLy^)+{7-&Cm8&6b+mmVt6e|6Itojhv5c=DEzIQw^`#KObCt=dI1t!u%MZ_o-pPWFt(? zyY>hXZl-AgyM-TiV-E2IaJArMfKJ18`{tjaN&JbBY#sEpnFt%M7KHu9U4y9AMrJJa zcR6o_l`^V3qFwJQ``mb+9nkd8&BT+|L{FF>|yCAW6--9?00gMD-uo| z&>uL}nQ4q`VD22JK4Er?kQUt|H%GgVQ_W^wn|Y4&ElIl??sIdNLoY}_Z7}ytmN_KH z{v)+iv?Aj4s-weQB?U#gyQB>~%rw^=MRc<)& zD+Tx^r~G5IRJ(dC=HDG`3Q!6%2FVl<}ZPV@R( z+;=3=rQxYIPSFu#8|+);xraY2iOr9Z{)dt!X@I?5m#1ZVAZk<+1ClY*x=((vkj7l-|NOgmd?gkY#c)j1jFHd-*V7h$jRuc+f z-M$fWAVVr5SyVy?)`SW)IPtDcM`6MZD9UV_9ethQwE4YA1qvE;LQ3)p@Wv3mI!*?V zT&kTs>kBNdU3!F$8nDUvnl7w>cYQUfzx#PabPSL-uSSI&U%(DFCHC?UbPPxK_dVy} zjr=hLUxyE-C-(cy^zrxt1kp1B;}-6PF7sV;TqaMs3+raYY#TJi$%#V^rDKSBI?DE} zb53Z5XFd1Q#MJ(0W6vtf6N*j9_`r?>qQ;j!v3tN_<&X^j5X-Jr?O_c_*y$%VNb%@v z>kO*ja#S4HRQcnndIxscadzZ%aw&Ci+vihy-vAvgM=8wv4myS`kjg_mGcfSO)ba3u z*R8lZv7ndED(sIr4Pg1og){0)S3dnAzQSRCqK8Dq)`Gz@q1ab6qtV)KHh&-PB z{d>p#+Z*0{WCBbh7aHgf2at6iP#6vnn}NR}r2jPLZXIY}80Ky`XdgP9{UWfwRf%X! zA<_;WQZnUg1tFP?6WGUL;zIicfY4JL7zqA^0d65W*a?giPvbfkC zbKezAKXR*&9Q5O{&WRFlCK|71(HUHgnd#GsHGI;y5~^c(Q_cnSi3g#^@!XaiYQHx^ z8^84j{sVcLrP}+!srO$-|9D5zJmS`-x^`ZW|GZj@@|n^zA$g3Jj*Qw4_t&`-dJd2N zz=?VJu-hw|W}2g#0Gb8BQ^=X-WF@$VdN2{Eepy&Pt40QInOmnpS;J+!PD2~N&t2_C zK=$^&`wTyMCRJ>?dttNhXrcl%8r`QHMf)$SsA1T~5zB+TQ^?%FtuY9-FcUTC*wzqn zO|c6HaqhW8V*qt)sjKl7&oWJ(^55US*P0vB3@F6PO*yb?>5vEB&h<$xT{kLH#;R0Y70E-fRm#33HP#=#9R%yNZWVy6nH;)-G* z&{sld5;W!cd^Ripst**ws_11ET|!}t7hSl++EZR(6^bZj9gu2e9T>H>3YOnohVt54 zhRSWP{`K^qbXNaDFxFb6h&z4%ZR81UBtw6@k>svToRn7eS)NSlA+wWei~kdVUhp~h zmctfvmS~$aY7(0}PFMxc&L<~!i|J2#1ZmDRg)qsgkoj@h*L<9YHGNuKe@F8(s(!=p zHF2J}n%}GJON!-5wuRJv5|+FW4z%L8++#YK>FtIYox>DTt*t(%&COC4f^AMrYb8+# ztv^=}Y?SFU?lRi(WBOb{^ADTB%U{vq?%#g+uib3|1yJL>%(QSSgDTT+{WsKjb!x70{B?DHxLmU%SeC#@+p}?L zev(he6XF+h^nrcE&f(HL6bs1{q_r+1;z5ro`?WPd|6tHgbdITKC{AFDuwei-cbpoM z*XKh`jT!gO;;v*RD%e_hq;lVu9>U(01GFa1B9dQ@Ekf`QBlqs?sEmWqMsI8G_MIu_=CE!f_JVX*X-k3QGZSbPfuRha zCl7Li7?tglPO-gme2L}Wk#_1@#Zs{xWiN=uhypB zZ%AY%Oqr0~48C+s$G_%Z2d#SBLTj)PimgAVx0Z^GqnJff&t|R?C zYbEbHHMtIA&wJo@(T;+yJ^{QLOP7!^WwT>?r&|^-8tHBuB5@4Wn%8p<4ZDx>t$^;r zBQVc^?lMEA-GDftfYUpGa0PTV}GW z1=eY|2iUg!yT7u}mSJV82o!_cF~#^>vwZ#{Sp?ns9_zGvkMp8AO0*m{L)uEW=&DO_ zO>@}C9gAw;Klhk8H0)5=+Y9mn(`s}=E42C!^Zj$)xlU$R_dzuCv#$h>m!FJ>*ZWo2 z*QfUO_Q|S4uGi$o`}D@__ZDPwYbl%*uoa77f#-L^&mkK7xa$9R%P~K>vUHm4-y_xy z8hq!63_EFu42$c84C{4+NBTa+BKR6-;QDCPaR6Yq?%qboMd2M8ZZkz2Zu?3w+xKpj zB5wx{zRR0jA#0=@8g9>=d9v}QjXs~g%M)drGtbaw$~$QORYgMjPO8be+-268#{cJ3 z!jMEGVtHSR{(o0H-;dlos*>}g-P>9_I&cjK_g*}LFEG`Q0aXV;Cr02Ptri-=*VNA+ zjlD_zMjq^cog6gvPmAyfQc{Il`i;_IeH;L$=5Sv#NJuv;frC6c?NDL8ol1d&y?Xxr zd!OXK0O6Ej9Y+U%T1EffLb+xJA;ESnWSC2e{_)y;F+5W4M3+O%WUnR%oTOR|`g{*u`Y6b~{0S5JL2{;G#zmHX zMaR>t`PiZ-UJ=(Jj}sXNn<5usB=Q>y?h?(4Gzc2Ie4a9p!*@Kg?4s4dQ;=7}Nr^Oo zgFSL=NB!4uCkG@)H4PVArQMM8!65=?(j}zTuBxavs0ULFI9Y=y`3pRy@ z)D>w60%s&$BLz*3znt}#m2yp6@;O9VpY`{FxdI^zcI~?c24y2%11~|f%S)!<4(1@& zi!%?KT_y7A9WPu!$k#G!gdMkXnjl^4Kbsgw8gDr2>Zi9@7fIg_r1Zmc{lDw~?Elt( zrZCg6&T0frU~^Vd&s1`EREnfpJat~M;}xdTQqLj&ssx8ZG@=dnR+LBaRb8{v?BsMz z0XCuyEa-3Xm*GPHsm}O+9000LsHwWiXQ^m|;Tt?7kauEN0@DrdbV%c|2t_!FgvpV` zYrtN#r8F$g%yJm?I^yZ2eERWHWe3~5sz;JV8w&qZ9w`l=@`Rf92cLzQB69_szI?8P znF=!~kgj2ah0xr>UUAXJ{(`=Ar2atQyG6b<}dE$ z1a#z1R_4@~+n}*Vs`Wf?6EIU?vl4Gpv9Yo!(!jy-`u&3(-e=ZCO5=e9*yyyV)U$tU z{AJmH3>O0mpOB2D3@4Rpj<|wfO0w55@|rM@=-<_SNKl>05jUePdJI}Zh?*( zu}ATjfWG#l%gjGqe?=S6aq(-7Q{!!Z@{;RZV#l$FG$^@5qb7z_pk>Bil1oUnq@gA< zDA17W*a+@oS(C2K5tLc8ozRf;&TaVf-UY&qSAZqPUz$qv<*(kHQYnyXwIt@YoN|5B zSEdmrE*++bHZXOBnnv-5m{N5DQ~UqPOWQ(BOFMuG_}{<@eq5ooBaT4CD*{!7&OCTF z@{@yNTclyQ1oc{+PSy#=R=a~}3Ms#y|IPQWWGSvlA?X{}&$vP#X?)s22e%H`oRyR-LJ3#s16pEsng~#SvLX$vga;(U z#R%gQmFd9N?nS7UfVu8il*@ZCn~}Q;(In^mMzV&sj|q zYC1(1nSR1Z{_fOQz|T$oPD@s%a;d0Qc^OadW!chaq1<9E#j$i{ZAGeupZVd3n&`9U z{D0MDMO3O~RY%IT1(;HRDHfPQb)=p#fhtsKN4n+#Os~s5)M2J4tUw-pH7-l?1N+N1 ztVuQjY8#V-9rrsW;xvG>N7(jPo_4x0Mj)c(_8g1tj--hAT`T=(r&L1RMAKItf?uI~ zB6^2p2Uz8*+*QHKJ!t(Hm0;Q;%RE7(qhyjK;_o^096R@OEY(vK98MJuAB4sRxenHc=EYNXbBwc#KXR|lII7FV-%7B6VMszc zv>_MYwaS^AN_&(Pee&bJG|MX0KQQ+}a%X?c%jIuV<3XN3z`BV13WGW_BQwkEjQ6{p z8WI-ROO!H!Y`1ITAnBEfAC{sZV@aAMMeoBi9?qER%aE_*`eJlUQ*2{!stjBrTSu%j zN2{_Xv(4wC60CxM()c?EnrBzkQh)*o3;B|pSc=()7m%IFG~akQoEo>8=PX(K?UteV z3R*x`Ek;!zVMi)PwT6;?sOk&I+5erpKah6nGG~1&>K{y9U!;t_lEC?8^E>v1Mo`GP zD*0H3GlS0dcg-V>V7(&hcUM~`dQOzUU}hNaUe8#!e^_h4pIhC4p_d2%h^GdW04dYj z_`1`>keRo-qa{@5odaJK(?%l#QKXS0SbWx>g!>wOyKr>pVypTd0zv$UPOd!)jO@Uw z7zB}ouQBPq2X>fL4d~Kpo-!z&GD`Ny&sYGilx}P=w(_5X7^Js+DPl>&tT@>Gru%QB zS3+`3J0wWr87B zr5TQ4az4e_tja`0ca&i|b0)f7)V7svzTTlW6>b-UzRctY3EjglkcVGVYr(JC#YWq< zi0azMVVdc^cxkuLq6ux_y=5p@)~r|ps2=|!z8kwU=&Fkbs}l906ZNT<$SX6h zinW%KoRqb+*YxWqmQhVFsMV<&Z0TZbight*TIe^>tI7iuD^!$}t3P{Es%X`N@P{%ulSu!Zp7uR8<~HQX#!hF)D9 zGo4Jv-50@8S{C%sIKBZf~YH(>JqUL&G|RY(m%bQxWN7U-fd!t_%V((IHE^)A9?5( z>My`0_bXXcE%`lHRE;V;(H3rIo85kaAj@<`S6U1k>qu7+4l z#5s+Lp^`U%2zgIb@JZn}^v82)G%`x`J2#pLFj|F@eQPe6YUn+(&I@C_^*el0B-lo- z?DOz7e|!sX_}9<0vN{|J0ZDJ$`jFTNVNXgZ_zC1_TS4c?n~dH276Jqe>Il+E>$pJ~ z+^`}kQqL6okyKP29B~x|u=<31lqP1OFp?#KlRq#lt5QLqpcK8Lp7@Bxeh6e7>#=A$*_+;FAfig} zgv5go+Sle({%R^JqsB+kkQDn#YEyE9oB!D4SXI@ElgLzmh(=nK)UV2!M5JRx%}PuT z_1yQfebT(m$S>qNjw^CmFIcw?(IS_fGoPr zvfqmN!b|PQRs^X+W*lM6(S-%IvczrG@p$FeHO587gtg zP!MC;Cp5snk@Qf}oIy6aGnK1+@Nka~r3saih|=}BOCd8Q<)vs#BbE4jX}63GFV0se zX~!h}sBYrGLavjC$6i|{F8JPbdZ5Sg3Z^oNn~nD2huL98G>K!z_X;+@M9rwLg*Gv; zXLeO&)>qUq*^x>>9HG4RGA+;`1b7cH(Uqr3A}nleM7$9qH-9o z=Wyi-LMz?6e8iRU4ZLE@SUnR>S`EKq+p?Geeh5^(T!bCEAy-B1Bs6?%y&GB!Q4&Vn`|%2x%Z0;U9O4Q<2;Yh7T;1ST3;72m%`6&xaB$HYHk6o6>P!6WR;8)bY^fO5(n$~ zM^L>Ul`rR@((K8WVg-{kxTR2Mt>Vi{k5doI%jv7jq|Sapye&}_VJ`L|%4E?rzz)(0v`bV@n4i~&lhhejBJhi@pm3HZbOZ_++N=>(O1*IFwR| z9cVFw3;aLxd<`5VCW=?WNG1g(pPyJ(&>t>+q>>9B1b4$*r-590{O~{BjZkubX;5LlO zal$rl`$Eetr{LfB7X~E%3hZDPV0`0ED`i*2JDc$K`q~Dlw(K;8!9JQQ*TVQP9azX&;bYjjVamD67QitK5WS@>R>%gTEVCw5?)iZ$ zkm6U)7@tDQQIdy8<_z&ULubWS<4Fx2eu!7-*x+vFGT&V>4Zmaru0d$ur#)Mz=%VRp z6p$7c>D(kL?jv#LMgV-G#r}k54Mi?E6v#xX2c=l<5GOS+Je2DS$dTN%;ggAWqWB_7kYy^efMp7nlcF&5qc%<(ctXmAkN2VWERifet*Rku_5O;-g}MIqKnkKC0kYc!-q#D}ZIUGw1x|~RN6XE85vMr%Mn)t1Lb2%tv1?(| z4{dl0O4~-i{?hi^BjEZVj+2)Q-e>i3HVb@%Ae~cy{GDwB*`h0Cv&Pj+TI;}!;>?U9 zZB*#gygLjAs*Qg*yRJ>Yjgp(~9`y6BUjn!%2|{cRF8~pQEUY3<2tfLf-+)J&vhQ2R zIRmLf1&?+GSq%mq;Q_HJf&KZZR2IF8EWP%VWE~YH#JbS7xv=^;VRBVcN4r7{cVT=P zeSFk^#CnMBh4R{*SRV8r`(5R0%Inmt#9i4}l=Q%9*y0po@t_ZemH=0tJ1n4ync^>5P!|i0~LT{4%zM)%o8i_~w>P z2Z%qWE<7zYPta>Sr5+OgvejCTLP=O2lYT*+&WNo1&cTWzbBk#o+5cy3$$pjSZs!pc zK78n&iau%&^W24{tdG6+FcH3#=CNc2QyZo0zI8Qp@q@0`kK{`kXLLr3M-5kXO7QOt z_$%kxyzNialY}8rBvx7>w@A0$+6j9TrUxnomR@P|h2aq!ss)gibR8vZAsKa&+!Huk!Ye+e=MeM2Dx$FWVGws9l!BUJi!e- z{V_1EIG{Y$1LeCA&1E>5gzV{P8!k2Z;2!`u4Ujk0qqR^8ld`&}x~Hm9eNm1YE!fC7U?P!d5f>*ZDPWKHpBEJ?Pq*c%JX8FJS2p}WS#v!{Zhm0)B8k|;ev-b zS+(I#fy4;-=}i1a?IA}QwIAu9sS_wftoK_PQ|p}Lo*$9j_F1GlTJ2|hBt|Rc?sAHA zdifWN@u>Hz{Lb9wBY0!~uXIFxF~pwrEqOr)rv>#z`T9^n5W^*SG3gi0<~1wIH7n>f$oWIUqumR5(43IxjVO+T??dn8qyk8HR}ZzUVGQiJ z%c!`^Xt>LN{i;!a6Q=xTNRX<3^vSc-)o~qTvYfMAM zKRBWKaku5qj3+K>C~MDlVe?nZA~U(2#EEmEPbkg+aq(Cx~_Yt44K_{x2kY|@MO`{>j0;VLX?ab11 zxpsc`^82}b$Vfo%7!#kqDqzMbExCM4im>}T$v3~7v`-G1zrKbInfa0mdLmPMWooT$ zK(44o+OkPS&ZM=RAuqIMe*N4@^~O}B;r&;AxhUC3AlD(fOLs8HxjB!-??_T7o{mX` zO`OUYQ+s&mxH+E13o&{2t*{{YTrf1+R@lUbAu3EqwrOmJn@X0^-4WKK}Un>q1sGg&Lb!<1dIL^Pf~+)Kuybn~EVU z0V>?0N}r$pw~E?2%62DAm#88UL09>V!!}zef(E#=IAzh9%*?mKLiM02^O81ok?V%J zZuplA8-}^vh|i_JgFZ75J)^pdb?rH*=Qj*{$Dz7KafQmOgdr={@gI@Y<2M{z`+ZXo zBW-N!DD!?Q!EzcI8ZtD4rX)tmzdZP1?mWROiV=es6S5$i3m-rR5bp; zOimX5sUDmXEG_0z-|4Y(~a3q&TZfv&MGkCtF@~k()FUS&F zW5FH&a4t4&We}{m^z_a?pCrD*kmGPPT*G3Vp<411Rr}|W5wt3;ZH8@nQOw~)%;u;; z#?BBqqEWWI3MLsCc}4nWKx~p9ytI-|BZT~z5+B6H47SeA;10gMDE7q5$V1y99Y=(l zN!yTA>rkgXFesk4okJ2}RXAxi450hdZW0xwyB4QSFC2YCdJk}6ipJKSc?ab>u2G`r# zF;DR~Q8z-8Lo{{1urL4L23pv)xj zq1QfWL&eTM#>M`xJ+ODidBd5uzMA>|=O^yLnw7iR8A#V4Bv*gJFm45VXV)h30()3d8aBnBX z9dp)Yg{(f;2L!5vgZsSA9Q1IG;Ig|!?*iWIFs~!G^M8#Z2X81OAXTCNCGI*sfPS(7 zS{1UN9!Sm)2%^vM5|n9u^bc<+G zu?Tij9~L%Y-Z$R0NvKMp{?h{x?kig ziTKSt?ld8ul5IKZG(kK0E8GuZCXifKI{Bz6Z&GDmVO8P6*;oPoadhxx>O4+*bw@9F zE4ihvmo-?=9`za7%jkO+{yj{{Z!=`cP<|lC5!KageITbEjyGe_4XLVOlRM8G>jidW zo7-@V9tx*euG85tBK2mCeJJqI*^}@QkPT~jtvoIEiNI82eF^D}{;y1Lot=tN_A6-oK~V#zZ48LnXF#4MX3KB`+y$|#RtTtn zC-Nim0`VlRjnFDEP(`0OVQxuvEU3{4tqs_yV8F_1oEY(Zr3uO2^T-%t^b`|FyhG|e z@=FAQ|CksD7KJ3P8f!S)^NSd$vjsc}fYGnSyrsArH?QiFHzx8d%6Uhk-f4#xX2Zur z$A_`qUI!cqYK{B_2|xq}Kr9GAS|D}rH(H>9z}3(n6bXbEoRQnQlerHC+J6hjFb%vf z$6r=|eH1jct4R@z(ZezqO80*LdA_q<(wG=0qNswr`d~pw+rtvm=3#y$Y-@oBWJFe9 z8KT*XO3O#uqjp%?Chvmy>3c26XiKRm4oz>hG|Ma1J-Czf1G@3G~n@mo_6)P zSRTP^Og0neIVlym^Tz z?-H)=TBXwPgDCTsc`YQ2P=Qab<(?VmE_MHf4qt+4S-`r6sN8C||3jVC=tvw}!2_ZvBBLr2pbsh(;BXZnXqX0ntkav+2a8B6%eaBDYLgGfsbkD!_w%5LIakqE;Et;ZdWLEhY3|V4cFf*ODtVN!g1gKKF|Z{(BPZyd;RV!bj;AI=zZ+fRjgh6ui%t67I#Vo#`C zqf#Tkk$esF;QEDJMkGsl+v+1$(~0iJva$y<&*6)yQ)R1Q+-;+2bwMAD>=8OEnzLqP zAI5h`DeYeZ%%Egv!uWC_lPanC3GTi9*)&^4b9{I@?85loUFv`k`p^I1|E_Z{47ZRx zdS?4O2=58z|AQF+!yx?+#-9FH8hidfsH{1h8fIib6k2pn-sO-KioKYrw;*u%b93E_ z|4`Z9R_~Iu3-~5-P8#Q_Qz;HE>irg_i;WLWFHh(MIDjzxo@zihV0P=cgIwTa!-o< z59$zz9Qcnc_>(k_c5?oIWM*1c$>IVpTv9XqYFg6+q;Yq6whO@G%ZC3Ihv)<5Cf+) z(phwMM4x@xczT$n*J3*x;kwo$O?9K3UF9$bd#SpxIPN7zMK|z_er55eK;1*;dw0^o zx%+8X)^^W_3EJSM)cf{Go$Lnx1?Y0+?C0bJ+f@)#5V9t6kD5=_V;zfL`h9=uFPAFQ zYPq8zrd7B2ASQJ}i<8~SJp9T2)QSw`P2?T{pi7C#N^=3`%MteBv9qNcK+@y6y3vD$ zh0)5RRo~CjU)UiG9wn6nBX}A5-RqnC8Fj6X=SxP;o=+KdG~I6=cOJE8OLUKCOO=C3 zIfI_Cmxh`f z)-Bux!jek{LHNA50(TeQ%;h)8BTl_>tfq8@h65+i_|f(v%6NhzFIgnnLB6YAf9)Lq z2`&aDq&m{*uKF{%=17F$jKY&UFM+_jRbN*8kN{xOt|{n^y5ywLUgPSc>84jbviHXP zd6snvV~7u4T|B?#Sz zM?`1v5qf9zSIDh4q^H2{dG_xx#Q;^Vk)g@qScebW{ZfIw5^4cXKzPk)3(X1C{jc7k zsGs+eo-?30jTSyd*l_2H`G>V_?{=ks+=5*cE7UM`PJi34EI_p-PlUL_YwWWp-t2}RRT#`)SQBK2i8ce-tW@`1qS-ZzCaBu#p4{Mcw ziu+)|(SmiyFsvs)iq(zbCndd@mwhG_;8C@TTO#-^^+o95ikel5ra18D0c+3bm*(er zeV_`7uHxddrVTwiU0dw0RV#$8`k!AC-No?>+P*=NNy{Pgo)j>r5i4&ZCh;21xRgqP zBP8NTa&-j0l%K|T*b3Yb+k`Fr5Zm$=OPz`Cmfc}OTk)qx=Q&FG2tGgWSjvt2DT=&8 z1NtK$eK+8Y<=|wcU>>aY%<>y>bPI?DM?lC~TcDhu>lODdO}wTBO0p2e$Awo}1(mTh zgJU#|>1e3FiazFgw*HiRW0fX?U&3@_bRg`esBRTiaOEy^>Q*X=%jw)W^*X>IiX&{g zo7)7(F`)=Pz;+k7QRxd?dbfUG=y_M=vL6K;?s$`W7*6Pl+{P`UU;?;AaC_ z$V5#Ne0Lld0EiaN{6oB1c+ow6dCm=yr`*Pd+HL4ac}YkSB%6v+ z1x3p9*545z55FqbU5UaFfY)JC`Au9A?N}TYOgYqg@%J974$l90|A!W_>6{8`>N#Hz zzajK1t6yGA6!^LEF>CA%wLYCLb~_aE`SKC^8tj_dDn>%sf|HQZvJ5q&byy?h90f>Q zx>_encNpNUj=Z9b%OZKXy$e@*oj4_zcprZ^&dTRH-Yg{SHyw9dvL+LJ(X9R^G1j_D z9W72(9u1+L6ljl{-WV!3PZ>;p22K?OC~|t9tb*@b>|#|a2#|-$BLbNV3 zi9Xt{PE@VgSS^N%f0W5nwbjIkRfSY)5&=EUAX<-!tr1iv0RM4diolRx5^nTsoHI;> zVjyy~iG_&2O1%rxfT}me=&3HeF^J8UR1RTGevmB0A()%pg(-Cud12`|l{*wVDLHG9dAfKm?a^HtuLqq_LuK=kpAqr9Wc9aLJL;;Q304IyZ*_nF3 zYAZ^q_|g$&$JnIXg?x)P*@U809943jr?#}MTsg$jFZ;*i{5)NR<+$o$Kj@^QBrcy{9f)tuG(WUBSfI-}qniofOVv*g@OXMsa^9i! zH666`!qvo%4GShH`)*CN>eiW*V9Ow7zIZN{7eq4!Wp!{Rb#UqE?jXR0BSlY+C}x_C z^PPDMf~@T501|sErTudF(J=2F;sX;0vVe`vvdO;<1 zM+&I-7@Tc;wM8Q5ayW{m+fLEQBa?iRq}zJi@EZyuWEf5f$J{rKGt~rF`bO~J4WS|_ z(0F9Zo0VvHoqY{Sbhzq!?c1qaDHrL2`t{GMJ!^*pdvK`sr5DSIaQR}WdIM97FMa3Z z0~-sCM90|1tk*D*>Q*=N>KwfXSfCR8klg7xU`oS_}(H5f1|+=QJ9aZQGNc7E`4KaZRfqq<1l+5u zAe62ckoE*5nFuz_NKqg;Nd7?bN>7=Pb$q@9@$8m?zD+}_tFbrSvO3XDHiz?(uHn)M*1a`ZjJn2`RsWN!yv$c zf44Q93np^%5qo~OWlYW}EaH-1A@Ybq)e|z*nxNFejzs<`2PQ2iyndty{~k+5;I&f^ zV=ouW1JWg|m!@mG5V-nopnqxGE9ltjmSAf(;ZdUja>0O4eoVvrY>`f;l*UO z);Tt{End;h3*JAie_4IiMdO^^zn%T`4^=y|+fQM9o9gmP?{I5dcI)z!$?8VI@W0;< zs$VZaR;Z2Fld9)eKr|yi*$RG5@fU-fAAy^HZwR3kRDr2r5&NC)KJLN+u@#xZy9h`} zBy|t(X?v#{w=3)n*uVa$8Rud(sB847b z>N)6kDJSH;YW%u+`3l|en$(xP79OJ;VLw&3I<;lHe3`TyN;*rSlqaVBTF||@Q!*|> zC27o{&uGc-k8A*yXx@TncNWq@ZdfAnZ|#Var$EGM)M<|(=Rg^#I!Qf4zx=w$D!u;N zP8nMh!97A7LNlC3Tw%TAa1ZJ`I4~2NCir}jSIUjq^MyO|ooKPo$*3cWpZd9}y?M)9 zFH7>4d0p3BN3H%!%`QW(Rsl4)nhs@KVq|YlL1LG**g320Gu5jzw@*WVJE#j2MNJ2- zH@YeTR{MjOBqo?;zQKBWqqEm+1iaUdt_pI?1!BtQ9mEmFg9$F(kDOil^J~R{n!*#! z^|H|Tomo8it_k?$Z|z^bnu2=M)xL+x|&&1y$)r)kmtzUi#rfc!$?p3`CoOSpNL9+L-}8xWrF8Q zJA-*$>Aqi1^*Q&|9IseV*>M3`tW%yEOWYmHwbJg>15$^*9Cm`uy zP1*s}v7=#~%ihHZgWq(c&Oqx4RF;As{gAZ@=i;-!r>P8G{`;cc33YG=23B)FyHAjyB4HV@PDr`GlTPjK8-F7pN64aL#Jmtp*L&eg5H;c-g=OpIp?chZC#{aN;xdQA{trL zz;K9?<3_j?j}GV_W3D@iY%kt0OZ3OGHvDD16rg7pAMSG#LghN;OvkZpmgBes{0_Zp zwtdkx*)=*_(-qZmb7@M=eOW;8$G$a+cA&E?C{#~P%(to;qw}BI)elaoN9S+9df$#L zozJnYr+{x=H?xSXTfXqm-4Lqhm=od4Fh;(5djVu)L2sZAT(o2AY?}!TteRofyQYhm zU$MxR25ih!Lmldw=jL57HjXVYK16RYKA@)R9S<^g{tMG}O-JsyWFdA~GuystnCzO# zC^d9igzU!F$V|hjw`&|hz4*gK}6e38e z_Ci^>uJiyQiKAe--_OhOZXK_oy8eSf5tXpKKT2I6_4zShXR|tQBW6>e)IFZB4bb_} z>LJCY!iz*K=HZB=a4D<fthJ$e9Qc#^@@L*6tanqr~vecBJ&Zt>XsVq;5vjl9SdVCCtg1uZn5-*PGyHRlzV`WYG6ywk$8?P zn4|`V02k=J1-pSP>F&6Uie-_UsgBTmttgs2prkh)mj4wKcKh@PhPa<-K%I^oX^%`d z^cM9G43qFU8BZ?&gW@?$Hp*SeZSbMw8qu!;U($6twS)7k+>St*$KZVXv9!aH{DQCS z9b)ubbTfhov}@RCK}e`PWF7$v50*7#SCN{Lf9x**M_}dEZr|$3os{Wjo^-mM9lO zS$coILs_CnOQ1y$MawIJxYt7JO9wIsLN+}<)SFQ@?JXfx0>GS$^6ZUf<`{u>8Jnn% zL#qzSqi_9pKkc)BbAO=AD)_P|{4y%C<^{c`BtOvgtRe3L4e@sw7o(^X-KdP7dXkS-z_Y^>^V^p*E5=*(Oiw|`7@sV2U{EV7P^zr(+ePZB- z^pBdNlJGDJq_aK(^aZNTeR+9!GJW%?2qf;9;%OM81d*SyQlIu_&Ikq@K9#%dEsZNo z8bYiOY~{%yW0PoEL{$A8k3pcNTwX-k`=Ak9BR|iSSYp|el)R!@kto{Ij8OeI0}_cz zr{*h__rVVhEsd}yGGhUg4rNR1&&-UXOl%}iPyTHE(Tg+S^J3tM!XAP@zCd;TfM-YL zYcZUaOlAO2_tga>Ld>1)I_2-s=_-B!x%8mwiBz%} zIaP`&r(90D1hLZsvMe0DQ7pcFcgRt!2@VF2`X3|sduJ(Q@>R%fqn!}^BNn`iRg&ZE zQr70UGF>qQ0_Q|GU2kBtGb5f4RUI3SN(U(bd2bUIT@KVtsnl~y>-AN7b>@3aKIb#` z?S{uh>5=0};^-NnbLfLeccfP0Xg64fWSL2_wnJtGlLG{qEZ3!b3225+T%a{Z?^3)4^I|>e>B})+L^1R^1-+nvU&cb#WTn^C;WwQ6b4t0hyDb=6 z$Q04>{3R_%9ESHcRVNba&H7J+&3{W);Let4f9P0+dRx_x5cz8V^4X@C5T$4dxRgo3 z_iLg)15Iug^#43HVK;8sTd3fG&GJ*XtCspdQP+=%gElH}%XQse0Z&UFfCd>Feyp%; z){i)tSA`JOL9Nl&YXNN&r_cg(|9Au|am6R{Y{) z<7**GWZe*pD5F0uY2!Hz7+e3?YGqrPF+uZ)3lAByKRNS;v@M3=oq^#*yBO1xuLOdT z5%Jg{G?~1B_T&8-SD@Ao@mJSQVDt2zyKJKjpq5D1@oILl8H15Dzn?}Rin#UB;*XiL zv?;7^7PT`wAjrMB-NDUURtU_&5@r648%+sS3{C*=3NrxJHJO%`cJ-F5EA}iXB?Fhq zXV0b2aB0h1b%qV=*i@TZZW>dssj*q>5uKJ5dhl3bX!3~Dyc99E6^4l4b}bJ}{?3ir zwNP1^S4yIP!;d{>eq>x+hC62yI@Wxul`LhHHcSpr7E`lsSTnwJsZpHuYn^CksoQD% zTnrFIREHCF;U*4EL}zrPnIH#U@M$c0kyImJ-YTNDB^qsZV^fOGK*YvgdSvM{Q=Ki;a zJGJ~0(TbdLk&Vi@@SqV$HTRl&ioaq{O}Jv`ld4<;QpLdXh|zLyTtIdVrrl63d%xH) ziC4X9x2)(Y0!vjVo@H>v?$fTCc?YA9C^oE9Atz;9RxGgSnb!2*={5Bmx}SCGx=g(Y z>kK`{pLx>yT`9RYtZAp7wRcmln)_s1Quh_$vl_aw+{gciDsC2Q?ADH|E|w^KKDCVF;#4`6@h05jYzrV^lhz@cHf?f>Wy#bJ`*e<|tkk}1iMq+AIV*;A z4*LIp$vb3SntPOUNwDq-D=ZmLKmP%oK-A^58oSIJt9nXc2|lLjL6FJUWB>f?Zr;Ow z5OBzvo)vE`)=1MEL=D|Zlsn5nHvTuVBp^f5@`Oc+8oMR_$NZRv|CkSSA?}9GZDK|+ zrKxqEQQxpgLDaO!Z6Y32fJ-OaZB|9^a*Zsj$D+~XI)zJTJH(-)<2o{-;>r^svmjt1 zPAMm`a`)$t-hY&A8^RW*z)K1fv+}{yjzzAH2DV$zzC6$%O>z^nK#mSZm;d@;0p_@R zgzTcM8Y!NWnvO4&rE@Oj2WN9C7iXw*%ycFc?AXrGEFO7T^(+ao)suR_dR}9i${D&f zz|lOV06S`qPKFf@3gt7eif#qYK@%6-w6ik{oj2lnAG4<09dhB_~u#&P?#}_R$I^O=tAamEliPAM^tzwR3X+lF5 z#iPHQ^pT{EX01vKv!ys`6re=Q*4O)fK{?7Oo#IV_3q+X;?8Pm;F{<;bpdZ#! zswq$ZEctNiZo<qkF-`wKSNDYfL6;N!z0$TW>7k7%={zvdlmE!>PXORH@i%c zPqbp34`B2)$0@4D>|A*5j5=*Rz7#ur-z+*$HqUEKk2&jT?&F(I9lt_Z!hgvX>(>Wp zI~GdTt_nRiD&Jt@v)8VQo!Kh%({Z3?WU|+ep*0p+SxnKfy-mawd{-%9{w}S6uAQak z@)+J!aSzF`t9Zc$VSuHKgUC;?ZEC(MYPJ>Lhe#gME%)rA9^1+B%d~@=?khEI z(X}DdwQ)N%&dh-aA;clEs)Z00qbOJYNR{g$`Q{EXPlAb| z3=VdjXzVejrjG==*Y-P14|Ry)ibP*m`mpJXix!S?hh!_N9Scyv7%!k`$7zBHprnl` z`+8QP?j@q`-Gi+8&{guai=3zpPR*B=@%?an6co2 zB#!|cZQP&hqM#W@7C=0Flx^hJ(Y)vtMs_2QgXKou*=j%3EPt~)@W$SFJz90-NrhQ5Tn z6&)p%PO+}Qx~@y*h)LvHquGAxOZ1EY+AF=A%Qw97&I zmp_!3rG|>#snB2>@K&n|sZ!fU%9evMLgum5BNFV$W}W@gR}qwX<(B|-vp9tmfRvF& zV7dP(C&31dX1I`Sw0sgy+6-G#5*ha`-?4gdzZ{LHSo0QFija7f?OLKVZbi|Nae=3# zo}56cW{T94J+wrP3}+xeTc32t$C7ElF zP4NwEu_g6g!JxZqmJ;~xHru0nv0CS@k+Jx=E8l?|wKJNbp6&lf)H%S2&U}A=?Y(Q; zwr$(CZ5wxO+qP{RcWvAD?z_(~|Kv@2PR~r6Hq$npv@_@PJ=mc!LPL7e!>9-;zY=Lj z<`$;1+=H5?Ww%6);DMz~mr=PVLOCQ;Oa2rOewC!d^)_nXMAB z`5<7~y>%?P^6IB^*ask zXj93Nmg!``KM@|vu&QHuk7!$vf-{XY!z@=M^q^*z(OV+)!1lW;7J4XRnoc~M<35sp zQ08Qo<67Xp5>;{o^mBRJt5pm91Ls#hbM<+v#&`JI#jL!-(6q7gjo?(At$}S4ll6kXqx{(tI7g14qCy@&qX_I8)eJ|F$qPijQyg6I9tH!i zm9qCv2`_*XW_@{A&3D(lQ#=d2@5#4U-lDEmp?Mp#(=!Vvyblwzx5mWIb<4{E^J}iV zJ{r3|HvP~VyMJ4DztnfXtouJ2`#v@T;q(LG>Ok?vfbh(rdBZ??$56fLp}p&9Ug1$+ z;k9n_sc-W+A}%I;g+p3Bt_QK$^FD5$(n!&HINJRlx}0y+OCP}a&!nQ>(Nt+>LFxhF5QUqy?z106lX?Y_8FKg%@*g0;gGFBn7{}4Jq@+xXdTo4l+z}aQ&I|n|oS?%+ zuOl%>Y3GGW%cK7xj2gscNr;3ydF^;>wg3Xp>p4b3d%qOs4c-Tj--~)6BbE~A^m-bmjoljY&9;LPqyF~9eVSOg} ztYXyYvr7&gG@}GVmbHt>=ip6pNzO{2>j>(_o->ABuLFT-OVm=y%UB|6o$7A98ns$; zGB$=@uhSLZPiNSvNc4-1bJY+HsSCTpjEYi3*Z@Vt2qSE%q+(nawoX+v<_=%2$$b36 zFg?-S@0Vs{;)!>UvM9>w$k7Q~zjMjo$%UMcGHq<6hUsuVLUblIzAY-o-qHRgumtnl zpzGIUi;F@;-eiyUy<#3FKcFdi6DIIg{Cnvi4CBGh=$y2<(>nSzuu%^{naAuE?33?U zzA2+{5@Rv9{hND3i#v_XDaN^OMeCA`drQLmP_GPiL=}g#teq>cl<0%2LKE~f?g$n{ z%4UDptX)pc7#I0+P{qoTk{%f(6+Wchss6;F|ds>$5cY zU?Z}d+D@WUlDU_pT2-A^1$~f2)RCfdnzuM~8PQ5Y1!^AEIc4kk|M*+VI(qYD3fgM& z+NFViBz53~bWF;i@dOEiy!Zb78 z*Sq=8ztBG>$A|rn$eBGmucVABfP-Vue6Nfg=!f6DQm;2+T3z z?t~i*fyZWq-x*iv0+Yss-zmRqXhsA%Q!bG?chc>0YgdqJY@`e479S89)fU>o=aNte zO%5NBs~2fDJAKhPd(txJe9^gWX|6ypLM9^fgP#i`b30D4IaCZH^M-IEBzF6xVOj~C ztXmREY>}uWsy!j)I)!nGs8v$A)zMk;l3<_Ds3MX7!ax6o#N7Xdu0j9RGM;+HVK=_B zEXXiSrJ?XYE$YuI!>L#sZK$m>z6RG4^`!*j8q|y=oqO+E<|ahE1{xh zccv|63IrV=rY&Lo?)ECFQ~Zaal0)D_1W14S2}Ah`vr+TXrnZfJIxRU`utn&h{)MFu>P0_`dmkivTdfa^%NCLv*ppx~?K(FwP!l7#dhN z*_~<7g@1M~R$ap72oVIkOavi{z>amX08^fL{3E-TJ#8n(zNw&Q>eMy{ub5F2E<$tU z1HU$_r7-LXu->AJBT`9wOa53nPeg`ZbP+8pzC3^>v;mc|GQE%Do6&$G#*m~i5LO)c;*SXrGUTDZ|GvyB#p`MgOi%c$ ztNb`2>1SIJzVwuM)UWh0hI16fZ)dzid7TQM8$W^SeSLzGgGeADy*s-HP~Bt07!LGm zUKaIQri_}_D~TR#tt6F07#9n8Xrwq8=*=q%Js}{F>~3@LzE86RjR&nV0?_d7DBL_g zD#()G#>%{g84<7Q%}@e2Tz#p2ohbx}2QG@Mre0&0xmW_84!pjO>+WI5KC!MgR&ap=eByBKD5^$Spi1_8!;J34_5Zn4r2CaA5Vt602*`0BDjrsTg9(FY%}$Qa1vln zD=So-TlpZ5a>TB{ksdPqA%0Gik^fFmi65Rf>MRe8N4(=xpFA%~WHS1j1(na2DQ zN6{h|?0I8H7zlQ3Wz59HPj^X7kJGRAksdYJ2sb?@i)Yc5##KlWJnvu&_%KESj>z6O1Hq8?*(F!Ukb z@>?3*$@iRxnMTYvn6s0I1if~eKq@f1l9aGH9M=SFvA zN=p`*@+SPqM@rx5G!;N1GO!MCtBo}cZbb?6;YH?T29Ip>PM{@b<^Ttl~$;$cgSAw5Q^4$rh|AtPV#0Bb$ zl|!eUCgo{h4RG=xZjHSn4c6w-d zXE--5>V2mapD9aPFvOlB`z@>dPuZGsiE#`F$0nK5QR()p#2p&|(W9v>Bg*NoNSDUU zJ`1dbzq%3`v~8ERwVFsza~o&cIV_Cw7y$|rFqLOmHqe+L=J1YAfVf{G`sfN{b!Fd6 z@cD{`i`T%dO}_LUt9=-%=v7y>e6r) zFh;yyh<^Kuq=icW;W`ceI*p>OH`M*qo(^&%_*9mAtnvqpKviDs+79BxKvO}Fel9I$ zS{O%S?BvOAx&^Ncae7%+(k4{b4kb(2VAoOdOLSPly}u^ecgzb0cgbkgK+8Zi{p?nR z-Ct0uP1(qb$!ZstD{RloO1ob&5hh7gNNkvJbs1~P?_~VNf_HUj_xFQP5CJ*6IbH|J z_Ru!8)ACejrOyk0GoEQRg-Kvb-Ou6QIC^5SuqFCs{BiS~&X>nB@>QYtMD^w4u}o%P z%R5J5#nE$-^RBgBnI}U(L=rwql?z(o2+WRuc9M!6>b3!qZ7wk~gtC5mkq_)B0tx+-PVS?6`KQXpEvr@|&}rsaOD) zsD&x+CQKsUXx&=HXb}^zRxS;Y8rwrej<+u(cx@2@V?LgnUHr9@+1{O+9m=@echmbiX zh;*Vlqx17}HUu`3QqM3iwpaR4iL6cqGQ1gOLy`u{fMM2cj!a&AyMrVbQ{*Y+4l8|h z-vVC67ArMfOC9PMHJPk6g-UlGb%Z`H^9sdA2o@kOew%7N1XD;s`sTNsYQVTkg?wP> zk`n8qff3aigPFQYX#y=%k%g|Ok-0Gm8AQ48q3k8z3_V|){2CupY^7&Hdj{a-2VU;L zoqo<)3S8yH$!=548EmN!z#TS+P$pD{YYQWqcR&wx2kbzmBar!~vR6iAzo<}wOLxc1 zFr%X2!9N`?chAePEz9r=Q72zQK^LGZo!vM?uLz?!Q`5&W=(#30nFI`@r$MZbQ}DZ; zQ_~PeFak{^T%#H=ahijCoRgrWdZ5=URuw3DE^uq!E+38RYf4J6{cj%wkt%-W zbJ@HwSw-4-&7jH z&FKB_D)jH9xVwb14^u;@<-4aYZU*EfC$97oXeuKpQ3@Qfeak}YSd8kFv^~`8_ekl&L|UK zV{ipVa!IrtLGyy+-;`jO1TH-3`3h(9ptq2hy^cxkKK~{`0y#whM%2qt55%&sQ6hUJ|a!j6C*Vhh)$ z*UkdRYIc$=NxI|22^I)LD+tZ_d_;wzrUKzg!M&yjEO~9Q*2TdJ^u$QSr#Fg&k9-;O zxa!KgH!(VO<)!cF8&cudyHJa-o;-#F zL_)@h9={`N_cuk$&iF)c743N9Lif^hR~vzNBLzivM~U*ds-;U3vyrduwZ|QvB$4L; zR?vW#Hi72IostV=aTdLxffsooFAuWB^uesxk5*#5eXb@Ad{R!%7NxZ??7@_hjsZ!!E~F=yn1mQ8 z9(ojU&JV?$Yr->-s8N@20gZ8@jGjn6AxuGlelG9i%gdxZH#{0tJuy3eT{Q>3nSEbO z_%pv9##5DQu&z4HVAfh(ZPM7XNifJsVN_WbYJs~CI_VJopLv=>-B^Ul(enq6Ri7!2 zk*vOO52!ry2t^f)TNGm?l>H&v4z97vk)BaB?^?)nL+K;MFoy1o__S;TZXqW~{IAPW zHT%VsggYZ&BY-oM&oFQW0ULV`n1&HAV^92oGQ>RBNWP1DB<1|zl7z+6n{$?SE^!5Fu!sBM4R^VeCc1+UG zBFZyc@(-y``-ltFKsP#=#o2PJy!HGK6U{{V^DG{KG`NYxldGmv1aeQtr7J=KFXdw? z8c!glfqcQOW@_K>nHH%a%i2*M6OFm!(^%{L_hJx+$ryi1~!G}!SlXUlHv*9M=b~9+qYDLW#eT!C6_FPezi&A*L93++-PiU zalVYYeLAfmvt3xPYG(7{mj_%p>Q^{?p%M9Dpe_`gVfU}7$+|)aAL^P9Q_qw4^p)f{ zrFGrGf}tmZe_}i7ViOD4e`Kd|FBb!0U^}%oI{BRj?b+)30^9O{Y9gTS*3k>C4EM_z z($S-ZiKr=CBgn@nAjW(u^9puh3(DL90?8xVMzjP3KzB~gD$YB-OjZ4QUmkjXq*oU2 zw4WARD=IJKLr7-tR|?e%z-dgd90O4-w3ot;;bIFSO;-@dFy?)UI_C51tyz^9p6(Dj zg6rV)k)`(GK+vtJ73`o{R)12ozA#%>_nU`r`cQip)}geza=xfm_x-k){9v`XPnw7I z`ceIs*3af#=m;;9xzSZe%}Q6$ZRKm>%wawS-Frvq#j9_(<5>SKQF|v=gE2Btam=&< zX-zchfa#_LsI>)y6NZ1i(o|28PD*9XJOgPC^-MLBbWI`YQrvci+ZJ_GA7W$0do4Gt zJ!wW_-s9x+Ohelc=yl$+GDiiz(LhM4NHtJMjaQnCB98Y$yj}dpHJN?uc)UpO(N^t1xiyU`?4E+s4c{7iqR3v*9==+4 z-qw!yT`<-ufo<;&+>A?hWgq>@FtPWq@YJ*SQ?f3uEOxd?P07VLa(^6AhpY%v>kCfu)6tw_ zh<7xqLY`o)B+(CwIc>Hv=>of})~59}sv;S2MAKW~?|6-_XNBL|zS?ISSvP1p+TXlZ z@Nwqph^$k4NLrEb4t1cZcmCVD@bdH#<|!9f8>{?-vU`zQo+_wKMqev){h$ z+Ud>NPBWXEl9-ioP`O}>u}TDdGuEeDv%s|$uCrD{T9>J`eP97}a~s?Z+Jwa%;2exx zl()O0;kd`oidF7XOK@X0zmP|ANfkFdG2!(OhCBlnsJzSScswb>8oe}Q+S2Vl;r21`r}E8_a1c-H2I+HTvjk8u^tP-`{GjUgNG zbVYTP9o!v`j*Y!BbxeI1>@{87Z&<}7?B>+kA75XCZqqEFd!XQ>gZl*~YU?rKC-G@y z9dsk5$Bhq+SG0qUhVay%H^QD%<`(CF{HpeZ8FrEH+?wf3#&-7ci_iXk?c1VcA~$B4 zQE4APYTui{O$vxL-i?Fto=W~ACUYPkU6O=zM8)&aJR``tbpX7At!4(!2Nfarlb%A@ z0#b2{Ty70nG+kh-9)T*BqrDMhBC~E;W2$EL%9|M~Sq)pt@HiKjX5EuS0{^p|o?<=@ zR&8mq!1?c8IB$S}u(Ak6HT;`ZB6nTv9})JhJ+yxx4FnLaeH$qME-H}$1y}wpgv?uu9~_{} zxF#4M#u)YR{sycNLivuo0Je(2?d0FyTnHSRIAdutT!G86ejv<0Zo`yU6Xw!Yb6+#l zFB4{xL;UHRY3|;rlHi;NY4nft)P&C=(FV=seL5l!Wq(XtKlq-xnOo4WXYmo^-jteh zdg0a)((z|;MEgtn66yL<=K*B?2BI_|2(x16LFDcf?@$VV2USTqX^Kh`c_kf$xqVYf zJn1tvm8m;9hJ(pyci}$UOLF~^bbCfpW#w`p;A+HDbVzK_D;wg9-gLPWkyR~^i79b! zPY}#IxCWLVa$vskJ_ii;cwT&7sYMzA|F*O;=pXWh8ao7cYYf!o@+d#IgAnbt0>HSa~{un&@}$5se7hVIuqml<6%_W?^mk$97Ce7 zY>j<20vd%!LuirMAITz;G{UnDD3ct$zfB-Zky*c)R1X7g8^IThqQhSS-7rAR8^MIR2E3pLpE7_6clLR~2r?HXVeL-C zcU32Sr!nTG@PE0AB*kP>prkogKra*c#v#lad_4<7Uc}jRlESzQauUNZAX2NR(r{GR zv6|kxed(q5-{A2E?d<%mZZ#nhJAnCChm1Ke*6)Im-nD;|C9a?33F1pxd1w<1D{Xnb zH*itLwu#6h+MnmtS&mo^t629U$3YDrKzE9prHmVpvx4_Zs zh1VB(y|X8l$kp5`+kz(ZA(yN+cl=7R^P`PT-b@Aei`X2mLu2AbOEA#O0SMS|xI4HK zrdqa(oKpZnO!6DGgR&aC#vQO6Bj5>MDjG}(7;zc53RrU1czBuYgSiGeQH3kK@8Jp+ z?DT;-8@v5e`*7A}cykhq@fXl^m1-J()q2ykE<+{^qYCUW)0&0EHY8o~LxYi?>o3N0 zkwr+l_K(IV!-iEzyT;?r&|Yt7-0Kg?8Oz#HQ&KHAmexsuMG>kJ;$gO2vB zC*V(pSia*2@VE}9gsikRs)~kGlU=99bF2)_p^_fDBp zf)AZU@{!)WP}~}~h+-2gH3{fTK?eC#M0l$W1%wxj2v5|e)xY0rdG%zY@dz9!@*Mw~ z8HT!nmIdP;)qWX)@dCEHb^gRB zZ;_ocs+UrXb=fPoJC(JCXev7VPv^F{Ww*6fk?o^Zp`Sw=BR&Tt->bT(Ru{2@);M91 zwpvo?L?i=dEnUZWqlrs3v50QZD>fjajWTT$%}rWZXSJVVxa+ZT?`Wn%Mr#~UZ_z+Ph5-VUk-^)9|vMm+ zaY_t$Dgi@G8#QxAJ?*3luMz^bD5_dZua~_tGi}iPE?u?k{`eBVQAfuT6D_=o-%D1+ z66cn_i{Fdn#KrCytCp>x?|}8ZHuJ?t!Tbm_{(C_h=he`;ndtkD`mJ(4|G=oN^yzZl zK8pSN+avn=x$@1=$oL67F1`atd?T^7lNtbw;fH_6_WO6?0W8(ko7`$Y55}7qIMjXXGMd=6^S5g3%6qO6@tPfuQfpF^ABaPvuq&sO&? z*(GY=&eIv!K<|WtNy3{mANE%<66!GJ2}b2nuO39O8}c$%j7$Aw-FvVSGvZVC3#SNG znT?fh&31GhD_p)y5NB7C+C;|0kgEA_ncC|hoC$)T{V++KD9m0fq@nRef$D`u!8@#bfdc^IEP(ZW1>{t2O zCI6r<*~)EKpbFJIwu{p#y)pdQVoCux(Q6B)ok9~ z#p|5x#~}4nUCd6*_)ajX>HKflg*EZSD+U)w#Fl&`;eA|9pgIEbCHic~>4l(4mP9p` zaE^jYQjt{kfNq_did*NcX!mT)>g5BQMRcIL+*Isyy0EdbUeF5-236pZETBjaMbi++ zQeJWoyAT7P>I?^UK`upQ6`-<)fr?**9R^KB#>T~VTtRHLVV_aGA?8Gb`;o((_+n(Le12REIrrnjR}41yHux7`+|ot zr(3qo)7p2Wm8xcJkM7>dQLr(RXd3wghL&+4^HT4LFtY;hzr1 z(cIK`nTD5U0br`B(ILzUl0nWU&7HZ4J`lf9Kf^-J8&)b zZwh-UX45}3GxB4%01YRA#$yZrH3mF-t3Ue7n_#By0UA93jW^ZLew$lEvPITEql4=| z;dRe`1KZzns~bO%zYXTh_h@`&_swb=s}i-IY9RRc&{45V!DEx|^xXTR@|+`M|}1 z?043Ap*6nIf-Sz05Z2i0Eg0kS8vlsNGXKb5mN*BCU(1Iz*2erbb6|{A3E+7R4b9(z zKJXc!?L1LYK$O%Pzo#HDg%fjJ&h9CX57yYSx zzYMF^fF!`_24>7L_FOPUFxaB0Wq#)pE7-H9Zxp_CyZ5_%l+lMIPiw*Wz4E73VWK?O zQk}ITLIc=6?4(nm{I!5XFmkaFU(tja&Yk{EMLy-Rs1d`I;M9*hFU zodh1;aJiF+sixE&{}gWc2h&C3iDzn&A+;*1gq0pG)||l%_)aL4BtC7k@;jv>oY>G# zj?d#sw_Jj&$wD+g`H$fUFAWB82_$_v49AdT2)-?MhDq8tYF2arJ-2j-6Jv!Fc6QfK zy^55T+LdoaDR;u>!h?N~6>Q1EF%4y{ek$L=JWUX(Zgn+|c@+Y}4Vp+g8Tfm=ION7Q zdb(&}r}Jef6{8m%qIHnDT`du|L{|yAdKl}66OIuSyJP0wh&fVU#hG)6ukn9{(Tvv) zw*fLY)rb=;sGeb=Av1cReR}8%3m}erq(DXHikiseFRHk}&bh z(=pWIHW5}hD|5aoH5}`dI#u7$0o{zj(O)(Zrn^|xV3&)jOI16-uEj~!mVT+H|I@l6 zAs4)E`?swT%KK@&t$V~{{;mjhQ`iK>UD`VBR08Tg9CbCA;tFt7@oI19^MZ(KrA{gE4i4=EoSd z8{OJoQ*^|ZOm7Qwuu{ta<=_JaYkU^7xY~ z*u<(}6wQjo`h9ryPASC=(wB~)P&8M@F79q7M{Pr;a9eLM`i zWZJqqR2}e?QcPy_bOUUDRYJujvV!W=4qL23*(2C{5CUf!k7!cBozkVuM`YN10apc1 zFc>_-x+sAUmP8N#rLZY-_)%oI%Fw33pZJF%VnHVJsp+O;&PRWOr2M{}Ijve*?IZiC z9SOoWu=vK$#ax4BO+ZymX;g|3LdxryW;}{TYE`ItnR(d1@ooO??-SOZIF+T^IK5CW z(h}mT!;M38j%l7LecCL@HfE0OG>~$t$wwOFBpRrlp4KTaQ^%&+amnbBGEWe>#OZ(e zC4ng|NLzuEyp^Jyr24Gs5z7f?MPbAnW9v=90H!Vp)3HG;Nbw+3Cj<)c@C`f!s%bzj zUK|ou0bVDL)3j6KFdO3LaPw9-lL%SLCd813>CGK-4IhYPm60KcCws3 zi8wh~h1k=QxDKx~z>M^R&(a(%J9`@T)x29)uazRbBF^BWqBa{hSf#h`+Ac4;|3 zJiGUNakl>3J9H=9O1z+7au6CJf`QHfF%WGVsnHRXJO>?bGe*?%&Ab*T8CEvjH}t?|GvWFK4=}FNDFYk0D_0D z_`}1nHQ)d~B4Q5mmnP$`XM~G~G|EVit-2?Y-bAlWi*ugK2FQtmszo=(jicQkV+>CE@ zAN~gMFx*2_w{A;l3rrOu=nI4~oo?d(Z~!E7+0ilUVn~s%2L!DqB^W6b&zi^DcieP3 zlUbQDCNokZ2PKEmu9MU$0VJD@Dobed`6@xt<2WBhF`8zB)W@+Twu6@ubI~B)&OG6@ z4(KJB?yhKZTkzJ13Zn-Z#12Lgca;pCQ+!-+X&7)W&}fhUdi zIa&1|Q&{Hb!fTZiHPWY4ZAiyu%p;Q%7AgqqiP!)O zt9E7mNJ;_Pe+ECiQNSiDmODZ|mrm~=Y!s_t;tW;drT?7Y%g~yp;yKv|y%-trA>{Mr zM5dNtlT0`x_M)L^*(}?%RA~|AZI*pA&81X|keE=Nl%Md^UL>1oxVpz5l`o8*5Z{c| zOSOoCEjw*gbK6_ck1Q#Td8kz!Az!Xs{JI!o&26*W-3#0GQcKj76&+65 zz0YIsM)NZAykwJ|8}=Cw=lJj|QoTGeoQzh2YZ9G;n(xp;%f)@8KzI+8uLW$_vK;Xg zjldbWg{l%VJUj4J)Ih^CF??E>0@`vf*2aO`JbR_#V3%-s0fCQ2JRF_1PnzHk6VDKK z4kl}06o2Fl{}(N8PuWjwS;0!f1<6KtYjM6%IyOwPp%3)_!2+ppD30Ha@lC?|65R?+ zB;(*B;tf_cC=JyRQ78i8sH9UT#!kyv3%aM8( zpFWAPl%y_eY#n5JPX3rK_*42LdJuw4$jzQnSHcJraCqY1ir6VUD{Tc#gxc;kbd3~U zbEs3TNWAx})}cqukZ!_eG^$5{l1DmmOM5J;SH3u}D&$4hi0p#q`NL=R0}z?E(NxM- z!fUIEo_KqTl`CeK7*V)X(B(tm0&nSX1c4vq>ZmW|`VxH?o;i!_W$j z;nZm|btP-mlNHaP_sn)YDQnbXSl!f;!k{&bDG+RkzR+S{s}d#P{E(#TwKi&5-M24~ zy4ea)(SNuAhGBFCVN`(M{(h?c4sVc)WP%$$E0C>6;aGjLLBLh7=27^S>KSBZ5Zi7K zHgS)kZEJ2MMAijgA+irAUj_&Jm`wOqn~2$(kWneKC)a~H9XU}jv$@fbNM{@rR@*M( ztrO9f7|Bk@#X!bo8~_K;o}(fZWAe9p&x6JpcGk+VeR@zMyjg?Zo2rrGt3&53TRVCs zVu;UajTXenT5qU?A?bshaAnwK4ovkbVy)J0yUC1L1cNE`gq6TxQa zdcyTcgS>~q#lK`-;6eqIE{v!0sZK?tBqK1;ojJjIpTE?J22j?FI0T^9D{ShYn&}yo zhNtQAAZ&mb**~VE@|TJYGbuwU@{l zJQrxSrqr{Db>*hxlfv4g?SLiW1PCHtq|GjDYf$(2*SY0W1^!AXp;@IFr}mFbCtBC| z#YHsX+w9d<4$KG9csBz4F-rZzKsnBeG>~R$ZJsFK3C_=tsT=VQaAxJ=!2X7wFWe(Tb&LL2J^F*RMxQp zKU4teO24=+U1k61jbNta95WL=9;Pj;yHBR75x&FesvNs$lL@ns8xf$ZRbk=rZ~9&OBdaH z_8RoYfo@fg_@}*lD^Xxz_ruoUPZ4;~O{c-FzfKNt*4Br}el9c^oI1Vw%=_D*KA(TT zZ$7=bVk-SAoPJ#{U=W_WK^=Bi!zLbBZ#<=h=l-65zvJ%$4wC{5lftE6hpk_?2^e&A z+neJ{9ZI@3ROV>&X<0WU&^peyPs%68!=)buOXA#|>7m8W#+k8;F9!|;)#UnWwuZjn zGb!sE8Rj}ReQPvxdv!U4wbl>s0-^QN!99aK_QI-;yC2SP*s+SB(hp|wK6baJT$O-< zK4}Wfa^5c6os@m^pLaFwC+$ z184XMlOI_2=4-(k`zoalNL}3~{|@ZAG38=H2FQ{}7y(W8wkduL5vW&$FQ@PvR3t3S z$hW94{mo(NKOq$@b`K;>y?<#i#+G!g#yoD{@^yW^dJZzg$=4_AL;xS=6jDxQM`bj* z0#n#hSVp*YbdG6q1+H^N;uq#lAw@@!N#v{&B8&4J;2e0NQvWOZ)Xwop$x2c2$)FqU z)wEUfs&^d`w6p-^jVI|WzmeXvqfCR)^8@*Ntwvm}zB$|Ixj682zLnT=XW4T%8juQw zw7->7CsQ%9cu_uzBa=>suLJt6$@7*&sL$?&`tU-HukX9k29HAhC*cri{lGgu&G+uT zk-UQ{Y9X(5x0Y6p*p`tbSGB*HY*W*S5rGM#;fIP6|A5Ycn0RM9D=H%*7h%hCBG1{D zE%Q2&;b2-pf@-ZT;bK}rD_mX5axyOif(mKa*xd^CNrd_*mUssJES|vnic9x59CwZC zv#L+7z?sdn1k1!wPKtXoJkRR2`J6~`0DMY<^&D?ICwdym$HEHxmg>TktCqf!+#vVv zE`w+uS>lO>)M8`w&_Yo|OIQ((C$IYX9iTpIQ5+axun+v@5kTZih{OHLBwR#-euH!JR4l4uV!~3V;C*qw@9*YHDHJ+SMif$Vf`H8W#zWM zH>VmO@|QMRL5Up93nW-xCW4D(FgD|oHdLnuV&HhU5^dhGQ2BVVmBLL1<0b{>E2?_F z>0a_p$~^O`ms``i;$vsTrh$?UZ1^O83%L|)t>crxh@I?%q`l-#SVdC3;y+_hup?T9 zkSW)cC9jdIQyV`GlPN*cF2QS;=35*78jpAGBCkUx4ma3_FrOW3j^dP40)0%!P6mPk z3jB+&?;dJCPVVuCN1=AVri_E5i%ZZ>-%TvJceHj;r)?HXHeMqbyqxMKF) zs=gvKO7)-ubIOAY%>V{%k9Cw!9828?>S_X3mv2PEq6TM<gapTExSN-(%F#R6ZltzPc9ezWP!1p>_2HMe3k3hD zHT#35zZxW%osPH`o#;IA)f7tgZ8XAS z%qr!OCG&x^^HbUrEORhvVNoDZ&7%wMHsj)ONz{hKefp@&U!JHre-1hfgIb{QY|JF* zka4GGK1eqj6~v;+-zk06dO7o^Y1;(lg{W2}VMQow1>;EQ^vs$8i3}OPma(}MAJD`8 zQ!ZIm68gkUlvx$HXD%UJ?5HjRW6YrZurA8!RA)Q#S${H}T?~e!NmXm2Sxwu}QvHM& zYpuAd!Eac)s8#Ww*6>*~g`J32-I6plkFY1IY}MhvD#PTTvb4X&D--`NjP<*>#^Ai7 zKgHwX@%EZlz}lxdRXuEmt&KYb?$^nIW7ob;9BO~K5f1s}>`SmNzZ(_aXNyss;BMlBLfXU5PpWxuX=fY$xIo)Q2^JC9L$MDJX{2!d$V5jVEDJDr8bxs9pYzfTpODx~{Q_miz^E zBjW49R|F%Mb1~TMSCG{rh@%9FuhO0Cq3naG;*(&`byVg+FmjC-)4tH`pgfvFZ zHArQx%Q|mNoX1Gx4MQqvXQS!Do3hL12ax3LwbG zHjDqoZC&ge+5J8(`el0HBeDVcg`|a{LK~?kd1M|mF&}a|trKM`Je(#N!|@N(AHrr6 zJFw}FK7O70#nK7xcbWG*i~ap*txmXLQIpj5t|D5o;>4Ja;tb{V9mFH(%+!s$#7$6q zUea9~ExbGkcTM1>6)Z(;;jEA*y@PB6v#mC6l?D5MRJ~)6CC&3TJhpAywr%a$wy|UF z*tTtZc5Kh=m^QpEw8Jm$4-gAh>e8@f~KF=~;P0;`9vF_!$| zFotF}=~jYpLt40wc6cDbPbckd>Sv`-G8{0ur-DPO5>G-75k(ev)42xo4MP4QZdVs5 zc`|G7pnehIug2yl2L*)Ub;d@)BTzs|rEPTKCYYBbgJFx}rE$-C;FMt^Jx> zvvu+3iZ@%GbeUl%J3(k0@8%^@=HcbWY4AOkqbi zdLob>Oz)HFww6XVcuCempwhQ-y@7!-w9%iA`w@ zm$gpF(i+{%dGpD5cdsVPcZte%u}e%rs=oe8J#dhf>0;NHi^)yBLu^O|7nuSzmM^)r zPmKfAC62YQ(CrTOG?Ja|G(f1I6Q@PshZu2V#rGsJp&_YZX3OTFHE4m==lyKP7Hd#Hhu z_=p}s8grefQ=?eV=l_kk_8yH1@pADx-VWAdmkSk%OASB3X>`Kf!mv=58f9o!25Xor zkUgLlgU5NC1pD(EK-rO!0TX|Uw4Zr}@~3+(F)p;dLbaWP%(%6*C$oFnMjA($0@h7P zRt+$tRjnvRh$y82@D^I@Kykl-J`lvzz~h(ySxrfjgSjzFq9vbCVd@9xqR3LOLM*%0 zJga($hVoujBlNSfl0YPq5JfT$E=hA6bRI7)yD8Klbcv#oh#I{u2Ev@D4Ek)e}3t#te2h5Atfe zLfM?BW;Tp}zI%)_!irW^c z&4xR-mspfoo&;iXdJ%^e_7K6DMLbP&XZD78T5@0F+bD+8C0f-O$yBsH*1jQ0ZcTAy zGDFpVjU4ZjxMaoL7;#@KK-nXNk#{52V1?aXqYcr9Uv;{TId^7QE>&~i!f18T^@A`}uS?FXPIS0mxR)^8IU8mh(} z5A|QX%2Rg?2?oyEO=WsZc!JPN)t=lXLettz8OJRy*y_YFdxF+iXK~@7k*4cU)vxL@ zMokmjN~Z1zbiwo$$z~A)gd~VM(7T4EN(IwJ$PVuLHA zXqilzCDTxE@12vRoAi%V?R`D(3WSKp=V9=iIzGHAjw=#NUEoe3WPg%T#|Wy?b5-#K z-9aefvcTV2Jj=*+6sdczO^pFBe1uUYL>|FJ zW$&w=rF<|JaL!*=={Y&D!^Tp!-kviWIQ6PDM>G{(bL&SP3an`J3O;d{#jU!S9sUbp z6`tLEs~~MVX1sZaoHCmZ{CR4?Utg+kv=lQ(lYry|$dj^cif6SH1Ac^&b#x7;hMzwGV{VTE6v;Z402tqXc!gC-AR(B{_%-O)Vp*Kpe zUu=dM@+)q(cs91U4I)%u*%l@?9%>QicmMiilbg46wl0~AHk1Zh?uRDYG*@a(_j=m~ z2!-Cc6ElW$H!X>Zbr6PW+fjh8IeCaZqt1@V3zhaQWHILgw)x>FDzo(HC+g$6g3fe{ zxp6zf%>Lt-=VSLkSA5pK5^svUV2<#=^*q<|9a^icJhWziU{+fA37=N<-T$S=>30Ii zqpZk4>X5OZWq7!k@d2)r|8B?q@Db+QyvZs0>C?;l6xNZ3@r|gaxWobhPmm-$p=(3* z6zTJZ!MDB|S=cJvnHNQT#2j`=Q#4Yz;2B{V7b46Xs8^JZg1Lsx;JxM%)ABzHGcKHc zV6C6o{@|S!9F)$|yDnOqxZIS+Wu}BO2wnT$-K|NE9^9>sIIPPGsS}7m-hHYzJoRMI z0~*N{h&1m>O^DGhQ>z17-8`fVUg_{2Tis(Vu=`@wDvz|jIriffOC z>7dFo#D!+LL3V$g9e@ODI?HO_jnn1)7GJg-+DSm?q62ek(Svz}@ewUj)f4@np<*nc0o1muf0Q4@qMZ)>R$BStM?#1 z756Z_L|%y4_-)>8j=sRsM_Z*Uca-uNpAmE2dn1Ct(Ci2IV?(e9QrHWq!51-L)eV#Q zA9CTi@bQ~^`=bpco71eUPy)2OARXlf2{?Y2OpF^EyxWlNmufBW^#XjvCw00dSeOgz zeQr2dMQ_B!0G-UIQl>*M^He_<|7~Ph*d8E-&f|g9yS~NkZxir)Wr;TFR8VDGIgDEHk10 zi5vB8!HkI5fB8YRaOZEKf&2hpK@#xacm?qx#QX?U>>BMpJ!L_UTCx>OuiGYGs8LzNXAD=Q{WZi1pmT{^y)6N4GHx+aAWLNz)> z+oW@23S7nJ%rB~-Tx<6|5p*(^7cbVBuZUhE4aew1-sGH8E#b-DH@L^Ufp94AS2~Gr zNUj_&K|veo73$u;4)$sRJlT3_^&N&Rr~Mg#6k3bept~C@f`0)M5{fZ9wsDLD4}53` zEJhxd2|J1;v0DiZj60)mx%MkO_xY!G%d>Rrss=Vxe=38U%Sd#<=3#cuY&TdjW0Ez! z8NybMpxqDv!JM0%K!}@vADtr$>yPPMyS@*;iIYT{-eJeynx@Sxb|+_p+BboATH>1L z&a}T}vkQd^iuP4&2<4G(PKth*@oO=L2|c!nl#;0~jZ|MGW_KNrNGx_2j^5`WYN(e& z(BUr_-wBX$O4>meD|O#7sCecw*m#wTjo1MfJG?y@@4kds0fM5TM=UZPrdaEpA$_N+ zX|5BzErI&y;!_`y))vuavC+#eCUyN#rB0e+&d;z)n$ystgP8wmDkFRBCgo3y$x{C` zD(FQ;>s=mg;>b$L%ST1;@xqg37b{0ExUJ{hf!|M$4iaaMR)=L=vOG7h#rz%WwVfR0 zsoof@nk9>RcRBjBbpe?q9Q{WmKtncn`9^?Dwb*@{p@#g)zF{{yWnBLRcv<{~TjS%+ z*l)NfJq_+V%CH1E?S9P9&fti6)6;Ulv88&v{lfAgWoXZ@ITh$JIY(0IHI0OsXvZ(> zC|S~@YR`|@nA)pDAo7CvJ%(&94R0*0ux?WPSW6mMacND2!%}(LkGW!a=%B58$pWf9 zHWZ+#M-3@b(`%!PIQ76XrLB30#!)&RP4`nrZ*#6hapS6T=pd}{imATd0xlAzWjioD z`@KaolVO1V^7RsrN-WdOCvc46t&XL58(m{_L~q}OVYK~`VXTQ}l?y;F3Co(L5(&GSpI39+@a4pp+l#I-7he!1T_@8Tn9gmAex@b!DEPy}s7V2fTLY^RjB&RTG^v3~o@G3hz#pn8(9E~w0Eq6Ucz(9n6KQf# zO>}XUYU&K0=V2+5fYHVyrkQA4B-09?(R8x1>;I){aw!jExT_(`^A6R$=`Zt}griqWXYw)Pz9>1{1 zy4jC!+PqE%V@bdNfmN2?mZlb=x<7${(UYczIZf1W4}dQE-0)Q`^X$P!sXt!4r30Xk zq&xcwRkg3bRtRiB&x7tk@>BC=?}px4i{GfxGn?~H@^QBH9VfnU>wUx58DC4M1>E+D zT>Vgrcf!B>t%b>^J*_Lmh-D;{>CswwAFs1zQqc8=+nPxjNvEg|IdvFaD#Gst zONMU0KW#|QRb-#Y)-ysVqDyGk)j!^OzrPJWa0DX&1b+`DpgI&qA#o_s9QM0c@1;cT z#jGmy`>)+=iT>hsSLt|9y6{xk_g|(D)*mmT_KE$+tfFv%6KG%39XGZV12%KRLe#MBR11rV?tdCP8bF8K1*y_u2tuP2%vVMSTmM7Lvn6Ba8CsT(4n%Z|E^O;+m_> z+Z;<>(9N2p3}uJ}e;orDG5x(Hx@9uS7;s*v|64&j`r9Bng2MFy-Fe?f1p8P6~Zm4bg2IxGPK6$9WI{5MIJ#efvf$dytTD!Qg zA3gMAW)qjdPeyW@H7A!e2VJ>S@63}$DU*?Qh>1TrB;nopg&N}dRic?!SK^_#FO!yr zZ^I#0ePA6R%Nz(E^epKxyirWSkMJcF0Vd)?vjMaiA_}DS)2+m$r6Y2r-HKD>p*&6i zR57_)%=DFj5`+joTq<&YGQhGYUC!qEmAaUKKeIHwY>?K5AkbXcCu{&&@2W-}~-)_0N^hD3Mo& z{fm^8_|GW~>#&Po^*N9F+zLIEd+}VYdKcd30O3AQ`kascfIf_w^kG_%XMR_7GuO+E zT;j9yZjHF6*5_I!1 zC4eCv$Wu)TAQxli1soG(0GnG!6{tEr zMXCf+bX>TIDaY_6Z8Y4gx6s0 zUZ_sZs)to=G7hwHu{abs^Co`BnTBJS$%gaY{t6MPc&$!Vh(qLxv|z}><41?b#o!%*8So+X{=v#nQx*r-cQ<3adPf z9bOzL;sHerpg5BCuhv5sD49ty-tK9mCP)69}@bP5^@&L65Y>kQ3kU~-BG%xLVT;2OQruAM4oGfdez->F6XtY zU#XyPsO%gS(6&XddSR;OFqh9ISx98`kf?l4zN76#wa=mx3MR?vyZ!4GM-Vu^XO(fU z1E%Oe^_0PM+<=k@{mq#44g7W;W-Ba68_#@7KPunt?PHsNiNYcZdq)z^$jVZC_Xa0Y z7H*&RV_kllxu|YKg%oP>Ijl&7?s8JI##ENi@{kyFwX!_{uIEcNNJBq})7D}>+HAt3 zF2%0pP7S2i1I;PPP^i^+!b1JG5T6(|T5j@whjq7u(he7P3oMU~>FczoDJpgbB;0Z@ zQtEU{pp1BQKvZ8V<<+7*Y2vlJQ(Zxx!#q z{M@~8={H=%S3~hv0~%vJGpReylbh8@gi6O2ouGzbWkN(QC{rzhBGOaxS<(s8Co>GH zgkn{+DxUx{UX-udG1(9ndL4|FZeW4|sPN#tWPzCo%I!mTlB?9>JPfR$zUzG=VnZJG z;eoLD3$*jjNnk4I?bq^-Qdq||2REIBGWG;^mAmsX&`&Zlm zsm1*VXcj;UY6P!~G#>Lti&_QTd(5(#v8xo4JGO(oc zW$5qeo<(6?7u0Xu-hJz3%CD;86a3OUPB0Jt<(7>pGMLG0Xsu7lJtpYwD>cX@;!bkr z@CoFdqzsWGQO~36pkwJlhWW4~@xe&|47_>}BprujKg5i$W2N`KUr$M@|2}|Fxj->s68mLv zyh`QY@E+SR>8r8xo%ep?-MF(%m)JT0uW_CeqWh8w&SC#~=tKg`f0^S|k{iMx7|cbCBy1wV+o_4?so!49lKwLtj|-!DD6GYHo<1ON9Xz|L1Q1a`0P+jjHspuo3n! z&|z7>nP^WrCFE@6uzZkizXdtENs%8E?jD|yV6{vF6F@%XGm+oN*f%0FN&$laVm>(P_Is^L=1?l* zZYTw!*W6g?gem*hpzy23FqwBoP+XH?U9*;=8UExmhQ`+3xt3zX)slA$K z+p(BKS_h3l^%p^FTaGT)EqikpdpBV#aPgZGI*hclEm8X6&97uQsSK&X_Oyls=QtS< z4<*Z$u@Gz>_jT(U175KHPtXU5z4<-mk5n#;)Fk)ZKv&U8J-ITyraEBYg*{GV>o@DB zV0PCQC@*tdjNwEN(cr9;QTIXZ(vn4*HFB6;kT#u{f0%5PTnRSb`=?#uRtIyf+-i#p zPM~Hpxk&#V8n!;%NrIL?k=|`@%IUbY`YqKc7rGzXHO%t4*z)-x*v8C7fhAkl4D2>9 znZ7+jy^pY78?lVKg*~+|>aV3Mz+8G;cC76W+U!i*8Oq9us4H5X@~Chs%3qmzgp0rM zB#*TN%Q&U^gqe6@%O=59qeEz(C6rfVW=r)@;;}{XgQ$ibLx`+}&BBTF2ow?g#@fcV zf`j&KY&o$%dgx&YXNso^y&y5HO?X6@>}>Qt;!7;5%|mb)?X4njGt=W)grB@~9*Q$U zzqK-cXi<+bPm>CrYe>6EZ;t&=&QMQqu!RMFmAG4b;Uux-CUx|@T}BN50D=D#7-GC* z4j<<1d8qYVxjI{->#3)W9r5m%QQgY`-r!8ATt{?La~Op}*x^QK^e;iHrwS^!++F4fP^oe=c9XOz0FkR#RN+6c!OtR`gtsEJu+l_Lsup9~0!GD>L=FnG{e@vnM5rj0m$ z?VQGOyjbh}G}IDg>?GJLrh;M0O%)Jorx2Sr9nrSSoNf+_=WU<2PWQCH@8>1*Z*kZs zaI<+-s=CG3KU|>zmH7el*P?4gseTdPvH#bL>JagjM1OaRwF41Fphi9Ghv+tB@6rSG z#1hK=UY*L63VXdsDt(C{tyPIT2RbKtliYC!3>Vj-o{67bkBDxj99&`rvveT?mWX#f z%Zhg&uo;&D@TztF=%H17&@B9cLsAT7Hj%Ua%gK8XJnujnZ6S+~*4yV`lxM7SR&dOV zR6ez@>TYZy-V37)yU}3pEy``iy)V$Y!}f}JCL~{b=9hrXW?BbpHO!)XkrJL3HyHbd zr}yPQ!PZ1~J~=+Z@gs4OX+1($JYtltTw6-;2t8;6|KcKAnYj>(;_3NFWRfE2M#P<{ zkfW_CoWBiC$k$z|=?r$}B>@otzB(V2%V|PuT)t_x8;OE?W8d_ITc<;c-K0lqSc%8; zLb$6!rj@>=YQ$OrN)1eoVdmeWrybLBM$uT>(SV%#L2%M>wKA=q2n$d&J`is^|uM+hC#6O}y#Xmkc!e3IX_fWpYqj;fv#r^)y2b|y@1X}OHLL6^0yCL5SBM=@4 zhh+g z>Zl;Z&*BY7g$%FIC+#zHXdO2mwW{8a72Cu)-?2M~4d}&!TFi;Q(7vhVZF3}zK46p> zeUlT52uh`udV9@J3g~kvEx5)x4J6Gwoo)rHkYK6rEk7Zz2m90o|GkDT1P1*H94!jy zv#Km`!aoD>hrb!g?)0SxJ1yd!z0E zkNs`f>Z}R=wf(RWPCdB<=fqs&Z#mAj{gYNe6|kFY_NmCTx*KXRDb924#yks5>~q4u z0PsV-OP4nF%Ud;GyJyzF(T1r;JgRl*;DOx-JdV1huSz67NdVarIXKy6v3sFd;AmkfptMfO37!*KkGp9 z?rEuOU<1_hNx!QF3FKnof)(bOb{1UYUIDhk-(TbRzgTTbh!=6M-VY{N9fyc}Kz=#0 z(pH*zsNFqGjX8h!1?>j}OznS-4D5d?_YHqqlBQ#8DMtWQ;aR21@<>Al*96Nx)IM2h$yS8hgPdUk zlG8Hi8bxD`b2y7t0-zK1H{|?$h|MLu8|g&NCGw%g4JE}5=yhd=h)AEQ-`H1UphlhF zgl}QKI`MnAxOXqH)^U&WHt><{{-<{KInz$LclaIe%_zv9KU;$YF>e`?zy~ZcqU#{i zYSpIK_?OVyCj*qF;t#9Aw=3-(N}LK0^9$drsD1k;3^T1w?VN6uvVJh>q9?zgzoQRq z3ELQPg-qSU${ig)P}Y}#ygH1_lc+DP0O2TNUoKeb%=k^e&QPt7*B>f(rS4jh{Cj=PLHNpz(B$0Ph^J|UHl#q`6a!yo_nE63 z1!VLvmw9rYb&J)HiAT6kuKW#`BuW=*Tc;+~VCRZl&l}sT_E)@GSX(XqU(U1+?sI1DG z5e2_3JD6^^brBEeSw*0~O4oA0yORZO6T{`NcN&FyXy^mGxI8W7#Z{yLLak1$Xwrf1 zB1&<^da*`ixN1Nf3wK6S-xp+2MGNOhXU38pWFH$z*ycfjK+mS);pzzEDb6(+ll70p znkr3g@o>Cy_H(|n(<9YeR@n-W(;&jop}Be?3eTdUf(q;85|hm1JG{?nIFUy+tLjXvy_9#mfyvzOng5v6v=*<{|M62ESXP_~ zNTP*mi|1C0C5h8U*Z#yr<)R78Z&9}!+gdMaj#ErgQ}pa;IxTXr*NvJpx zS>Wf8hUI0s;OAg2j#)Z4S!N^u9osIKZHRLqQPNnlHcRM^hQYrm^r@t6#eY&SuT?Ji@5K*y>CBfjT9(y%F*IaAWIY*DtjYFace(fFV-Tz zN0?YH@Aqq+bO+0}udaM0(Jb_d+aK=EgYjBnsffZqCf`1ttU}WIjKPrd$L2pnq{t*km2I68Fb;mp(#GcY5V74y0vC-1-=8+8PZ3S zc?NfRO$&!QO;BW1*5bbOj>kUA`=2l5t52%2uy)5=z@@e zC5b30fU`3kpAbZWk0f(qAIgek@JJMvO1|s^2=DS9GiIYlP)K)$%>W|1?h7DNMC8k% zsqU*9co#uZy#MFNCU|Bm_n9N8zaqKoq)p2150U`-JcZ&5M9G&m)4Pq?K;9m6PpcaQ^tp955xza%#Fc@P%CD zp(=!LiTZm$J(7s_CQ)dILOA@}XQ0SsNOo>kvTZbkBAUZdB7zM`@z5W6{J3p=O>{=H zo_^RfCw**_#&d2S=r3i_q7F(?+M8%`qp`k6f%HBM@4+w4#JAXE#r4XC52*8L6TzDB z&GMoBI4vEyEca$qrow-Qy&X6E0F_{y{?yUDOQ~&z@TH<};+-CeM5JuR2Ubg*3BYPB z3E@7~J;%F~49&L%gEnWTzm{buvF^jkv+Vjb%ld)(*Ga{jjVx?7b?OW3Z@48|l{qY3 z6#Xb$Qxf5_y9hJkpJ`ZIzQT<7lVb=@!E#Y|_(QxhvG)FfXeZd)I@>63bI6WBe}T4V zx%N!DjPdWpbod7iU#p9FG6#BDp#nqjOnI~x8N%H2dHt=cLOoB#I#O)BdJC>Hg_@YlE@{+i-hvXMB`Kn6#M!NN@c1i!f` zZ^PK@S_Yf9DqWwS8gOH~>A@E$K!l#Rk~3#AyG98VFiJLYgw3ylOxe?6gb91`L}7=` zx7hQt;JUG=k%#p50ugmPu>_w7uvHv@=g(UyjUwh-faF^Y?%|q~^LwR(dZl|0wjd0& z%)tMr7uwT-+SB<5qU;z5nm*`2=xuVe<8z!3;hFo&LZ1(|nc_DTo$O85OwzYQ%g4Jt5AxHma#WE6-s=vD@t8xsmtzUW(I zAal}D%qeG(HwA0N@?b~(!R8a>&KsGRq5ZX*(QJ>9fzzQssNg%9Pqx!xZc6C929{qR zDW?yRn=m=JgFSp+dT8$+k?At$;}$Eh$KfmGCTsKLbO<1aXW7EB=O#%5YO)~&QsA%f zq7Q^$IMO~5;d)6!J$3K9Iq~>i{S$b;8Rw^LR@~T;9Z?(tfZX(e z61{8_UL1l#`0u$X|C8`D{NA0+jkb406M_cuLxKsPCqduXcLNy!fH34#ml*&|7H&;q`DOpjcJZIOYD_BC zi*t8+*#Pu?QLNZ4vAPyY_1TbCte%uNL60i`X3H`tqGuXr#Xr$rhMt6HL-GGYK-!^6?fL)sp$t5cggQ`XBZDmyg;rjQ-HSG@qU=Jsz)bk5 z87JAm-(K3v>ivoIdR$wxBY%Ku&!-DaFv`f1zGHtqKl(*B?Mu5v!tu0=Y|}l;C-b zJ$T%gWcmO_53=D6{XlU4sWKpOju0S$`Q>mLE$bLE*^g^DJ4=r4dhDLOFa{@+XH??F za78c|ra!;jM6J+`1~Sj%bipMzdRx~WCqbKVY)vi7$$U=_mxlpddYf>JdmpHxWXov! zlOl|CKc1A_jhRd+1$8%tRHBQ5WWzz5IgMn-(s^sF7x7003(1yi-+gwlt8VzEeQv~$ zFLv02>fa?x{Bl;Y2>4?nK*t}8Ai!2TEK}4jlLEZ6!VeD|TAUc9L-&PG_nP5Ehw6Hv{p?O5 zLcZ9grr|{NwcNZ57A~M8s#QCzxG$nm0ja?SY*#FnVIDZrUCZMyhtOXyNx}haOXd+t zqO+x2CIWIxEH-$AW8|j`sF==p?l=`$gkw@Q!#t#EFFH_CY0(4LxRtaX9yp1VwZlAv zS>O6(?D+Un|NYhyFIdG8CzVt#epL74r$H1dT6N&M86_mQbp!WB7k(7AyXL z&0mw7&4z|=Z2s7B;M9Yq!-0WV#!7;gaSaTg{fQ~dK<(lA+3#YO3))=}OgLuov_D(P z#~)_b{DpABIyXQxoLdV(u*kUWT(Q_@di*U8H8wTCgNtL7ZIf{;qn+WxkNuAHg)>cj z_+r+BOZz((;f!jB>5w%$Tyg1yjjLQ-T75v}ge^SVU<_R|gH@G|RTheBdLWO@IpgX?^u()@nHdjv5~!SbfvY5 z=}dJiT_JY;lye1zzD8|>F$0hC<14ms(F|6G&guWfgvkuY9e23LV2lNLUvJ>`3l<3X zr~i$ZshGxr0-o^A7_>8T$IUU%_%9;3z=(VU`=Cqe22yZi#nU|a?!sGVY%^RMS{2Uz zg*^D(u`Ny0EW#?z;my-ti)U zT(GfK=D7ck1@718l>f01NCI-%fm(@XxTJ4b2v~UFKFd>DP7EmEW>SK;>==w)+%O#m z%=tkD&KxD^lr>xD!A&xegL@yhs_Ti8mu{3AGgXv@hu|YWE6DEoza|z!A;` zOlCa5AYB>&mkTRno6b*MTrYF&j3hCK+r%X`Toy%6#B;|FFQgHu ztg^ijReI(BF3cmEM$cG?5;tf6n({TiYr}|A7r%f_HI>r-er5H(f)+dRT;zpgB#6q0X1|W;7yZ z1p;ZHz{D({uoKO0fwo*uBPOq$cw6uUrRi2v+MN{Z;T!tlfWANw9i3~W^f4`_c<`y| zoI3Nh)bGZMsOuut#Bsi3YnLjopmk>R{o{i&kFI=QS=!4ezZjxfzQPOYNhPD?CnY2&;Gi1WUe-CN%$?hyQX1RZ9%XE?$uZmx|H*6_@K z(&L3i+%qF8?}HSP|G4!^%)6ByrioRwNS{Tq+k1g)`Bd&0XsQ2bkC|9K-Ca+MF3tP3 z3%U1`Y!Evr5Xa;@&RWq0R*$*8Cx4Og?`ZLK11cOD9T9j+g*K&M!*n|~8?(~W zmn|>Mo|axBDdx}UGktrFifAz?l@vBGf!`K>=oWtL#hj}RSqQNC9O%e~LrTe1~v#8G-jJ5)EG z{4t%iiw4ydVPEi4_B3x~?%m96*RT2NOOz8JATV{i3~veeggOM=yrz|4X%)(2U#8& zK=Bg?nzlWZk%eQO9jZF(2c9d3+RBn86e(WWm0)W#K8VtTrM;g0f+(KQ&-K3|a~uA@FSdDK%jt@7<=rWS2Pwgr|a^#yH<8vchu? ziNXCP9B_WCYsy-HK!>yU1dSc~@t2fID^M6-AeQDkde^uiN?M)}n?}6~JL+8C+h0JJ z?n-8_4b9SX0#DP1cj`RpC_b`RlWSr?%8=fUEGi9k%^x10=Qgg&4#qWrmWt0Q46YlK zJLqD*GJs1PeOMbvJDAg)s(=2-J!vTV^ma^I#>Gdi?i9xvPNvu>#cvwdp7tjU#Xw(U ziyF(~`%h*7JEJ9fiyt#+6dgc4Uy(l;dm)aI336yKGcw?5w;dYR338k$EW zS5m?)F~IRwqDp#!`R3^eP}M2;I;l2)Icd$|r*nw-PZpy3NbT^+Jl_+kDp&TzXfQKs z#7NgsF1Vqt&HFE zP21lIkIog_m#w^^=pnG=F2Xjsi+u4eN6V)>aC+}Sd)es2vKFNL4Xd15t)HTxEpgst zWwFOwf48w>rFN|`qwSU+R@A7M1t??l6Bi5=0BBt1G4P>X*S}hQ5O-c0RsZW5`A7B$ zwkvP{B8@N)`E#uNQ!R;|fm3>eNY*hKg*(mHY}gm@-Q|Vum@Vb%^0?d9!Az*9h6e7XrDMkU=&7} z-z__Yd5m#J9s_#Hw%81?il4$4{?M5i8mlLo8p_q8IMM3y=y)RoLF)#BOTjA!Y%;Dv zqJ=vK?T0M06h1yMEmz+ds;uzE_2+n^YnROV0n)ohecEt8D2DJP#}8uravYvIkzI(jt^;~Jl^ zX@DhW^w)c6YiJfw!_`LD$A7xtHAV|o^x>f{EuHGp(nfVqkupeQI2$03CM!RL3_HC*c1WE1) z=T8T5z(Us)Vuw-9Fx=fjTlvHw-(+VB_48d1{bcKwu9MaU2yzk|EjhkP;amD|nn?tS z=TQo~3-YsVZNZY)G36_aOFZFP2k}dX)zizebii5R-}lnaaMfU^t@K@H)DAgu$Arb# zU###OOrB_=&vaJOpjkCLjqi9>g^lAucItKYPs6w2GYo$o!Q(&oWi~x91r~ zncjb?<^-H79xbIYIiNsE{q->C4P`N#h$s!1yJ~*O;wWF%9;n33TzpaBUoaW!L7j@T z`mYPYI!on5@j+5~=0Za3g|PI(1!sk?9hP~X-#%53>vulC>DygD)^F=x)!IXoBCR3K zB9Z@grR@=^-5T{UqVfFovnu(k*OXPgSa_N^zr^xIQ^}vQ#;izp%_agsVQ%xKQ@sgj z#3f4njr&()l$3i?-L1p;(4C$mS@8T=h+`N;NTpx$C-U?T!u0_I%q&YG0wv8l!Y;|N zHE<&hlHqBaZg>Eu3$}ovDy9T}#b%%Otn$P}ARtBNJ2jVo`FaZfjIoKY zzM;;wD-RT*WOGuC*+ z0@*mi&rRQ^b}q7k`@42jW^IQNg~QBk7VYkU{?e5!g7Z)_>4pn(dwmlB&J_j`HD0Pm z?yn$u=X^EJk~uR@_y~0(dro+7bx2-!_h&ZF;iF{GemOkwZsbYH3lF5NT08T zu#WKT7B+!8j0}#t<^I%GcS1w^o}8S&ufb*k$NI+Wi*Jti?9hUV!*GX*sgOVYuUdE1 z-Xvui9x=ae=rCV}Xgxaa!4$&3ReR z-cv4a+XWJ1?}u zgZq7FP%vhPw_C0fQHG={@9|Ty_a_PCIRXNjmCRLekN787!>B;TawkN?_vdxsRb4XBQv>yI|A|xnh`3QI?BT}*%4bw&*(IK*`I%aASX=LR9i)W5IsrM#&aoX=#^jSPgN#7hVx3xeQ&iq(;!oop`D`1i&4n<9w2x5 zu9K!)WTeHg4$k&9@rM7NbdB6Zq)&2O38OL=7<}+KMu*;`w#zK~-LE4^$EQ@+V&p#? zk>EWXGKt0wic%~2%dyC;i?}W(>>{O}-tsN1H6W8~V4bEW=8>>^Rh^qz`uo5tO}a@k z{L}l}#Qm7&!ZmYAWvwgp%Oj{=?9;?4_t0SVdgTSg#jpRiX}Cz&MiiF#Irl8b#$-PZX25 zL1sBE-d~4y#m8(KD4e)-J%x3vb-X;y#$#-i52lcjP8f%~XEch}!d(_^@|L5`JfC7i z?}nm2V`Ads`oZE~s|mpts8!Y*5vR87B@TC;W{={riGahw&+JJ&TZ+CkW<4^F^b6^D zU>W58r-x1n_Qu*|nRr{9+6#p&A*#pLo4)jV>fo8Sl2U)eB31Y}|GyXHrG%qJan-yq zUX>GEUM@`Bwdpg2Pn|S|pKNQS(Da|)3J4$v*scogj8*}mv2WiH|lIqn@lahHF&kVuwRTNde`g-ch^`l#_c$F+`LsZM`h13ju_FKxZ;e zt(=^{KG0n}_$8sNx0=wIZnucWQjtPxn;f3#_>z8@?z0y#JY1_f=XIY|3rhC{Zj$h7 z6Y73$F+xXvdDx&Wk*(MtN0$13Tb4&;b&-A?>rR|lO&FP0IVI0mNC2SII##iewcCUs0tm>{-ye(vQ!t^xX8#PJv~G>lAS2gP1d) zl;4@F>ESBb&U{j~GoQqr`2jh7uWZr1NlsmlEpRvwZAWjJB$V6fzGo@EKMGK>MtVU~ zk5+4OR9RW6=NMH|Rw`3^&fz3F{Do4_`K&K@Bp7UT&nViq(+VLM9OxZSW`-8@%%>iSv5zI89ERzxR$a&x!L!?>KXvIB)ij)9A!`t9P7Z3p>qQ zlDY)w9$&ZEGBw>^kjKhwtAyzGY^#KrWP9mKFSm%}#BU)l!qsdw(JEn*s*0~gvbr8& zcUIMTUM(!>+t_oQ`yc8#el4ZH5PFX9NvVAW`#IVZ(i#amms3@@zOJM|J?xvX+HX>; z`_gr4a`c?SlWc0fPS%XDCo9S>bV$5U0+vZ5N_t6In%;$)p7$Tp^xIPU4MEc{NU3KF zYx+*m^ld+$rkAFYebMv;r>6U;R@(1WtWQ;rntJU2?aFkYrhGvR*#??f%dudeJ=MQ_D(PD`sO3D|FpjUiSv3dsM@@`Mm+45icc4<svoJUN6OB5I~j1Gry{7!D19p^wv3OaW}+d@co;tM>b-0Dz=}9Y(X@Uwj+_dYedy#CN)3lTFNd}O7_$(}$7IQYTIyMn26>oIZ?vl1`jHjC>MKoIZ?v;!d1CjC^8+J?Ju7T_*wIlcl;7 zCCl3MIE_4prd!SO*9kh>&Yzz@=R_&}UltQxspSP7Zhm;KIyySaIY`P+K3CV|MYXVk zPQ%tJ!CEWESgzK}q61^ESAtEa12YxVDIV*h_c6UqO9n)vWPqKW4JftvW}$JPW5 zAF=;u!pFz|5m#CIKhRY^`LQ+ey`rY{RxMc<$9n~6S7mYK!aN^f0f3%;M!)pa0}Asn z1hCm(oKI5H-^*4>AIquz`PW{YUagkutgJ#yt%2B|*iE$Wxb$~i?on%`-^pb8bd&?+ zT|Rw!wYhxy-(HU~;6J+_oHER?)!QSK~u(^GIUm7;+@sA@^x0ZP0q4+Rxvq` zRREGN&0y9pyfg!Ve!$X~=y@`E zI4T$!Pp|%wWUT)&W&FFO96k zQvW*jD^=A$W7h~&7YcZQVbFN@u1kLx!}!6ugBz4lhTGR5_J78&5#T5f$ZE5`Th*d< zzs}lxLFaC>H(wN#*p)A%NPAdHKZt=~J(qa{mHB!pb**z#+Il)Iv7w*_0I1WZ0lbF6 z+Ap)dK)_#b1^gq7(YaxOy@9B=eqoia{Z_2oLAm}`sfX&XsM_#ot!;b8Ky84NVsCpj zb{F2O@v`bD`ERm1UB5;CagI#o6L5?Soq#(?e?ZAgi|;Ud7uRg!fwJMvl8UQG#kJe_ zIggH=V)ica-p4oHSN6uSsthWg;8pdOJ$i(XKa3>LL28s^*T? z*agj6E3{%p2231Us^)KFqIGH|r>G%Cq3Z9G?MRMO1TVl2{~pz` z+J6|^>hZQTgPi}B-;vH$)EW9Q+SJr!GkY96QUo^?d?2|8q(|YwS9E)LO{xkMyOJJk z1z!J>)K6v4*fEBpX67wwy9#a4ti0>pD^&bAlP|Xna_8jDJ&=#Ya9i8^lDirYe4DBt z$hNiF9mu((t1)Yb&skSgZSY8FjhK@yl~SJa-tNwy-lHXF)xm z3>&AoiEX^$RDny9L%je);wAv=aHY+P=@|Ue*nvJjB7+uEdYKb(w}%y*YStztA!(xtdkRR zmis44?>hQ(y`_&oRhtK6L1sHujYs!DpEW{N6Q-*1R8(N9F;gu_UOXGrQ!x-w$Z4)rYq=^F8zNm+pbV=yw}s7tragIzk#yvcJ(irvvmmoQ2=X3%`pN z{$HsRpznOPD|h*T{>$j`>P%{rCHfL~dH82p5%%s94xB6g?l(z6;5?fK<2xy%cU3dJ zA!V0wwXB{c>2IpqsZ!m^$o)M|?(gN?-$%LsRpl@8w7Y;xC!-EjhvAFmj`z~C?-SK{ zPc_dH-T>k>DZLgMx!=ji1Duh+h|8$+w5x#q^XSpI+yrHf>v6Z5zn!|jT4<*ppq%`L z>j`mX<5fvrtiMIKD-X~gbn^DsYGE267e9bu9qIp9D)WQY{H;6P1ymn$Qhk_GU6@*s zUr;~_L>tsGRM3>3avzZ6i+7O2T5>+j1w@=;<5$oxI2rl{b=7!=D=pYE;3L)ir!IXs z9y>_^s#6DM=@T!!4IR_h$NvTH)kD{-Z(pO;*<0)R@pQctjn{_}ZK?iP<`=IcDsnerV`!tNU z9Qi4#x~HohZ${L^)jkPYA|P*9dkzYYizV)JsVBhL<^SA$3O6X}Kjj#JT%e>j6dr(l zBBwvZ?#5QG?`NpKUxsnV^FPM8V}qPJSB4SA0C7aIwHj*IbBdS*<-W~q+z482bRQai z{)Y`Ro~hto-z`p+9y4yIBu=@Qc@4q_X!i)%tSdRv>%XW+*^2(<`taMJ|=JWQ)s^RAVTbCmT-QK3u_VqG{x0TnkPq6e)T<*cfd$JnT-&NVE>MvH?PgQ5}Cg+K< z0DGC7zC<=p;MLBRXPhOghXaF!&Pz9sm4$+jAybjD=YUz z6Z3G0RE5eoSG6E#6@+|GfSg?r@_hkvPC>{II3&~djra}YM%i6!JS(erN?7JCQr(TV z!<2J}x6`G{Q>9)5T)Z;c%TdanJ{-5~EtqQnFX>Yy@wnwzcpZ6_KfK01n@4};JbRdj zzP_G4{H`jVJ^Tu-Jg?H9*Q&GhdcLflCZXO>lIs4Ks8)Ma>|IffeNfcgUMSEr_)RtK z;o8|-o$m~O7A^lZyiV2f_iVM?Dybp;3{|VI!-KNkpyeMHJ;WYwr?#%v_W<@>9^Fxj2JX4)3fdk z5=%RS9Sa6=`1wk5@g#>tWw1beHwNOnW%mJMApQr#WNhArY~Cfiha0CV>JfOn1HDY= z?P~jFI;=IZu6hB0N96QhW%De3?GAayZM`=k>^_)nRq7IGLXJ-@HX)CV&Q>R!EElr`zmxge_-Wr+@RSU9kL-UaU zS-7G3m_sr{oQq$|&c$zmSIg@85|(+kRCk6X-i?sEp=qv6^xDkOdn&W;L-6FgJHeZs zWUy6b=FJHoa4Y?TKkTRGS`eMD9u*!Z?il55h~+=qvV*{WRlG>y18T>A(4YO)S$cX? zQWK~~x@2%$?q(y8;EnkNpPLJo?td}`|B%c3QFXqXkyxwn1H}E1%K1^YoNu9=A7#mD zZwT_pIXs`7BXT9RrI(3ve$3_kgl$2N&dO=m?|zV7Kc<3yk}c>p_>t)oRU1`z7#^cZ z3$2P)+Jn1Q)Mq@R@9uj@#Fa}MV+mGsJd=9FqXrPMabJiAZQ9%i#K7fJf>B=_K+KeLm47V45QpN8s- z@aUC`B=^DLiDZFku40~Y6oa}LY@!b$=yl4Xud22Ax@;UvbAE@1YhtM&74|uX=baz_ zlFyGL-GL^yMzGBbIY9;}rwFejZq`4N$P&&H{cG<1-&6~yCR(58z81fSd{fQStOLs7 z#ko$<0;99;-|{lPqh;VC9$6nufWD)!-|}h6>m>a;pF>#%F0mL16tqq_axKDxtti&oztgb^uE3uZa42j%sRET2Z zFS0sOzt^Q5UH4Pm?q5SBrJE_NAP33RbDgR(Gv1NXZ;^AFD1n!x)bo-$ME46sPU5f+ zFg@NY>Gw+RL&G=b)uY4_SEW{f@*ZHR=2sTT`4tuMUaT)b&D}Fw9b_gA!z7)a90yeZ z56T(~b*#<=s6v2R$5jB3UPIFH3&cP(Z8+i9%{Na|?iFJb9*w+1X3Nmm)Z|%)&bK%N z09}U8UYr_TV`(XUFKYB;O7SKsb$$Mg(Fd4&8kcze||^!6&ICCY-!co4PpnaZ?uN^e>^Mby$M z*;+bl6zoy zLe_dyusMaqu@qzf5p0$b-ad0r;8^jLpiBeBJqimHr{xY5r{xP2r#S<~y8MA+oik8u zk@PKiVL@+!VqM-qvCa$>TQE>;u?31PsPip6P>h8@QD$-MxKe*RU#Wk3 zO|F&tq=nf`l?f2e78sJ)&l6JmQMBS2l+3+S>Ms0(e7TaF7JyyEZ26^2|I+0i5ruKr6G)GH0RVrZe-a zX)7gjX11Entl>Y8OX=kR)L9j8>rGpqx6;Dw*Td2Wqx2Io-y!Xkm#xr~^30B0Fb{wGt}Es}n#cu^M02$F>;iy=-dFw;koa>J9enuX6*F4rIvcq{@RNtm$`J%qwOX*Z8E zApb4c)LtR0CrkQwvi4tfCxEujt8uLQSYN|8K2dcqtX$w|h4}|1N)kjhzzaZ%^NbY|5m&cx8BP@^I zNO`%ShN*~R7vZM#FfMmlP=}XwUdY+Gh_dtZ%A=XIkYiMOYznxjhUZw-zP}^qRw;cG zR{P&^!WUD*7fY!NC0r#}N+5q%c{y=&qNw@kMK>uny`TjaZJxS7!)_z-uvsS<7 za$Le6{!k;VezOGlJrw}J=q7b5=MQF1&ZVD6iRc#W1#)@=Sq#q0y^KFxP8s-AN`2(q zw09{*zpO?bhBwJs8JC+GdG9)7xB&Tk7FD*&`ZIXZ|=Cfaw?rCgixD%)BS#8QepL1=8??{F@mEk_^jOz}i;4Ao@C4ouq#%X+Ntw3N&*? zjksjS43v=U48vE{*k5)?>HkKzy^>ORSV}!8sTH^)!~(mr22wsMwxxhyvqnqSzeP7Y zT~cvvNRB;tSJv1u{i%9$M+_nTipvf#WP_xs>>2mS;Q3Vm!<_zG)c3dKDo)_ZN<5J8 z!D1szQ!uT_I0LV}|ANodZ>q^LQ$Jl`0RWCkPs2s*6!NGUJc5&UU-C)2Yie>#+C49hI{@M&DUF}B{zzdnGt#}z z+I>M=lt0!$&*O$7ZD?w+32NRj44I>F$6LX#yCsYc-++T+yf3>4;T6e#%=XqDX|YDf zZ`RrWWenT?LY2!vZ{T!qq;%hvQg7qcN`8U%4I(bUJ<2Nd#nARB?y4~KT91zY)G;)6D)Gjed@n#= zs3I3DFaiUzgT)2hE{-+J1R6%m{%KY$c|*#{v}R%+L@*)#GKEty%8Uz9;a~NB%Tie{ zw=9*3w=9`2*GlQDQQ1$d7Gu&FbQiVl z-8EVK-hljmr}nZfwk&H~Y?-hvw#>FI_8!jfy)}K<7MqjZdnmj2X0!W_q;`SPe#AQ* z%d+lpEEDcuV3Yf(koVJ{2eM_w9l2jgxwin9 z^}2j;gRAiJ!LPXQo`waUCb>0I;Qg-LTY!5n@GGhC7T{-ifv01Er%TXP{GF_(^pj*Q zQ5VBaKU}F>_``!W!gWm6hc*DTLfsasKLE7=wuk_KF##@-(!ayT?5~{uL;T@kS`Z%4 zY~OPCSCP^~l+wf2jQc}1=7uuYIMKz|^;1!luS}lRK#y=F< zWt^p`XG{9`s&<-GM>b3S%{k%lC};jL%KVbbU*_9b1GsG4mbpRcQ97~lH!9L&;?xIA z%Yt}MO7A0EZk(Jv!8v)7a`KRr+EQ@ujrE=40!6<-aclUU0v8^O{sMkMcEZr|p$v=p zCu+p3C!KFt8`*5&1xm#Mw1oWIcWQ(!bWd<1%p8=zB3ymv(chP}(RFzA!BbRDXK(eX z8vDz3Dg6vN9+0br%Dh(5*DCJX@NKpcC7%YhC_G)me|}4aS*uhGMAWKqtBSi>9NJ>Q zHUhR6abWs%*1+^>VPN{SZD4ASsGjC(p(2zRmlvt)CH*x?J5#D#hrY4Z=^M{*-}rB; zgji)H&o&uAr4`+>^E1@4Td5*|0{xb5@eBYO$gx!v6u`b#(qG^{nQcyPwsUTFP;Ry> zsb>o8oY__b5zj9$w4E}vjWPs8&QqvO*D3ls#qAHDsEBJ zMj}(A9CJjFei)`7F5Kk{X?2)38Ux{6Gwlef!12Vh^Dp2qMY3^cdgu=Bq0}HQ<2(gD z^nAti(49`7*u{O~+1@;KC-+dRY(S>Vdn_N>MSWx^^^s?(*>{Tie%6Ym&pEkyo^$hp z7)$edDBxeg!pd2SewG4b`ST$Tl)vXFe=mrPJx`f^PD}%UpHm~9rBw8z zMT}MPbDiyoABnTW=rB}bD`pbPpv%~=sIB_9vesOe01dq8)WAz@hN5y>9y0)jb#y}+ z5#~i&;7gSM7e)Rd?L#^J0j{Nb*;&+XTGTc11o!}#4n4Lc(;R~?M1A_yR$0sZlMzIwpHS} zCR4RkyxuC|%h{E1w@?Xp^GZn7Rcbt|sDAyQDx0->Rh+e=i-D{ugI7hF;N>hOeL9}U z{u)L4PELJ|OODpM%+*IUazg%IW~56M{W8UE^lX>a2$k$orJ_Q=RB;atH)b6+x*+Fa zql4^-1NTX5T|(jzLJe0QX)jB}3!SWG;UEUdEl^b(dZX7|@+!?f#b z+^(SEOL6Y$G?#jmzDdynbq%@RmK={wN6dnxLll+-l}nDn+% z^Fm;88WNyRW9{u#ioO}zz@9Hm8()R0zv^GGF-IIoJ~CN}LkKluFulW`Bd1lwmN<}5%aD()S#KAOs9)6;#yv9PPB?#e-*^aPD;qu2!=#dCL>W4c5 zpdNy#hl=8E#&#MK4;NS1ZN`QgSt4^iHc!~gJpt@+6~^?v3V6b1?g_8=?g_8g*k3j% z>2uK&{!UR(R#GS0Ji#$>24H(wb-z~8uT$KI^=va;;aarlwf}-Ea73FcT#K%7Eq8_O zSlyqNdY+K*Qx@t)^aWt+7W4(xy}iWXro9gBjV$Ie?Pi6`6EmS}5qjhgH!YyL5p}r8 zJ|vF7#DhiCUWZPAEbWuFmuSPlw3e`yC~TGR4IUJHE!y~OMGb?s*$3t~sG+7;PBm>z zkFK_i1R$fd!|W%-*m7+zSIFs0abERJN_f4TI>#322SB8^5CCdF>-gNH=r<|u5yoqh znzyhwYwRzJ@ysB0(b7%WqXr7Y!jtmVyf@923jjPAfrpSds+oyH2?e?)V!cTEK+G7P zgY@Pcq-zkk)@S;&(^nKjDeu!#HWsJW7dwpcJ~xJ= z#e(!Vi>NgoRP=`-V6BmM6{$MFy{X#aXv1<>QP1r~*vLS38tm0hRq-I|@lm%995?2SAUSurxKG^Z>bcIvec~adqFjGSarbxl#6vjK zhUw@NE#MOgn*K1tgSdl@roQt#0Qof?ln7w4`7pMS50j7xYJxF_Y@Df>OdNzvOjsj* zDXXX8vWUrr?CUJI$s{uh$@p^k>&-3>YzaOVfsYjY71BI}0Q#%;fn>ZZ^ech)_6&d?5 zxSd$el=oq7<$ah>c^?*3-iI~zmwyze-^1Yc5iRAl;?(Y9=Ze*j@X5AJ_aFg!n0m-^x8-$$Z7`E@XC>;x2ct*o6$0WMG)xgoBaG zSQqG7L;=kYG|rOxT)M4gcos)G&k{cb)rjHXS?tF`&cPcbkIFDLdls(YtF#E!5b%8x zsAdy()Hs*Bu!{iv*Zd$Zry-XUO$q~$!q9A9cvgkL%P#D&BRCOCY)2qR$DC@y_D^h=>zb$Jk>hSi8Pxw6Wr?fWy zy7E_fwiN*+-RsL<=(_%cD~AJrIgbVXgicX@DlS-umor@H(_FaCmY4iFE%{?5wO`4* z{phnARn@bQ+yU-W8G0e*?k{VMcjYzG zTe5I)DGV8>@#p6z3wv29O- z>6iK+pVkvuZd=H3+kW#F~Ly2DZ zNnh583;XwA2MLNF&KLH7E^_83S@hslW}H_QcQKyUf4qKDIk~W5dle}fCnzN^VY{TplX z?wc^ahW;!r-aRlnOr-}9G3ZBJ92x>F6lJh$m(f6gG$cGc8)r?qfb*S*b0Fdj&xLcc z9fzrwat5Q9A~mi*HQmvq4VQXqFtKL=;Ko+QQfWUyRaiuq5^HbmR6xcBsb$(B+QF)D zD$OnzC&CaJ@KZ(U$BS^QB`^JS{%{6m~bGo-`RJ`&lg^gPKL%4-zv z@_$fzE>@_^e#A6;(0;tp((u95p%_!`NM ze5kQp?GvI{GxlREv!Apw_L{LD+p+zm&lrVn+ARlguilT}I`$J+zxja5Rc2xx5g^>0 z^(}gBd2Ti=dPgFvSFAdaXkcPJsXA6-11V&mv_<__>r)@<8hG4(94T)sQcut?b&>OB zOY}3jW1qzz&ZZttZxXfEr~#n0M(r#rE`T~W%K(^jt`UH(7eG11m0p8w#5uggbNR!0 zwCFdK)LzB0MD851_;YFT=hZrD;5p732!I!{7UgqA|3Yztd!4GNv(!Vez74Oe%~9Vh zY+z?Z%AK?2FniqqbBEk>8*3rXFbMS)=(t{Ew^D}$i zaL3BN&vCT#IhnT~Af&koEXMhjX4)Zyb~u^kvzNNKE^S&A$Q^;GV}+&IpQ9gt?(pN! z(T_jpe*EvbCD`S2{LZkoSpB1L;rzSAhNKDh;x6 zvQ}`I^F@c*NJRxay1UM@@rG;{K0n)qH;OI{R5lc)&&BrPLe9}e{NZ=};bO|;K3D2Z zm+Apuw)nhIA8rt44;^;{*K)97IXE7%$DJ9x#tenGOV{+hErL~@C`cYH;Q}G2I&)t z6Q6I-8xx*rs{r5N?EE*R-!VW)8-;0g7|sWoX`=}~iR2q4Gu1;%46l*YBch{i_2QIr zZWm?|n=ORGLP%nqP(8lEsZdBeTC5)5;It+rju*o`Bu*d<{D;FlSpOSb4Rd9Q+M%CX zuBGah;`USSmVcmb*;F~N@bLW-Dm{P~m;}2-tQG)zd2#v=IJb8xFYPi~+G%Xk?nIY< zqRSl&e^I0!A6@L6w9CoIrIe4$3i5HO$OnMl<4WD>%70^tNmD%nD%B65yO(_cIMG$n zA0_duk)Bb=sDA*5&ok;bi?m&G66J(@#ab`S1D>thSu8jY=n%o2sz5?tl-tGoL4^41 z1wRo0bTR^Ua-?ye)MqNTDL0^SFj6?2Pq|%cRz03I66!vma)Y!(2{@^G;yfbcjKZ9; zoX}+=A(DjwLm)JUfRpO_3p3G6oVCylol_e74Be%*jv2bkYWebeQV)uZTUGTuNk6Sz zJ432F4cojcc*VJrKU_s?P^xk%)Yn2ofh(x5TuFZbEub|xz=SQ!BI8$zFMxPUdYh0DY~?ebgFhUy*v0S@i+=$ZPOiq*S*^sr#k8SEU2=Wo(}LY?pqv%RMZ7j-+~{N9On}EJ}Z4 zt@r~}gni^^yDCbNRE2oPemRHtm_UPQd9{ucV-C~*Aakn1#p{&4BHW5QK|iBhJF0FR z?&+pN9$9%r9@X6}YU}1&{&SI(-iX?|h2pQ1Qm5os(k->-_ZoozB~{mYm%bj)v6_=L z-+6jD2W3Af1+Q1@(a8aEkg%I%Js$Uj#H{sklzNHrjZ4kwXO?Rnb$GYOZPc~{^gq|y zPE@6Hl(|?340=sm&P{AUhMs!HK(SqhG;(&UlKu$Svfj>%yu)7PE+w^H$*Zy3YYSZ+ zSF2s9tdTY-`sp(4Exx@2cf*7fb02vA*5SY1~6;oFt|GSN@^Y-4q{S*=?GayY$Ol zxcXs+@D26uydxYFpLdG58ZLKL96%^pHI9;2sLZb`Oy+wzzxVYj^S!jN`^+CM^ZlI0 z1AUSCev1EqDf1?mz9~!Q2lC2n;+u;yn9Q3{=1n%4DQU%603F@e%h=(&f1zGu9TYi` zZb7bPE2L?2w}nE{=8kUH*}|K0MZ#e7q5QV#^ zD0OF%xnP>YLe^Dm{ozwCeXGkI?%7bJ-oYx=Qz+n5F8BQKCP_TDoP6D$Zzp4Ka;o&# z6rQ8miIH#IO=j9aTEHX~W0tJ9Y4Rcn8jA*V?7=4F7=%2!PH9}L3aLNC)OnEl`!ela zTvPHUWBzHp0Ox6tD7-U!4cF^soc^5_xJJP@+s@wPXD=2Iwp-uh6!vLsjDgxV6`uWD2_#h27d`VYi~NTk{C}haW2JRup!tUD&NC z?AE>ryA_4q>J)Y>3cHmH%c=pm=u;R)v38x!Yr!L8EufBXvHu9~O#V%*T`TDRcV4@0 zaOpR=-2IH%(E5I$XoD*?lTvAAF;GIL@$x2i1>7wz{T7$)qCj87sw01NEA<%s~0Gu}>Y zX!yu1rp_+sz=KTSAp}_5_W+5NgdOBm*q{RG!!dmX0d9th5i>ImCz|@<`(`-mC~9qG#`R)CbW$))*`in02n7sCW0qy-lL3=-C z+WQ5x_X|1g{UVwON~+9d?}c{W^4R++)83p|0ee4X+WSSc_lpjDzldEjWCuBI27AZM zbT_6S^25)P=cvO)vqIuXLXT{R8V3GjWsD}8M`&hmu*LH@l31!9rJq;MHn(l1X3V|0 zjjC*Gt^I`trf0;!)IrZL;DPCOmwr1&l09W=SYKbx_E>GB7<7-7c)Birhosx#YYQ^6 zt=9hXNoo4SQalHN5`LpJwYL;T8{e1ZroJ5qZ?{X14OjzNo^~~xZM@s1Kjv~DutwTg zs-7>Y3-leeT4UWDyj+l!gPZL6!?Uzx>&qUcwzD>i_gy0IfHp22#4G$bq38L-3zQ-r zcPQ)abQ?PD$30JfUZ_>Szzu{i*4o*BolP-4f;H+9Xn?}oWJgWFLxycQ&K7bnSCsZ= z$)u(uwb|h-CE~F#`T%{%i)7L&GU&l};8D=_y;Q4pnyCRwVu^}ki3R>cFTI1_Ce~;F?IYt2`szBOl+hon3L5>*eDfN!G?04qnX4O5@Jx5)uo{L zjk28r>o{ydy>Gz?l)cO1Jd@}k6L=T`>x6C1OgxZKz>?PCqV!iBHqNk}Em+ipF1Hqr z748IW&)W&I^2$8*pRgH8R`4x2HDe z2EIMDc{cFvskOh{DX0I88~FB8I)9W?o3joA-^+=e&Zb~qcj>RY+~dMu*%aNKG1WHc|Yrm)q<2G?V zFYrdKa737OEC^NW-)RHzMs1(d{#!~vjq?s~a{6yk`gcjG+a=YDXD>Sod6Oc)RhuhK zRrL)LPwJw!eaof4g&mqWI}CXmRm5A^SA&d$!~U#k(euk4MGZ1>+=w%r5V8_Sk`new z8@OxJGF2lDb#Ei@xZYIdsC#rT03@>>XZmQ|z)Ce>q&#Nbqi~Q>-E$DFZl&XXVz|f# zd3B;(QBIz*;>+4k)bjBcl#eJbl`4Q4O`beKQ;&Xl6E|RghFBuFaLjHu`?}>yGMj+_-8}-ppLqJoeO`oK>CPuoTWLA<^ z+_r>hL|US$ZA(UWdpy3_$dOt(Xv%ycI;xLS9o5H}Xp@*|leK;$N5)ZN z7oj^&5WUTF2%@+7SVqXp2pO8(2LBUY_-|;X$Fye>>GnvgR??VGw06f6P!27Fk{zEg zjA$(3_l6<~;40#a1{3}UZ^#IGW6=h%PSjr?^?5^{7^=yr4@T=_zGNs8Z}0>Ik&qG7 zO6PR6PigDStR}jjpJ;1oPIq*7nyJc?Hm_C&;(H-x|Vp+Av?R% z2~8b2av`rCgH6x0`BmEz#$|t+Z|3y3!<#N?CQ$wx8UJ&cBPN(5CbbH|qa7sT^e>ko z(?pRo3&6^)k*+SN`tp?JS`koypJMXkWxs}Y0O(}Oa?`_H$w*5pcyfKn>uZ3j8ca0! zW088l#}|pk>b>4%GU1KXhmwh8Jm62ngHf;F7fA;Fv1CIc(U1g(4*KgGqMEBQ-O>i3 zuA_ypXZSQZ>SgtXGpw$#at9DLvMsW_g-WwLW$KWla~&tyyIIY7f~hkz1>!=iYiY;I zE~vmUQ(;M_ux8CQA2Km0$H_w}d+?f124NJROpTQx!Ny2B(ayw6u)?68CXY?WA!=wc zh7`gHxDmq7&!k)0o3#=edEJx<X(cV~E3i1TqXKAG?s0z%`z1+j_yxRDBPqMzjF#Miq zBI!#Sp?D&m@cR5-4+JbvFcJ*L8zK!xgU9FfKqU6~0}yTF5r5JXjl|>0WB`IyOJ->z zZI-u)aj;k`PS6}B-EGB)#WcG!Y$8l%2vdkgx-{3UL^7il&1-31n$cW<>ot)VGUP=j za+)DSEnNyu4bTgr(8-Bpq`Ni4pck0<$1&&*6CYYi@HMloaD)~X8vWh#H3ghe8y}1W zf*!xm51~9B3dV!j2zh-$pOJ_rBR)?<(jSRN5|O0Oh$SNiH0^PtAyyADKM3u7C>hn1 z*)8oPdLX&t?)J_|Y?&rOdK;t<5SuLmh=sSt>;Vv%s&H`WWo%9d`jJ&Y4F1@OK>{Tf zqQ99&;^vXAjKLpRfHA9kDG4eT8_SUISQ~#|KA*nRqGHat)=o6A-w5dm&W2FX zVs=ZgMJaD16qclcwpQHK-PsB~)S_rdH@p^gWiV9A(07rS7$#^-drL+eB)m*bceFLN zv?VkNTBuo5wUXvUhP;C=lhY$z_`IN#gk2>DmB&Rgt70APD-!9bqH%vTSRa4^OVFRFhxz~kC+71djD~n95eOLd zkx;zeNceogKm)|)`lR1iA4~*%zNA((8~UtEHDyMmohc`(^~WAvJl?|9G9DlkzF^$v zhcQz_$R7+w>Z3-iK9-32fiO^tLKTa}g3w6BAPxqiL2p9{##A9MRJ0(dyM)QbToZ}* zYZE2xN76ae0n~x`s}#}7*t7dL+5i#JeYE91NLBhR;T~T(Hb$dJ6h>wE2g{k?(%haP zJqYyKE_g!+VZRk7fQe6Eu`V+hsI*AS)doyJn@d`mbVfU%g$-qvkR)zW(UMIaoT?1< zM2^Ea2m)uPa=XdA}X})mH-*8sx2qWO&tWHY~|99*2Lt<>Mq8Ak~BV(TUNAm zwM1KqYiS~d#zY#R!P~jpL$&J8Ku^19X-7Bq0OClC^tck4sV#|CI@Aoo_+DNGHpsM+ z%x0cBg4Q_lLKrZXvR~fMq(g*IvqvlCfZF(YLok*Mg?u5XQZV3;8j(me5KKfOfoQ!E zh=bqz>qF3hC;ZVw!WRqFha#~A4mum4;>AJ%tzRR=fR0Qe-bCWh66k?Im(gSkyN~?2 zpCF8vNfRTf&1UKmSz=^b?PB0tLzMhwDoHMcazP&$=SioK4uz)E+{_H(KFN;OIPE9} z8e^m@8E9nqX@k6n(mqY<(d71oRz#r(;q(POMZkb&Z@rYKka-4prc*HZP(~AGM>1$&mdjuBRyIj3va3$Xt@BN!_;)$J1 zY}>Y-oY*8nZapuauGQ5qde`c;SFP^q+O@x*rCs{(;0JVU z*rQpfqe-j+;ScIrkOhh2!4GN|Odw^??`t?Ow<4as&06@~bb*w($F@R*->Pdx@yE<_ zAnnofw6f$W{-B&I-Dnc9Xc3n6#?MFB&>v4bf@GH?#LpS%;oCzyJd#CPxiTXw{j`Ni zLW3tcfj?!Pl4~_9wUjPkYvWdIWGKwcu-B)235KK%)=ZPdq!T%c08VBrbhHcR^5UM z-#XX;k2{ntirpZI>8?!5X z{?{!f1spu~Hw$S=gEmaX)XV*bT-Tcl>{j}JhUmtbVED22tsOi+D&ZnN&V$yBi0cPQ zEdvfC6As5$Eiyz>n$}w^igeEu-;5rosFmLwK;Lx^c8Z?Cy)Z$oxLymQ32@>fJArVV zw6tO=7qhu*fa#o`bYMD}(4l0V!sX2C+J#X3XmPlNrzves1175#yK*z&TE+lT7WkE& z$Q2cA%(`YW3@8-?$YW3VK-*JN4U8yM%6wR%;l_B66{1E=?3=MQG3uHZBnKiDEk8+y zS=Y8iRxJ;$U$DJ=d!ey;RIs*GgEIN47ha#!`v0An$$g*0tV-h;x%(ue+`(O~UQK5+260zK7GqaC2gHr?d)J$&< zpQL_1_mUItY-z%ka(*N*6>j#YryS$YM2#1$zexSrJ=UYIq?5E*&2lDH!}D4qGkVpn z@s)HlRr5NRU=v1@Os`u*XHqnf)@(ntA}wtVd?T~jb9h3W^NuK18syMkORy!0XYnXv zi1x3~2~dJ^82+0ZVEP$mR_QDyE(^>qP7>|77t#|#N0$;J9yTUH`7E2&5ayTs491EM zK``YkK+lvD@6_@{iV^I5Uk&c94%yVnjE<)9)--I<1W!gayMQH~seEeZR|LvH z;$nfeojOCp?js^MXfHu75Cm7Z*#ng(VLBOSs?B_#pHO7I#SUYg>cEMjJLPV@H0CRT zW$}BmP8M3j%_F{6?f|+_6jio@lI3Bp6*PW6Dw>B+>k_RFZ|sg$ReSH6JY`0dZ!O(e z2tzF>V>MK;Hnd~#4@OV8-o6YuX)^}?ry;9|F_WJ;%asf!&=FI$gI+{spKjEIST3Cv ztUfVmF^B2`zef@8)e1Xn^czAv7jBSYHYZnmP~z=Bt!$HlJ*a?}_!w2Of%O=lhGb}t z0cG&Z&%!*JZ@voU50xHNqmwC~NU3QE_(;SFCmPhVo?o|=vi2%x&iwd?!(e>a*48Nl zZz?$%YYGbpcuN2?!%XZ~pk6m2gDS1=4upNSlszaT^ggCd&ywXEt!OtfQtk=p9jZNu z&?`vdK72>aDETM)#Q`jb$Xp6@j2{el_{GACDfNw5pl3$p7d#k~krQ3%lZ9?lIFq<0 zr!b4`>IW;_-+a&9J@qhnHrrlQLdCPDKdp{`I!xKt_l3+od4T6#Y({J}csdp$h@ zE@>|GZ@O(nLTATnjttC$l3tl^x zGnxLoNKGugRDf+JTDYKhWV=u6{)jp2n29(-lTUxbZxf&2uaxlS#py9s(z-{VcR>E{D zzno=1_JzEIc=}m>QqscE-{bmtZcTnvZ!%PG*YHCI>O9r1gA(nH->Ov>Y4K4*UZFXJ=*x2ct5y!L`21E0DhZr7qmCEBqvqJ9QZQv;jme z*qM!$t_e*Dx8a`443XwpjB@EMF5$hQ&P!De?eJ1Rn855F` z)2IXCU<6}z%yVve*y0$-{DyUodOvNPG*x2$g9>zMUiT)|{9A||VWfxd0GcBzK4cVB z2ivxITR|?D1!lYflv_L4qA*R}Td}07RuUNMc~I8NW*WkB5vJ`c_T;_84v~xOhm?g; z0udOgKoDgJ^?8)4HO!MfLNfL)aZxr-1A~CY{8&Z%9|kR`cnOV*UP@@`vG>Z6gAFLq znAHVX5gKW~pwtxYktr#SYP80G%KdJMh(7$~Z1lUuf}WV60FI6mn-Cm;RkZRfQQVpjlxf{gLWGd%GZ(SPE z980R5`?qD*7av`Vrh2f=4@|S0kuXz}9JbF7I#<#q9 zvE#1~ur~S1MG;EeVFqI*{me%(RW$-g8L63DN#MOM(b=5mws$rb;^TxdbFU5fl9vLw zu;qt|P0XgnH1ubYT`AJSAsdqLPux?;TN_b?4fZT614(;Dw8-mdYwf8-e^h3_a6;}$ zXz^~&jxtY3Oi-TqJII@XMV_xaEV*H$g}(r_G~5~@=-KkYnVd)$5m5?{X7zPs7aLiP zSbKbV=9yp)EYJV5ZEyHoQ9$340kr+Y+g7kwZ>>kC*wFo%KbnRpmliK?B?eRH@60+* za13SVl%QA56K@+lx6X2@S|mg!jtcR! zTvef!5QU~p0=b1UmcF@5MWBXz>c$+rGieNY(6x*3Hxlq?oe+UN3^eInHF6bvl|OA> z6V%ZWsrr;AAKFz z)z6%Jb*r&X)(fr(bq17B%TgO?mjUA26S4A1>d~yA*UR&?=IgmF2!<2OeO7nEUqhR8s-VqFG z#=I!doLT~HBd*hQQHMzSLd(fze^&p@HK!xpvv+)hl{@k0oQqMFZ)72W;z?EBVbND*UV0%)E7u-47q{U&N6yoi8{Y ze!d|>P?7(cET`Kc2=-s6**!e?#XcO}Ve7%o9p8B1PH>Pwl=NwLE|YY;yb~8x=Wab7 zHFkOk8a3rCU(a>V+(qu};5YoTz7F!&>yA+@d3t+)_|Z)vI>vl@CeqU1EAdb03VsYG z=u~Qypj+t*0jiS#3?>6ta7d!my#t};@7B-PQbVQTE>CKz`+Q;Fv%4A&yOJOFrDnZ# zxxR$<2#@N7@Hi9v*HGu~XMB-G(6PKfVq)5(x6f|a>?LES!P$3Xd!lE5!Gq*6t^?R7 zIrL|=2^qILh-!)tqkA%vj(Z#RmeP0O0IIxtb|b$wT8IuXw<2SGk8hSjL_?5RL+y+_ zMxrY%SGKL)3Hl$8g2rGR`Z<=g6)=L>p5H+zXTF|mkj5-zsD1)4*CpT`O(2cx>c#}y5z?z6g(!u8p17O58Q_sr`v@~N+Q4;(wC>*q! zFt3=fb%VFv^P|AWXWqKRIAoo%2#eiR70$|1&^f-$E7QXr$~~s1V+f46_0Qnne{+ss z5PUk3mbsyY5oXpAg$I=O=xADgS9T<_>)G;{XO6E7m|6p>T4PlZ)Am}%IsZFuErr~B znoBN#0UhK_;<5G#lov^Z5q(C9MtGU<6q&h zYjU&`3<__#wifQ9h$$S1wxZgnpMPTJ6gHR61th>9F~U($8`KEGo5CwUw4|N_AZyN0 z`?tlRFiq|6WgyR}!r&`Y<%!hs@~K823&@Atutw#@9l12s1=bm}}nZd{@ZI?Ch8$x7L)f9NB(Q zvaDOM@i*%&lfN?2tu<#o-ok8E*IDk=y^9cG0KJZWX_v`_#ln&9+C0lWcT_h1pp@4pd7-q1%%^gr72 z(#Yisz+l9HlXv0YwUI*pbZytoQAN!~KyK%FDNh>s-*oG;1|u6td-t6QOxtM-I#gJ- zz(YQ|%n5;ZEDJcA5Qi3PWN-Z@O(zyf4)}&PQh`VG!7U5O^n$HGXs&>fk;OLv$dUC&bTVhtd=I#QOLR0%m)N=#6UXku5fN2X?w z3S*8l2`W&Jxo{XYYk97=tkosHn}v^OvyQdZ0BX?sngv$ZxmMgBLmM%KaebgQpn0#TKboXN+5U+dyCYA?ajPz&1x9Gtdd|g$-T|KDtwD zO?|P#wdTiek4y1kgm0sSg~uTdm}{xPq0ptMLp~$rMniDtX_Mt>tc2J{|=fNpMd9b`ar|O?a^yBdkJU$ zta}U_`MUD|#;(xWvr$>M$ROs~4iF0iwye5F|OCtyLFxJIgKaD+Lnw16l9mRz4 z{^5WM1iqGw{uN=L4Fe$l2C0mr&ar$73MQ@ zwcE)1Kl-=LxofWKu;VD{(~%J_fa_i3M`s^#XhUiKR>;%U-D+~wlEtds4+dUlc_l?< zljd#;DpQk?U9C?~mWyE>D*0*(6&i%iY9U6rh2Hx{rouAUXUBtyP?slm;Bh6o^mY@Qk$`EIrT0KvOW|DB!`dhf`;0X%TXJ5}6 z%G{^u*aOg{zyJNCx?F9AjF02bJo(0cxCQVLaN>}^_-mQ5Y_`EVc8&cwTE zEBlg)U(02*J;gmKz!5Ya_gATIrSf zxoz9qKfUV7Y0i`mHQfgn`1}b_DEl;=u_97HaHEH%SDZkoYh~P-9T)nzut!`BWs28p z!|Q>e(b=b>c8a35o3Lp#YGDcx4wVd_Zec_E#7w_rayYB9U0H5nR`v^O$kN0eydM|4 z%WroIRU*k!dXdE$P(IbNpHtC=J+$eo!Cqb+oj@!njah1ivfIRexNzH=i2EnJcA4do z)i{c2iPN~WD?^B33Bnj1+bX_R9Lp-PHeQ(9dDX@i*&c7;9UKtnd?Vf#n+t zzK|f+Qi)WWPMZTv1&Nmc6G4s(i8)22Y=tGG9`y7w$EwHUfo`Pw;8AAU<#YwZ3rbij z*%@o%ur0HAN-DA89?RH^N6hqmMtTdJMOvi{qNgtwtP~BF=m}K?>g#dzL+x`UL^it? z!bjs(p)o~lHpBv2l11%I?Yx;|rEDAxRnpyL#Kp-fk{E-<=TYz4XKf@PqS+L%M}AzilPLLE1tF+Sl= zan7+odH(2jqajlbGh1c##Tp=3{rDV=ZKL#i!)YwcaxL6zkZKZ>a6s=L(xR(NA^2*8 z=DYeqsZ*}LxV9<>Q=Ed?qDF4SsA)K zjae1zQUbz{TLV7Mw>9Fc-wo=Xl3~lBn%_8wU;Dng(NjnR z#JyE*>~X+7e=GC;0{X^5VUM=vFT_r|>V9fK?~{W$gkZU)I!H8d$#-zcXK>-mzgOHQ z@N8L3G0A7uO*#ExK9-yWI*|=iY2^$A#@h>*YZQ0#)Qr?fJ=6sGxR~oqn)_ZQ-Uj`V zZ$4|*OP}8-FxC;PK9G#UnWpuT$8lPWg(;NB7YsNZxRGWgFT~ZY%&JZ_yRjK&=CmCx zI+j*IYi9N)xfEL93oZRSxixn|xmB*c8E|+hluj|iqu2qx8Bpb=Om8hH59IQ{FYFj*$0#{>;Qi50-axN8~M7UV--yFlm=2OVY97Zj6LhVOZ*yzF`|1!!) zsAAW-l+W@umW;1$`UlpU9sravP9%`As8*=&!4qcL^jCNx!6LPeUET+Nn^m>by~=Tk zp38c%N)p?aPH>5oWBw|h4rjE&xP!qaq*l398lZGk_j~(PMYDlw1-+rciqyP&VelGX3$IDbzVL%{lWd*Cwl8Zq5cR>V62A8KmWduVFIBr5lFS zGAoS%NX-y5*c)BX2ON(?Rl>pa@`X6BGo@k~#zu3Ls{m1Nk`0{M15g<|`K_^Kpbe3*;9(t%M_YKFFlcFf1l#a0CZf~Uz1srQ+>AQ+` zFb2Dpk&zoXc?8;v1^y(N>AL+Hw{s%qFb=X|akovgQI1Kqak0GNIL_TMIq~9WQbT-| zh)UtJ-;4}}VkSPNUnK7DoJdB9SBy|KHIwOVcaBi1b&lB8ZW}DoY#YP`vA)YRW1$~U zBjH&)wyX&`s%>E)!qqPqlMF+r5M|MHct{80-Y_6**&s2VdVtea?ve( zbdvfwli6s=t;Ho7t2gFKMaz4UHnVIqd|K+eD!`S3G@0Xe0M}zLiVl#J(Eoil*B@4_ z8>Ju9kD}hv6D=LUyxcCulj6AhuwH*!l-wPc7IyJLEz{-!5vYb_SoDgRRdk(P>GhGR zRL9hul6B;)DKzNxs{rV&maYHSk`BvwALJJO;#9wQ4?T||+oLW5n*@1s zp}NbGiV=wFiKpij$q025>xGny+3*Mym+F*d_)w^#Nhy!m{W%#cnHE_|bb2oO&L?gJ zXk=SOwlam5sJu%VXDeB~Jncez+)9`S*=ynvmQ-@Zr(4rojP4GxJX*WT&^bMVLO&%O z>_RDojiymq^^uYODdi*u;K&-La~7%rRH zt0k1V&vu2evxz-YiL1spyALfAUHxtHKHEA+sCp@sEo0|H69Q4BsmIg{Ju(T$)P_J++AKj=_Ra-ve$$QGR# z!O$&pDAsP$P8XxR$FYsFn0g4nk{i7~E%U&O(EOzmJB4)Ty|a&JTRMS$6ZPEu z$H__3$%&q4TT0e|(ueAE__5BfVQv~a>+H9zf10XN#$WE9_^0Ez^uN~N226jf$PMepcz zIzFv4c#1ccmul6Mf!CnNr*0ikrY0zxR^CJfSU6jJctw$nvDfN%Kc^q~xZwIsc02R& z83qa65tAEmlF_ts1xS#%3Xta1R9+MwJ!M^7+k(_$igTSxxkA6JO_|x7W17?Y=X8A2 z@W_<{5rm(eIezZk!CGO5aj%VcJ^psJs?Jh{`B3z5gtJM2*vx)5dh$=RTtANwWeVP` zE%IM%*M@x4V`NN441EmrSj#TM{ubOO?Is`k;pTOUTYg;!uAT=+$1Oddv#smtCs;SW zww2b7iw&2wSE1=wtI-$TXxVL!RVC%qHpS`{?fYG4U$vFb_?$qy(FPctH<@U1{X+@@ zes#O_uywW@SfPUV040NUTX%+N`%-libOhZfOgmj>Ifv)jlG`w>pQF+1cvx7pYIVl5 zCoPS1*a-ufnJE=hr?Qb};Q)LhO258zlX0oGG<@ZthP1Tn$MM)mGig~>YcAbgQk#>k4Vn~?~CYck)_rm-_8xhLI4r=B(fr8=UzInc- zV4ZFE9B0kXIU@XC`IC}!^J+?hfv8}vrrmk$mIe_>KlcC2b{WIVzjISoF?zB@X;=p_^7$l zkvRiZn#~ihAJ|D8Wc0;ki1bZjA+*zl?MY%;%|2c;4-Vx~?kf-2g$fnJ57@5Wr@Glh z%jSI#qiy^mRns|VsBYd+I)u|%@MmRewv7#-2i4vrET@Y*WgLgb29FoDu>ya!vFbU) zUfLIs7hvQF+%|fwnN`b5)@zYch#?!nhadOTi~ap&qV%5>hHRBRhMZ%tU|#lD=DYro z&lVR<6=Gk~M_vX1Uk>Y@<4-m$>BFUbC6LnZ{W{lMzYu|Rc5RzDg` zFB;1>I`tEe>4VGY)oDQ2gcNm8sBNCl!Vzg>FUb{?K&qW4qhP58+N-3Hy@kN#^2Z(R zAT}NqgO~y?#ZrZ%6BYGSF1-_U9=C)mi1~D}X?ezGep9Adh(kgh#J!38?+8meeV;u_ z4_nUSem2`!%!Z@$*GDmBcd~7?IP2?4GE04w?dwzM`V^y1)ROQdh7Kp93ur;b^amHv z$o_CRoKI*jV>(U?`CIXdBu+ZYc4))S-X+?LBdRR3a%`|Rl&Sh* z;Wk9Q=OF0lS%^bMVFeAPK6Q3aM`_`Zy2Nd*opDph zB)2H=2M?*K;V%!E_{%*P>BKfi7Co=ynjt@20gnA`|NN;;7Q@3$Q`^q7f!rO>UhT&v zxIODg#cuTr_vD2nQch1d8(jmZcxBGxvV!GT4UPxl{7*+SPae~iiIGn#4+dDCS*R1Rl1>2gy+pl)4Gfi?T@KTb8C zC#UzGAqed7HJK78<%w}K;Nt)YwP<(8rgBG@bXrE8BJ!%~x<@g^)tU;zh$Wtoo8pg% zB*;R#FR{7?P@HqHiuZXcykoO*1?{4<#-aRiJr|Eq zLTa_HNB*(g#nt450a-^uD0)l5Ri!4xiX}x=UO8T& zpSW+6ZSt1_w^2-|WvH1q1s}K2U0$2`&-jaa8*&&g*-(kSKWxMrF^4$N1&4=S)}eUK zI&!*V;=X7x!>D+nXyKF9ihLgR)Ig7+4R+D+0@OPS7VT@m!e^+5CU;eSX2YK9SRFM;H)=+ksz!ii%Z09Ig8O>j$Rw-LHS#_%d zP%{Q#@br|Zo?kVnNY%SPb9*IATr7-DNtz#9w3U)=A?q(S0|@aR9wx0N3^X1y1#_46 z_s;IuaLCHbmxPJWE^~~`4{au=K+F-8R-?3e6;UrjnyZ=+{b-Sj zjN$mB((@zd){#UGLy{J3@$r_M&vUdRW4W%mV#H_wvdKP2-V>se6|PDefv#b+R4>0# z%)Cfcnn5NkbFU39#swii)S>4(R(h4ba|di9yBLLtc!%RQS?#ImrK5^^X;?XGJZ+&M zWBG)?YpT$h3lq!qwn3ILE)iypg~fBcOJ^1cJb;UM_3=d!ghC;-6Rl*|A zDIDDWidv@c3$EjWM27yt%U}cb1HRW(n>`g>I`EJpEm?(624JbJS&)?NifHY^*e`mx zI6rk)nqrqIdM6ie(WOOJaMUFx4Kq7~cSkhrHNr&b*jWcpKOS)!be|+UU_jkUZfR-O zY*za7h|`H-IPFg>*jQ)r$mWfj3;J&ialIF53;uBy>^*G6yKOV~)LrC@?Due*rJHxx zq12OAA~R3d)U+zsOQ9ljiL?`~mn_6Tg)THuXALDW7&i~x)618<`qOt8@K-Z^Uqlgn z+Qqus<~rIOElo>FvaDX@bw^m`=4sXjTBiBVkv3ViOu;c$xr7#Z<{OU7E$quJkMVLv z)8q*p?jR1%Klm+;b$nCS_#9ZamS5MMHn$a8`+#{}=Du5OL#8-2SrazYt34l*{&cLZ zNR8Jk=03TbUQNNJkE z2XF6ZL7z1F{HTcuLxYn3L$>i}iO^6>RDT6YhG(%Y*q@w*p_^(~c8yF4)U&ja2KDt{ z(~D$`ojO4k=EgoBo?b+^V3=h{xLM`o(E^oPTfvVypezCziU|39p>n;~^=6NK7Ys{t?wKK5Q`3{ld^oF%Q z6M5lBqpGJ=}-o~Gndl$@E{tp(ftV!00c0cc*2z3N$n>EU9i8YSF+w{jT zDOuq$&uTY%Dl7wWR9-ffXU?L<^HSZE?N(~t(4yLuYh`K(CH!WjwaI=_0CawvzWVGe zOSVEU>h!c+AHt8~2FpgYGA}c@<3oWU-F}G$bMqT>cWHhw(Z1V)s6bO3Z_N~9UNj(=<5keD3<$MRKC@_7YjgXR;*S-d7b z=r@ohMJpL1Q4*{2{UOjtK8@laF!v=J%G4%wR$b7JQX1_u`X=HBBn`%SuCj#j(jEGE zS%4p9iyX)VDSD5RI?KDK+Ogj0@AoZ)^A19-!Ms0 zHT+$`v5pQ;pM*>xA443~P0Ve&XredUY*r7zX4e;SDG-?*oCI~DHiLU*CalTIX>Tfh z0gYdcg#3+(#5huE80%qeW9WY1Kv1X6yduoghC?lz>q^Uo>v)nY1e2xlE#bA!NRHJ2 z8PzIJY2C&de+VWyY?6@Xpx8W7GNCD=%>S8N1G|kP!UgiZ*`KN z{MS;e9Lk&-bKDtCWDQJ0V&1tecEXWLw44$FWgM6%>}QD)T_w}b3>bB{a}y84oNb72 z)muSX9$`MAl&`}2snn($g5%H)iugt_e{(6v`=lvQmXCNG&R|D{&O0JFVH$q`GV~fR zzttBgc8Axg#}I62b7b?3J8V?^a7k-^!rYZhX6EjIi)4%^UbXk44G4B~ad+`Sg@~B3 z?If6DDW*e=={?`E>5j8v6h+*G;YTsaGEo1hV)6AB6WgfuyLF$b;6tokj0YJNM4ciJaAx9dbCYt^-@(Y zvEfIfkI76-I`3Q~O>-37*!lT3x)OVk_QAHeQe`BsUkqiIs=;EFZw>Os*}~b@r>=DK zTy6<=E%Rt7K}12{jUu&8Q2wYUCys&yssjsw0vR)tN;BOtOeV8&?l-aeArhZuqUP=w z=nTV$i(>ikucPB89J%V%R?eN~qqIr;yPK?G@2;Sq4lRKma+UxAt)rm$~uOP#ty#0~XYZJ%|ye6}op zO2yWk%G0G)RZC7|IuSS3kwnGTXiQF4>qr4`F;3di3Hd=^XlY!$SCN!#U252fP(p^F zT)$ug7k=32<`7;~QA{#j=353aXPs}h20m+znORHMNqEX)eSITh=}Tzg*bf)*RCEl%5{mwY$)@V;VXZU zrW$C2O${G5=1>fiK^ibVC+SUdH*=SQMe0f8(Teo`kUkXuV67HQz1Cc$NH%cv3i-iD zmh!Hf7f7nuG-Q!V^oH~9U{eQ{81o$#5qQf)ox^ch`v;2H;N>3fGM1QG16%OnFAPf} zCu)_wL(hU;nVbbC6p}b~ekAXZ%+Yl4mK^vM~*@Y5dITmlV5M zQjX=4)TEi`%J~wrDN+^zypncSwhU^s&c8HG5bLWTQs)+-15Aq6?R4mty$>E)*WriL zaLBb{v$3P;3p#LL$QJZ_+~!&JUo6xlCY=gY>p2v*OTNEkD*$B*aHYI=)r*tlTQfQS zndWkSIeAm9 zHV&qed5U9O%l()j1jOA7&_~fEbom(Fb(BY-Mdq@tbsSh&3gf%(J0XBC`rC?F6sPFw z!5>|%k5HQX7pmuys0s~0sL>zmuK$3~oLUEGt5a`g90NqCNDiy_R905%hj zAJgdqIGxWb)jc#gf(y^KQh^Bsq%OY+JZxqKzPo6bTc2jnekz@)m5c~C-?!8}lNfY5 z(_^1$V5BBP%uXit6~W!d%m|Dn#I5(F zj?UocrI+8yRp-1*pRC>{>$;%2>7jItxBdm^4|}fKe_lp)w; zu#`lx_}zMJF9#h>*tgd7$chg;*`_%@sb*I9$kB&;g}H1~YiaQvT$O(3b>|SOZLt@& zx>CQC;jJ(kD7K`ka3MLD7V1k#$^>&q`L}|lR=z`Wo%ji!$zkU~o1QvOT0X`h2$`<| z*h*L89GBED)bU2piObEu2K9Z_Ri)w~brNNc-&FS)@KZHm1U6X{`WL50ki z_-|9Iro>4*1uiP8^!Pe5sZNx@t811O%~94%mu0W^)E#Jgqen!cqx0oG&i7s4}f zoLYhcu`lBf;Og{2|qbm$v!b78!YMIE{hX#j4XT(c6 zpdF2j^{nwwafb(oglELP*>NYY?D7-aEEtp{ABhGn1e7DI&~ZhCa0{6ULc^n&YMJQS z$p?l^X2gxzaV!5fbg*QjSgBPZ-!WTUgLu%w{M+jQi`6fZ`6#S3f`O5HV(}sdi+ry1 zsK=*fCOY<|u&4(kTb7ncplQi{HCBA zNf+p!JW=L2)3hen(mDo!aObtyGdJaKeZ%2o?s`hxBs#%xRD4Le|1ZNC z@KNu=F`}NP@&eZ1CBn85+HokV0_j}cFW7okJ-E0MRWp0!{qT0<%zkSs6)K0%ngqtDEGX&BpY`4lK# z3a~@0zM^9KRJy6i;M?$Zw?YVmYx62iiEK^7Q>i3la0I%Kk!V%V+h+g!$C_RJmDT* z4{iK?FArUaR9rY&iT9 zv-cGX8q_gYnqj$j+Z1tTIlGr?Th*K~Z)k1xss)l>BrkG;gHDdRP+z6l(c84hMVza1 z*FBQUE>y50@Xb6^-4p{ql|T&T$2dfmaJBJB56l}yUa6lIMIyTQ9PZ8OiN_+;r1^c3 zin#lYD*OZ29Tnb}{LEm4fJ3kEEh*D0ljS1j$i{I|RiSAJXR^vzFachWhqPf(xtFmpNWBwYi9V@mN02{4P z8!GGMqx?iqoWrh&_G=m7%)yjl2dQP|)IHDc^fX}fQ=!Ty_L93T^Xy9Qhsm#`2d-+- zR+L8_T8tIPgjyns7@V z*l}Y+Rb*}X(62q#H5SS^Ojb)~>+dHqw6Zk$9uSlPSzDfj<+ZfgJ*y65cfc*oe6NgK zn9Afo7Hw2fj7OBlM~rJ)=Er4Q?a4U83pq0G*>^^~X)5gjVIZQi-TXEUThh*E6@-ra z%$5HRq0)4cZ*eL0DLy+NRvKB;^zhBaO|=4^DwZsN35(fw&27$$)au#L4**oqWSJos z$>QW?+kywQ+EC$>r`K*TbCSBLBPWfG`^IcCtATihAc_2k3`SDN@iNiR>mx_lvsre>7HRP zuvK2Ls*mt6yyeTYkgTRonlzNnRNGWaBYgnOoXwyefo@MWjdnJ{%Pz5t@+m^iti%tC z<%?S;^Ct_M{OS8DCW-_RuLcaJnx<8H$f^3+?5`B{bp7QT4-IHTZ=NWb`K5?mkZHIL zgBPo!M0%+wJ+O7CYhc?OMwQ}UF8`KaFBk8Q-z`Em%a5)Y&7VLoY65G9RoubDDCkY& zRj2kGLD`h=QGEozJ_Z>UZv=MS6-3uj*B(_vx|N?L&@tW+RNooG?zCOt-|d3PgG^z^ z(bcIdl>UkDd7swk?|$`sFq|@0#i~kD6`%*B1*41qPSptM2^3Z`R5p}01Q?3%>Z5oM3ZVOBYcn4|+QU{^ee_lVmu)H9=(7fQi@Vvk_;Q3)L{TH%_Zdi8e zcbscg%M%cb0eboX~t225s$L)}jBt`M>!= z|29Yg-{t(ti^U7Ui^dDji^FS%SoerI-0Q;Y?r$Lg6P?hjGH|BKDWAYuJS7yIf!NK` zTTgmG3d05c_t^h90Mj?cH^o22FC_rCm!^lNx4fsk_Y7E?>O$g<>JI0Q>(2B4f`{wC z?SSsU^!oMx51${BAAujKOYrP5_?u0qy^GQX+l6Qgz74hwDeyxe$@&u>aTjw(V@FS| z<)P<0iM`;x0lgx<{kAl*$ay$4t z0XrgUoKYdW?*Gdfo)?Z6q8G9kwiiO8rk($l-&H`izrO#QTE166NPvXDgx_#Lv7fpB zvFeo`kIyjS$KJ;2-3~ut$FC0f4!n(@dN6w6TmNlAZT;9n*iwm7K|>`d+48=82NCiC zKCm+SCU+8upTO`K{Iz>3cl3KwdNq19dY5}SbUW?(Ul5-Oo|&Fuo~fR(pShmNp4pxe zp5JiL@a+ZceXjqz7QFs-ZGVk*4RI}c&3X-gEqjf3?R8Cjt$fX_Xx)V~yzIN|=L2T< z!|q#HXICvGZ{xp@crAZTe{FkBfZT=|{nqo=D-eL>i{y{whZGRw8{@Cwrw}mhI~~B_ z`@e9;cgnwuL*oAx!}1PC{4fvoB{%^D0XzW|!4HCZ68U{JPI*WLaEAXFe%L`=L1aVd zBNvwFAVDEPB0J1Y7}sR>G|#Zl)XzB2^w0dyKb~{3?ve5SH~DQ}h4Ix12`z}2%$T2cGID=W-sQ6x z5Herp5`(t6c09gk`M($C|M2$KVNtzZ+wjocE!`l^Ffc6>zxVsz&++~H-0P5;J$rBWb*;6|b*^>kCQ!5;4(-5z+)b?*zq$taph0Mc%h|s`g7po|29r;BMdoAV`ur#yVWvquQ|{ z0t84$X8R+?{wk7Qho$YM>?Nfoyrs@1FX>*Ay<~bx^^)@fbU}SVe8GHye?fmie!+HudqI0adU4}|aL!I}PHSml zNqMPt$#>~$31=x_>DE%m68BQxQo@qa(#Vn&;7gLF2*9780gsjeKILp519$_Vvvx9o zIilL5{)Ih;f1&UHU~hX#U=JHId?{DT895P>CyC7vajB^AI##0&UW3INZFV42o~$b-p4 z&V$NB!h_R8<>V<~$XkFZY4%)ze!_rWO8*P7^8YsL|JzrrNwLPf{L--V|7%G2(()3` zzs>n}$>sksDb}EyOVdlRrH@OVuNA+GcklmL(%d86)7`tdXS;V}@8O>Op4T4Xp5~sw z-eL!k*mNE)IRKXZ7lZ9t0*=R87!S+X|6%7O0F>arxs7Zo>R*w^w1?hf*fZOM>^*m8 zJs~_1IAJ`Y{2PhfCp7=CY(rY;GXfx-%kr{4)EH(W{QMVLZrmUoO?W2I`~?@lB5n<# z6Cr><3V=ii0rJ4l#r;blSn|NH2k5LOXtrIhU9O|Py}rY}9nZaE)1N3P%s(tJEC5Ir z{@8S(71ZnB8@L|09)L}SOo2=ROhIY>e)s^u@g#`k0s(FWazR=e610f%yL|I_}b zgQ_F0!?0txL!!N=!>PUHMK?d;zmWmZZ5${L2fzd_77_o#1Cb>$fP(*v0X$2hzX-rz zAYZ^;AYCB1VtI)V1SOdxPJMtAkk~i_uq3?bANDKs_dig>lJ7qp{tw&;4d)Hc?o59p zZ^Ncf*LGJRh5iOY{hwd}cmg0|27rhG;%iz?ZRVg{p8v}eNC5f-&LRMahychC&Ry5U z!vI+P0|=YHAn0DgdSCvpuML(SFU_Vu6w(C2UUAqhXi1T z#cN2ve8aWX>ipj8t)L}(fQKn_2y!SaaRJ;D0NRo-kUHY-;_eavoDS&78KjbU!2tG+ zruP%={_%>lVjZg|}m4!^5Wsfk4E-A2%qjmo9$^SR%p!f!>1XK`zg2kan(a@MmsflH!u$ zQet39G!h~s36(>jkdhb_8U=%6z$hq88Y(FRmqEf&Fr>7soRl;eAp-#fE{l?t1Iwad za=<=lC`3*I1$VF)b9F=6+aSc$Z;7eH-OysDp3Z1jF$4yQ0t3gDML=cbWT9xNELsLE zje%ffkzg=d8iInM<>aJg;4qYoG#U(s%0Vy~IT?&BSO$ug1A{T*D7ZZa2Sok1^MDQ@ ztRh(9kM7XzRHfHo=`G%NEvPOWsMbyMOiH(L8M!SaG|offru4b_ZGIsvSZy*!9eq$&JfN8I=Fu^5Gru$5*my0GJKx!TC$5=X z5xa-X>jC0Q`f;cVzpU>iOGJ?`u6!iZZ2~#<8PDbe#d4pJ7win1DLiW_AL4Ghl9K$k;H>btUMH*)JA6VxV3W(`E`9&+Jryfby z#8ZTT-@DfpTxzzGMSCazYa#VK=YP6z%3H7b641IFaN+y^h6{BZ-O$e*;r3#;96iO5 zNWdK^uq;ecN(wA14Tng)M|eXL+r!3sLM<4zFZ#PooBXS#QDS)~Pf-u#LbezEb(+6_6Eeg%>Y$}rU> zW^J8Jxn5SS;BNSs?z-#Q*(%IS;%j7WERxmqJrW=Fqa+xoAs~pdK>S8A-Y`+?gOIYJ z9rC6UcFFs%<2XQr0f7wnaUii^=zvOZro49Uiw$M-D#!9){>Q+e+6Gah@>6Zn_HfZn zVQpaXTWiHpMKw)~@$?4F6(s5&=T z@2q(VhLiq>hnuq7KYRmBavv~J?SIw7>Q3&CVv-O!G#YRxN(PFQ218|FQV1v-E-8zE zAs`406at5!WRNgvIS2{`#>h%R!DvaeEJ9LB4lId8N+aO^b}_d9Si$Oom86V8zHV!Q z@qw<1?k@gM-QQRGx|h?<6CWn0z3S{FVhaY8UD#E$Zneq@h8qBlPJJD~Nd7 z?W5GN#0ighbK&9i`u&Jh9Em$UwYGMIaLF zQTA|z%_~$whV_$FR5~gn83WI-&OjvE+n^jX5)oM#j5R#VHr_TB^~BoIK0eDnIhh#r zpW%tZi!<^Dl=TJv8vd)!GetW%+hge#B_)HFgn|L?M9N74%q$C+M4@G5p-7l46pn@> z;9xi$g}}hTQV@WMF(@!hQVwvV6b1s52FuDy|J#9B9k7Dc2P*^}Z%IE%QiJZUzTRi- zE<^p|yJH~H!gq(!V(uL8+xNiRV#bk+yWVRU`fLT&(kJH|w^Y{6Qqu*$2EA;ht1;fK zl`qqM9Ovxs(^mNHToB`Gbfol1&_H!p_dxbce-7nBZ(P_;tEsuBm>OQ^nxoq@<-z(j zRlH7n{0iqkjVvO69v=*#D~|vKdiUQjvcA((8|1(87*YxYaGfLs0+oZo&}gI-7=}T} zU}TVhEnyH00wRrp1Ll+i;shlPla-W2z~NFzC=gOWPDNr+|28kS_gKMdf|c#$VO?A! z`W}T)i0|$0qL4vj@=qFrr3I9XMGw@~)rlPfnV+uBgu|o-tUrj52Fl)2Qm+}|#jkpJ zbi?6Bw+h~ebeq{@w$|OO-wNxN`*=L)X@xyP$>4sC;6J}Iig+zHKMcNjsri~9(&!+H zy5m>fcGmM7H!=xqM1#vt1mQFzc)gC(4nODKWr{}I$VHeDpJNPIgZb(L`MZ`#rz9Y+ zdOb=PZo7>+PAVAqJc(xj-{yN|Fl~E1fk`*62}Ta`(`qf~xF;zv2RyMu+CDef2K|VPC~2YDhwq z3tlVXH}X)$<-Tcl`pL=o`wF6Vf1l#<8t`BqjnC_*6Ee?XRR^}APY*3pD@bc@3RizV zb-QCi&Rc}xFDtismm^2<(RM>#uJwQ5%y^ZpToV@rQYHE?1(t$JN}{BtWo6I^NhlPJkOiV$MiMP0B`qU`kVar6 zW&aH{Z1=H(RRt?4rbCWns?->@pAEbrp&@DyRJA)ymky9Mbl+m~Bg2acxXWK3NKo?C z(RJes>LRUUx%P1tsi@l3_UN^<8s5aVEU1o+D|`M*KV8dAA6C1fCzjsd#l5)MPSCeK ze#=XGk4T9qHP;|?2dlWi)j24460V$Vb)h4+PP`2A9-*S1Im;0DwVt49<&ss4Wp{yBDi{kZi@?IJ`}qj z@X}Sr8P~fRn(V9f6+d4n%+ZQOX2@DYO#Q_a8UKxfx3LUD9sEzA9t(=jG9jg~xqY@N zkXy2Rl`(|tF-j5fX@j#WTXiwF>u|aj{B^zQvvzJ#QQ%8^Au0$02@^}z= zYHsnt2OqgjhWN6@5ZDj@%z2i$CqDmK$Uh3#nO~~F?{w2`Z8>1pgf&nz<$nGSd$Y?H zxmqxEj(r+;BjwM^6ipYEHM{h!75rOkj0M+t9d;niT+W5wEnXwf%yD%x`BtKzQCmY< zyU-%JEz&pj3z@49zeWgAq1m&#o2@n`kHA9)$bmN^*ry8~+zZ7I&N+H5{DXJpUCe zXlZE#5-lqQgQKN^aS9lyS!99YR2nLUL_mOdj3Z=a5MZEKMFKPpmX?7cWRPGC432^T zV;wk58u{;F!76|itTI>`GBVKXRHc57WF6bQ^_aTADr)syj zAQJ|c33}@I%MVyEX+tjQZHUHT;+Ve1gS=fN9- zfz*+Wz8`IwdKg}+Es1YhH|aoHxrU(kiP~k0oypO!zFpm+tufJSII-FR{sf{##Jkc zJ;2Uba;p1p0LKLFVDt2u({ty4AqNVVgG$PRWg!Rz3I;_%vCxnLL&4H$1O^V41jeUu z1RMJt7t&qM!5^)~jr<8Qh@eH791ujMRnpsY{4aiNAWr{Yco3(zoN{ZrT($mH`-ej`VM&Gi1OUp`B04l&QNWIA<$mD(3mQwqU zZnR!-l%O2=qfi?Z0#lJFx*x6)84;utG_pa?Fu5a7b|?q)dgI5jt& zFfXMqHw8CDoI%`0TtJ+VTmNSWb?WU(>YIK2tD`>f=*2FbWe$n^v#Wr z4u0Yp;rlE!%?E=_4@!4;@k}Uw9+!c@rg``w{L`P>2Ngem`Z_+^Cpta)RdM9&Cn1{u z;bi3r&E9yxHZcHc*8ewx_Z}P=i^1J&oE-lZy)YQyV@U`a1%@J}fVn9o0s+OK<={vR zSQdf6$VvnA4^Xs}tQ?R7z+eap4FgLQ;)!xFfF;O5j~0XlI)}o z>%_P0t6mYQOGDxJwOp{heH_YH7|Y@f$zc+C3-}yr$!@{kQBdBp=x~_?CcfOakx1wwS{F61i zpscaL^6j7MlHBU{cr>sZ>+oUSFSmssa5+4d;lvcMcNUE>_zAeu6+P2}+KglH?)oxu4X`iwQ&-ywy#4wU1M?@??$3*%rQ5hX;_ri z>yQUc;RMclik~#ciB5Z-Q8#kPVKY>QaQHXCr9m85R|DRP`V zQ~KiutkDdo<0G?ne7iva?k#G`@rMY#2wa`%qs25TC82K3z%$yX?ig6s~rLvKdy zhwoN%SCNQGwpv!_3*FS1bPlevUb_FfOK7xY=CTdW!l!w=h(FIObNbb1!~@rSb{<@) z^y615ApJ5z{>tS5ZJ%e{E|mf_GujahO6g0yR}W=a65}gfwo--x%cjdBO zPjjr{&oqBD;eEU68IykXm@pd!N}PWd*G7P%UYxhOQ z8hLSiCD@$9g(OOSd(&O220r~MMnr<6Ei_%uWh4XU#7*6>rqWMqZ2r_f=n}=F`fR-J zv)EK^$#X7BJAIK^P2Z>h-CCb90+Tzcy$0gW+pt|@A}QWtM-;*PokI za(?@DZ%2@zE1Hu5?eM+z8Tp=i`m{8aEHOb)F5hL@fU?JP2<|xxd4jTZzy}HOuG6o? z5Kb#}ScZ<9JB^|pr;Ehn(LnaSKr)3zGd(c}y5e60YNNiVio{0=LK{B|_)=z?e55R4 zk5`N}y#WEZ}UH1E+LrYkwL8>Z?meDGp%JMxd_&;ijeev%-OPFua6xg$3* zPca42ZX6ZSUbmyRAHP_>h02~M2BX*Vs+}*1vRQlyqu>AZmHcvunOg2B-_dekZY2^? zxIg66Q??#tq$wC znB?HP5R2RPChUypKM89528C(~BS21YU?TT_ErhIXumOZ^11s3}uu^3~@{(R-a`!Wo zn~9qU)(1#x>Ts&{vsy4qYH({Tjm(XRt zS|@Qk)BrM*yF2??DdN@gPZj~Y4FB6PnR-ME<({j~nLF+m?{|mZ#$_H(8%7CGw!AIV z`xVP%;hmXz&DJ9HgI#YXLwvrKa@GWy<>Obj*b*1>xZIFm!a`xAw+hd4uD;6u=18vOyY|D3(|3`Lr>uF#Ucq^Oe?B+X zX-M&jqrGA#cUg0b`O`S&bJvOdLjIozTbZ&Rx;JzGI1N3VzpU8J9Po)1<(Tnvtt>pa z{4urhsq6eX+TljE=w*NE&?u`wbv#!sjd~QM+b_`}EhC~WNqg&a| zjsw~r=GMsQC!1dJ);(mE;QaMX;&5+mrWh=ysWY*Y>2HST7(99Pd-icml5}+zRkCTQ z`!0w4)zJrxUz(5Mkngw50e&-8m+eF{lhEuPS+KpigJWD%cjC=A3(pSPhn_~JB3&n zzLNx{yz9r+$ZL+HsWy9Rx=+-25eeeJn=Pj+`g5#bPIgua24HcBzm`6F}PV;#2 z{cNIQ?_P9svcpgG6x@PWC2&r7<1e3_2ENJUVq?A<#gY4?g_oDzq-%Jo1U^ zOrK9Wqi2UUv`0v8y@*yh{dw+3ar8jtax3ZEE`Hma6eT~wybRyQ&Y=+1yMd3|EcKKFt1kADfpa2zHzC+d2pjotyjn`nyZ!S7DgT~ zCJ%g2n}H%uWWHCQv7BwERuS09{#Y_MLKnt*K%=0*Js{|qM4m_6xqT08e~Oqb(P3Ct z+D;j`aIO1wMGh|HX`|B)bx!Dz%$p$hG2HfY`kZgj@&`S)S#Liw#PTXnQ}auEXj(rjYT`Bgz^7K(b$8Y_bnU&# z4yVP3hOua>h0Rw-Lzt`{eX8%9-iaN2QZE;6Lw}moa6J5Dt1Qi<@h znSmMzxqP+^t4aD9SKI_&Qu3_jM22);Wam#FjEC`bNmPb(QGs{AWTMVi(jQ5K^fT@_ zZ%MV#e8UBA8T3}%%ief>KdT;KN@KdT>ZrWWg`msSgP zl0QJ@PB~5gl9Nc7uGcqN>*zz0Wy5qY7=_-}TldFenA?oyy+uRjYfMd!*}m`J$eve6 zwiOF2+#H;3-24^s36jRcg;>tF`8g?*Vex(6-Ae|u|A?axPdRoG5`$ze&#(9l4KxLJ zSk0dLK@U7Kzp&}DP+ZkR&{`WW?#O#XLt3&;OpX)!R)^h=iEo?_XT0MzRprL?nGbH@ zgk(s^XmZ3Q>W@ZqIGdUjOKrS7>Ly3-la2;GTJLDSA^42wc%ty8h-%IY+%MFyb&m+w z5`iqbuP_G;1uGAbPe^7xyWmZFmv`T4&*kuW%W z5Ux0Z`-S-QBR|v*@<2gfGsm~sCBr65#cp)C#OT=+&Qs=w9E!00#L%U+so7b`gMFnS z#mBh6MhQ6WgL2t>JE|kgLPZBNYY=Etebw{{Z=Q6_Fcv zls10VK9p|`EB-Z>(A(*DtW{RjNo99qh}?~Cut@9o(!)lz>SC8(ECJk6bUD> zdd_J{>-a=Y9$%S2iftRbb@;5`)1xIH6U_ zATpE!#7NIvQtTxemCGcBf- zvmn4ycuB0|WcRFym04gq4i$gQ%Xe;b;8srK`7Q~&C#p$c*g7M=L_&wqM&LTa zUSu5i2e=jvc;-iQ;l@0mb#<1fy7)foy^jxiIgaB33P#NtnEl!xJ$YrOor32N-2ct~hf3k# zPvEhko8NJ739i7Dq%*`A2Kt%@erY|s%`$%91HN|bdVcld@^`)Do<`wAD*vC)Lz}kU zt(1IzAG)u4FJ}9$Zq0gZ_f_61Hw5j`W#{d8Tge_aHGqq+))w--N5oB{5?I&SE8?}0B3 zXiwn#TVJe~)Xyg_%D9?cMfT`v;C;IY4yfUpumsITC4w=N{oz@fKELa=374C0jyt5*9~x+JbseT6WP}&dpsRXY4)_K^A!B{ z7K!0CJ_5CK$aj8rH~dvz7V~D^(otnObTes!xq+li0B;GE&F%F4J1nN!d$GsEn{#F| zzT*y84Y!#RXtF@W^&l?u=`mZySwkhy^A;zmCbbt}V+h`p_rO`e_qD}NFZNbW>M<5R z5cGr~^NGB%4~4(gPjXHRSnBa^rb;zOR;t3gPY4exyn3z)A5e1*_`>v3qH|_?@p1UJ zyvx$Z&#dn7rF)?|kfe6g_g}u+X#ZFn*Kkjz*A#G=ZF?fs)cuE|@J3Jo8U7M8`nK!& zi~aAv#dBU#pLw%~t5pGmBkw(Y8pQE+`iZzT)#+T1c4imaJ5k9^URmFhz5jCFEL$Yn z=&Db|V5jEpma_camwk3RJ5I@4$~?l#-~Zg(k#OEp&i@GJQ?cr*wtJb8oR&BnR<-j@ z`-CFc_w?~>mepx?!fbEVj+~{ErSCVnb#q^;)#HGQa|51>*dSn!)hsJd_Ks~{^FNvS z91`_Ev;KG^oQ@hVtk`-U*TgkH*|PZD#?gKV4b1HeceiiZ(+^C2?}cVGA|Kgxh~Co< z>U1QMweXJPmG4Zyett5gwGI8iD=7NoxUwYUq}`kGCNk1%?p1#HtMFcfa+f1f_4-m3 z%;fdrUe@I`rdljI*Xr9RL66}_{S63Cx$3FOp67Z`!y7#==kn*HRKymJFbgs5JvJ9) z%q^+HtI|r27RC2^ChXF`#5XFOz4vxVz0<0^R<@|A=99HRTdp`cOMY?*gH%6rS zgG=67+gM!ZmwF4*(}Df>pEu>!s^z;{i9;M)=aXGD6df&Ss-i2LqR6E zd?c;bBk_&4pqMmqly9L1A$%mamRb8g@cev2TE-ylDAATX7ixr={V})EsX8-w%zv~b zUZ}pEoiuy$md`%?=AingXQuE73;SP90Uo_|q=Wii17@EBg_PKf6}c5flMiJr7#Qz- z(k%VNqdlcfn`&rLZ-n}K+Vz~(;9>LxSiNQub&_43$d4cW^u(cz6vWBet8^s`w1ayBW3}qOBGe-1O%&jY=G+({Aw}XVtdx&!dV* z;8=;i`AJqN7?4df#S$P+xv}E^1>a5JbreyfM|%!sJP9Zr6n_blrs1N)k;dan0!fo_ zo#UaTRR!?AgSaU0N4dDrxWZ)G)2cVf3%OPMaYpZQ{lFDAytroeYMo1V>kN>=<tUfz4u& z&CU2?oHAnVZZ2E0uPLC<8EtH$;FSF>rq;DY&^ z;uPv~!2-VHCbDXqE$N%$&D(Pg;fz{vO@M4T;%x(DIJL?AYpJ!LbG_40{UaKmgV*Qv z`Vo2II?e&X>qoeSMWB!58>x6@I9#j&)g;;?{q^H~G1$@Di$s z8q)#}N#iXEMhUqb@J9u>S_lh=RK3`>ANkiZXgh&ySmW#PHVwEsZZ3;)wNMnQ;MfSp zX9OHRh<|}&BNu-R+VtV_0Ts5W&JbZ@E(5>EsVL*SQe8_VzY4n8_3yu# ziB27O{N2rcGj&GHtQ3Ce8GG}p!d=J6^FbPEiNPyB+-btJrozE{b43bpdf@aVWO%1e zep>@wMlg90`HrU^0x9WtbeUy)0WT*JFe=ENd{<5@Qgd)4BQrb0>^m*WO7v-*tAfKZ z%j>erz8~*MDQB08jm&-&CcT}^mp0}w-=Z!SbrNM7tfJly>hqUQK$c`OZat}}u+>bE z^f^l^r};Fb5NXeDCssGD7a2KFxwVw-nSzZmUU48W7} zW41K*Gu%VtgS4JP3k{xy6R=KQ57pEkv9=-<@|0R%+I$zJ$;`nSy0wpXAj3(x}jV4@1eg)VpM=Tm9ngl)UAr7=5t)PN_EXCXDKW1^wE*F z3*mYkyPY``ui`Gh7k;eFvjY2&Y_VCs$`cqutCJ?q$xajb`UhU2!KXv+l2PRazGqsi+hvcg8|v(3eEbCDSj@@JdptzApvVY4aiV(YE6z z-$}yI%8#@l^umk_NW7lUO4+!;$J>4vl(`sp}iq03-=J=ed*V+62N1`cw zHub~M+eWdX(S`%s3=bH-KdK1i25iD6w_(-ho+1u(U zJ`3V{!e52$@><&81jBbn@Y#m81*VWL#eAy29uur;7Hr)Ysv0NBWL0q9h3hY19k3UY^^WRDj!u`%Xg-$=}EarS)&d@SEZ?;dB9=>8qfqri!X!d$5 zIawWIlo^uqlIx77IA6>CwKS(vBVLM*aI_m&Wlng;-LmhHw>LxI35)oLkbE@=#gyG||+4qwJd*!DW0`l$lgg(c?%`eaI%Q5TUK`w{@H;E$s#^h`CNZ_M?va zvqics&NGGvf`J%R!H@!6-uJ$m_*F0=i?l_aKN)Q#hp3K_*Bc=cnxka2j)IPkxISO* zVG#*jQ~XX~A*Q>3&_PGQ9FtXgKfMEU+OJ=nQZDxtcZkf}eG%)H zY?=~bc-mv0ti8D!^X{venYa>}LuZ=qHPwGkm}kp*49RnYKq_M((1ZWQ33D`d#vI!S zR6ryy|Tk6H3t_kWQaJ0r8uJj{E+S_;23E=*5l&P-gFR&68A4 zZAOeWnPfqgV#mCnd+kPydGEH!Pv~4Jy#Ebc?6Z@Zso-YSdi|&4PsGPR$A5sUf5sLD zcYaasenhxluSI3b{&Co8Y7nM9{hp)!{mb%$1Z~v#rCx&{-Huhy<)ihhk4(INoV4|~$(YEW}4L=#Wns^ebK7Kcv8KW-M3I8|| zVewPVbTE)pjK`syAmPOjAx)??@yJ9h3p@EVbFp2lwnD&&(5Pp-HQnaR;sRm)UW)|r zu4oPY!s&g|`TTJ4N!@1pOp0hUbfCyTJjxA*seA%a)T7o@-MPJUx7`wW1OdNhmovKs ze)xnfyG$teWH@l+NTbFKUbGp{Hd?kGk$G;Ld|dI7i21VFE8j9Ip0JW=%1e|eI_B#e zx$wipSH{Dm{x}vMMDz~#6js>CS-YaExaujGrHX!hzNq`Aez$jR670YpS;r2V#gP>H z60a@sbZhqQSvJJ_Wa;s<>QTKHCfh5z7Wwo3Q$ZRpR%zgJ)dWwXmr{9Cb{ICz+NT6Z z@!FXgH*d||DvZ74Q3_@Wd&_P#SBV>KcLM4t_0+xh4fof>NEap3!RI_mJvWQ#%m*p- zf4_YG1RhO5x+`WblHrs{~Xy4j*pSdW8zSV%?C!;+v(F6UdedM`m4 z7t9f{O+22FHSS2ei9GrB>B#`Y)OJJJd@RE}Wh95hsG#a|r8|X&(Zat|E2{;iG(^Uk ziR^qMv(_}uOqIK(?x*2;H(m!NzZ94{1kS>V5WX*(xxW+dLRoG2M3IPIEbJ8O#^K8$ z`E5}JgdfdQPfo7ZXpNmt%T_9H7G|qX%T(Pqo>3>zY6Z`wfMhG*s1sa5kKKxC(_M14 zX^Qf}MU$z-z}`jJ6P4o*Dx7_!cECPw!d37`AF&tbhAw`@4d?4nk?C8$5gN8{o9x~; z1?;o_ax6PE=ecB;^c5Rj#9L+Jxx{->KfeDc;fe%&HK^`IFR^Hta#qtY{s(Vm_x^WZ zi>-5)vVeUF3)`|oPM%9S$t&T}YtX6_&!vR;hw**?`%=(XG-#d{-!gVv*zS0~u>!RX z^hmp_qluK#@*7^K&F!M&6xr}v0%pYH-9C#g^_fWB?Vr|+oA!fCdacSunq0Y z{(XuTTa?&;wjIulE5>?7zcsvYBpJiqq$InxIv)h;i9Hvk-IN{-2MbYMAf*o?Rv<-< zD1=>T(VJOQkz>CtI~tkD+rqGiN0MFgEUy|&fHBe zj=5!!W?F2+Rce#e|L$AuN9ng>sy+R*tjW(UQ>X6f^shKp4DM{FL_B`@z(t~>vOyuR zo4tH+XF!B*_Q3-ece8tQB7xoWkJIPP?+M6SJaGAAdT*|!V`T^UU%*N8WAl4+6*on8 z0-m@~-ILu=5`u29m+Ox$zb@u&FL%9>e=lPyt|FjZLTl^B>l^(E@(&ZnKd3@dd7rc2 zHTa?Zn9B5hRr2!~NFOWMzeWrC`hi7f6>Lq@BNoX^6IiC^MwVuaK$CsQ7kd)I8`zE+ z&N#KKEBel;8E;|GFqf~&!uEE)(3`{&1IfE!RL|@ZOOtg`afqD?vi-dyyLXP8&66#7 z^-%qEo$LxX;obI19bs}e8wz)h?hz;7eN(A71v8 zy;mP%1VdbV4|_EFU#qsTh&2=me~7ith>AYJc$&zT%Y1qMpz28fv zK2)0_i?QbEw0v#)WwZtKYa05L)ohAPYM!ii$62B_|E2#ETI30kkkbhf>d;o2+FQfUyXdPnBWbYTW$(-`@fNo zsXyK?%xqYwhujk~;*VHkZcK6o@cr8-_=UcAA=k?)-#*Thp5>T(M zWGi!3IPs1}sRoFsWYQws%;_C4`}qdAEdw{Nzx2V@{5(BRhkJhrZWYi?5Pki9`uo9M zPR*wM_7;s6qu!guQ;X{|;rRnToj&=P3scT=_c0&#Q%Pgcw3ePp!K6iA{!zDl zW0BW$na3^iUfSsAZgxjo8+A7)N7O3JwWumA*_E2#$$O~-D-+Br3$)B?VmYvT>Z6|@ zPHjz$Yy&HMu`8{BmABE)QIQeRA|eH!wL}tm%-Nc#Jja@t3YwL1^dF;gLvp)(KP6pufA6Y|)TQYuaS)}Q>P{j;b_RmHLOdxl59 z!^_+VO&4|ai@>kXPP-@?r#ZQIv&69-;-Cyf2DUx^APy|0rwy;V!ux4p| zwDQf!gYFZA>X2(9*iu&}@5em@A#o&Ea(0N$cJP2s_WD$?P)pQ+{cRVSq^_c{!5R!lEHQ{-rnp_!X!XxJFZMmjBs=3Q%S-s$Yom!B2 zzWm}%65r3h5h;BuqI`+)-?#FI@9^9^du)AFM|)7Spv!qjq4T3Pl#)U#gHwD| z>p|6_6{T;(M1j@vnDtRe)J&1M}SB*#-y9Bbw*|g&cI2B7F>xV=vRXo-HVv6XPyiXU$zgJ);$XFSaT}R z*^;9Z*=My~n3f-37o#cTNac zps=hRt6XX{s!40e*rR4%Z9+Fw69=?FcendVm_Jb4l}3LEs9>$qZ&Z_I7fLEMqc2OM zY~c_Y75vT9(wR^gvk*@`MdrD{$Z_CS5Z^1|YKosBqBansG$S~AuhGJgZu9*|rCm2Z zo6#msGU2qO7qv)*ti3aTO?p-_u! zsh6*zhfML-Y0w3wHjvTkE9@Qr< zJ%6&dBI#kp-2D5e0gq3`#Jy4PJf*fT1&ixr)~q;83>%b$UMj}FaSSM)`cU8h;}K7F z>IQ@PFn3w5mYs$J_~Rs)tWfIf1u}I7?js$Pf%Mnj{dIjjDL>6Md=|7qQtX^MEZdv=)K9&{dTi}lkkCSX!7v7?8QDG94T@0Cb z=R~%{BQisBnOu9AxZ2zmWDoSZqZpUk8GGEh8>u)Du$A7o6nE}BRCXjX&X^k+{q|Wl z0%xb4wL%PX*QjlUZaLiwEl%f>8p4Vv=F+luz2LjrzPzq77~l>fuB036o179>z?Z2^B8H zTOhdAco++c8m8jE%?{*L3pM>!Cl~H7LceF7|6tkBff^ikCqv+N*-eKbu zDLAY%8R?7bEJ$z=>X{Mvov}lDxkkgmcnYh4~Jjg80u&!Rh2-!&gF%)eI0k6ln6NDr#cYH6&EbA3Ys!k zg0$@e$+y1!ERyIn+Yk?Bz(vVxml)t1w<=i>q0Xk+f4>Kwmhbaj?}N|xCv0_i8uALd zz3|2L)2myFP|5<+e5gH9WXg-+E_h)%tqU`N$JI9~v`H7#8D9Pib^si&%Dl?2^}FBz z4kgstWbw*(1y>{=Mn+wJuu$Ke74RUX5{r5`paqAWr{koGgP+=Sf7*lLzpJa=$VM#_xJMghMp(vhYPDz>Sy4c z+%|>8+L5MMk4anNZ6_TC4}qWmA8qd#97@ow3&*x?+qRwT*!GT-9ox2T+qP}n*|D8` z+3z`Z>(;67{yeK{deE!q>0Z;*Gt;vm`7spQO=I~gGsNGYQ0Z;|UPBm6-`2~nx2r^d)0WI1{y?vKd(7Vl-}89t z^U4y=YWK_U*w(}qpzO7!IJn^pxKhtG_WR8V^T&8V>ZR$x%X_dyR4)1>aHobxVzQ(! zbzPuSa=EYtIYv*|>H!SVE}n_v$}c5<2@FfcRX^-jpk?0AB&&N*F9cXx$|L|!UDwZF z>_4wAwjd>cLOcxE&sgW7A5V3jSD_Q79)NW9XNG^?-l-6E7upBNQw6 zf*(`7T@00@$F_TPqW5&XmHD6xM0V{YU3Ue}Ea-1*w-}%}jKAXkCf@t|@>5fjFE=dK zXHM9CF+Wd>yc`02R0v+u-b9N$c{a89-i()3kv`?a)v4*6rGVVN<|eBb&nl|gY7_M| z8nC2&%m??S&!@&NBa7m@h7-_>(>ypQn#=lTVAr;BlHmB;S&H=&y)0sTqWriseD>{b z*&Vd%Cn|xvfp>N4k}u#i#9tR(FHx>u@LgoFwB)FORQI_jnBvoslcObgl9!*N`T5q- z^m~MdpFdteKzjt~Co(E-xMjSD*1l4$k>#th0q(h$!gs^1ry8Fo&VEzTb8iy}U7!oQpjr-{ybO5SZ;2IY{BNxcE zokJ%*DyOs;mV+i(B^W%?vqdVj2e4xv6FTpYrVgheTt&}xA*LEv-Rrzu^3iBUZp z(fO{S^&W%h@59-JI47#a%IQvrB6!}2a>Ncs2p8wz%5>aF6&s|K1~j&M|2_~@c>TPU zFZ-?n$xmtiNZ#F-btmBAjU`gq%P(#`)dC-{Ovc=@kjR8ayjKrtkOR;R(Fg4p*M5!ZB zZ9+#iOILB9jevATZZlaiLo790E|cHjnw3KD>>KGx(P4W4+ny;W$d7H1=FjRDN5~e4 z6I<=~sw`^=@7Pf-usoax+O`3_F{c&j!HvA$O7FlcxurqM8JGH`Hgrca4f>bg^*Ql= zg3yP}2cwVcF1bru@Js{#M<_(aK5f15L)i5K_crzW&pafvDK{dGal~C~6u8k4+Pv6uIK?7LkhsP_S&6hcl?fImi%Vy_bhWf?^_D)(x=5&dCH0r_D*wXFe=lT1A_^{%wj_|wqzOd3zop$#uI{vuvK8|we ziBgdAmyBg&%@``5r`<|Z7x9@fm6pWg6{f67#2NCLvNr=COPWMJ@DF}AKlAWlu=!*YcmrAbf~k0H4(;?95k>;S5+1ZO|M5h{;~1Y3FB2% z8%L(N$Lhg@$+(0xCq`W-+@6!(rQ3sr+qs9d2Xiiu_sACjkG8N+_nqHen2>6F`u3A&oxDEG%G0*TNEqfZBT`=DZ zXQAXHCB;Q{u>=~qqlR0X(JpYOD%H+*{v`gha-Iw$U0Q|~GP&%@5;?N){)V&8(c)aL z6=ZA_K5HVLbjPFnt49F2douC5)LvOzezj z=^i`@iZ@~Y8_k<=6}5@MJzgD?P4Y}?)r-Bl*vfHu;C&)7O7?it!d1%=4iqXfCrX_( zZIh*^gYyrb4m4h5qONH07jx^#lweQG$#Jns6OT!)e~_024f9J z3YJ7JWG2?pS{0}njzn3M?S@Rqt)DJ6SM*5Rcidu&>Pi?*G|UZD^og?mQFed<<~vMS8JCd|Gr%)TlNK8=3v zS@)Cp=v01_4`_*OSGmQpc8 zk4-|g&=!q15~VHMZOD}}SxXedj)hx%7E&q2`~^0@E`Cgk4fgU@OV$!_)+TfFqS$C6GlmpB99*j($rF=TlG5 z!@kVJzQ_YsRp@!S7(vlouEjT-h4TO8kZv7(iBs4jH9ZycI0f@K_2qr|PeVNG%9Sb^ z7nY-+RMfoqScT=+ghwv(Fg;EKd0BqLPpt`)U*?rm<-U1xDHg-LU!$o6f6!Rf)@AhY zwvFMn&*8QA;c@B1Z`r_SspcJ~knVNuU*tSzRfUu~JeWZ=VScFkfb~p$zbdFG;aG(K zo^cy}*)`~XNwtV*h`3rcJ*D(GZRKS#g3qcAF}=*=^f)c#eP~2gzFu8Pq#XG2Xr&VN zwx(LGo64zQGlt(Xhu_kN$E^*qX$s*J3Yynzo#Q$seyq*#vAvqR!vlZ;cs{*-Hxe>@ z90`7UU|jI-d5X8{sz}c(xyUc>lO3OT;WOL&@HP*v!v(AE3bC})*m&k5(+ z3M@UON*5JorvhH50A8nFy!Iiea*uV_7StXR0oONsRi@!;b5EDDZPck*rKeeY5A$I> zE(7?fbz#S+SxJvm3+mEsf#{@v_3oq+?lxv!MUA=+UF^um{6BKSZ4B8aGvmf6{OkWY z^b*b4)sy=FtX$8g!oSKvmQTVh>N(H;@YB)%`zFd876JS#;w?_UUhvvk{MVWeYa5 z@^AKIv+wz*|EIWYsJx69T%VL|*^7a5qyXMY9(JkTug3^GO9F4QvHCqUA+FB|JI#J} zF#A1JA+F()o~k3c|uBxt!60K7C0yyuGpD z_S5(J^OPN2xRNk~^tVrX@hrDk!#?^%5Sea#mhrQvucSx?{|v;PWnl(Y;y(14DVjzH%dHu!?fd-#0yd$?2V*8*p*Og10j_gw?kEa-fF3~TQi>M7s28@X?<2D2{(c#Llm zjyy^wXXVTjT6jU)!|irN65MwC?^0X&=G1XB2`>JXQwx^RF0<%of_S>;ti)mlZ)4`36c{g4p{vp$$7?DWP2U#+6@ zG4a9Ma=w;;yEnf~?B`llEtwKeuuK-v4RsqeS=muWLnjs;nH)(YpTDT03n+MZyGZi;NGW@;c}P ztML^?qBWbf+=OcPt zkIp6Qa9nRnXUu=Y6xzmwJWrFcV0yq8@5m*=MHDj>8)0j5y^=cw1*%?WXNtIWhAm7|=dLBT@+mYWW8O9saTEZ1dO zL*c%Q%XeVJ4-eo(&p?19&nd*Y$p!XSc+kO0wd_=?)j%g_)_o#h;C{f%Om$^WzaUbY zan1>Bz+*K?ckN@(E%w6U&$gf<#p={poi3H_WWfJ1&ClYPEqgrtTNO^l(;E zCL;@|9{6|uvxZ#?)?#^5DdK6MGsL^*UDV3{f9&&#jKDIQ=_Z{b0ks3mE}(at&f|6w;Xu>239-)I0lUz!F88u1Xn8zkT9`>Ndn=6Mj3%)Z zX7bd;qtA=#vz#P4MqjdCS}MHlqLOE0q_Xn}KO=fn%a;KaKO=S**@+EQ^sbWrW-#j5 z+U7{JoAqZ;M`mgRN7ueq8>PWPx!dFlMEMifP|n_z5GwGEYa4HGv~`{;?=~Do0V&RZ zux)WmoE^ufWF$`ihy+d9jUQRS6o(|H63Ako>WoiMO$yNSZ|g<$Z?Jc?d{ z{Dk=NR@A9iH1h^$bCI%v_Ywa5={1f{d4E(5DJzboYA=qrkBWTE-1_cDutcS^SfclW z-qukfX}2+q1o{3y6oo9lbikTn006e>004CUcl+3Xnb-aU`bYmj|524Dq!Wq?T9sT$ zf>W{_*L!zJpnwpPkuLxtHe?uq9|#H2;FX*p7S~oDIw1s1WGGNrM>MpUnZk(1K9XIq zENlQ4m?%6Vk(~feFQ+)@@Bz-SFZ8`n)whZo>wej>a?y6rbJzQqYR_Nv^xya`N}DtI zxCyhr20v++a}z@HnOu~VEqP{yf_l6zACt((>n+JMDtGu?N2JF(n!g_G>P}`NV!R!8 zKlBf#zg864qP?~hpF{-bBsQyA&nl{IAwT!F9{fF`55JDb#%r9FdAi@fzH$b1HysXr ziee@?zxv0&R>w!<*uR$)blyJt*$d`@F|&Zxx8OeuC}=aX@N){Idmwtzz265g!6%_S zpB|UX3Vug#zdww*32eU1<=->^e4;fW$Muj5uTI>$elK4VLglPj3Hwyk~@c0VYIJ$ zdVaMJ*LmazZ-{5(ztE`#_M2YjddytsFp)an3^l>S`ee}w1_+{zg^&8^*x9YW)@&Gg9I+-svC)0sJtK`0k4PSYt<2JJn4%Fv%%BN*{xqv| z+bA=#miOj8nH?cAhQY+rS^e|;w)TC&bzxF>*@i0$M zuGfk6*b8?dE$YR=YcU^JpB~w3?bdePp;|cc=8wBp5%JJ>~@R1IJ!(iH< zKNx_Is&##d!My5n1iynb5LBmU<>9&DZzKv%t;x>r=`rHTyz%~#Dq^wQkc?0N!?z@>O23c;m#D@wsNe*`8pz4mK*fnA_rTd{lBn8@fIaH!*@NAdN7rht z)vWO2VkseHrx$9jlvhd;G$40Z&wT-^ZpLZ&tL47qsorNbBmvILjbBxuVeFeyv5$g^ z=g$I^LlsKI!TzYdZdGA{jhJ8oVn|daQv1?bvQZF-ZP8IV6={CxNUczO%RHk>QvBRa zO)nIst`s0@IaN`9Xh)q8R@tC-5wn_L{+*3V67%e2b%Gk(&3I%IWg@ehHk;p{a?^lL zVDO^`MyYi|I|Y>^D->@0^F!CiKMLLDQbr1ce3icF99{U_oCZ4gBA0wBSHMPbiX^j< zDVE33>2DG$EF*am8GfcecBe{$lMyK| zx?7W2!4WPiA3yb)>#YPy=vu}R&MB8VI$h(2pq9B+go0O8f$Rbc=C12!u_Y}jmqMl3 zx2R;;(mHD_mr6SI3TnGo*|IAZp;1t2!xHTzsQHjKl^O(9X($t9HVpG*n@=;;&M$YM z4R@6o*`6lxvgRo)SHyM4o*KC}7Naj3^;B7IbVn%*QAXIICiYNvtH}%_(jh|~d>$X2 zD6hn&Fjvk_w#ECh7aq92GiRW=#`Gm%zL`vMPe0-XMr_1&HI?FRnefOrz+?sDfiBD@ zzRPwG50Ab%!^9=L4qNAFpEH9NWgqtlCNNK!K?~m|;jbq`c!*BMSIiB9$vok{OV5MA zdeoWu<9-c{0Atn2{U>u?`Yi`lWV&_q97e-D&@pC|kY3m#!We)q#W%@ezgh={bNk?N+@Lzkm)fK*%A)5w>)ZIR_Zfb6FDESI69RKO zvg(sC$1d#Tt(b*J7{yjS#&<{93Db<_oUVwo*JHA8Q>hD2!xzdV#}*OZwuTX#ow2Jg zNbG=q)x6p>ax36^>;QMz?}c}_PYNln&^0fiBlnPoG|NF$`PH#QXH-@!95r_(<7dpI z12M(zp6Dt@E%G8gBo6B|7~xrVH2I6F~V0vI=%UxWbQKUY}%PxKPVG9sq*EQCZ2_^k8%Y2d zl$PrWAWWcMZ{^TEKN-{0h&;m}g-ItwKUX9PB3}_C2|{0EB#8yfzz`bK%7?oEW|cTo zeT&Hv;Lf%Z0p|F*dI?RqI9WExLrY2`0p_7g6H3H8N}B`8uvroN4iTw9pzw|PTUmvk&DAT8d)@1B{B1f>^ zzW}Q6m1+Ix_O#DXXFwR3YiW8d!O>tVi+X>4lECR}_%-3EQwzv%_%2a? zq(EA&^_|+=3ATPa3W`=fsMAtw+axULC@8BdkIszdf`ya}Sy-Mpt`KGT2%EG2S%+%R zT$Zcu9Ytx~ykx6r%T0xd*VIy3)puEt>ljmA6>@Q2ld);9oi=J|t%B=_FcOWcBqO)J zhbR|(Wd03RAxpOn*XJzTuwl_e4=l=-Fd^C@QF9D8Ld9ob)#Bs=3Bs#bDFi3?W9Qe@ zIMFb9ct`*YIkiu&$E3j(!=`n4N!Ac$bJg4-`=KR7a;T0Y=dCU>(F7d=+K(nN={(o$ zz};mzO~rjlBi=O|+&*-rDRmDCmRpZSjn5T-$sRnbYEn0=r^qY|w>%B9LdldJOiMmCcy=m@pGhy_3VR;DH_N{cQ{ zHVkOGB{Y#xO#k;auvxl%xOg4M6$)iyuYd@;B%~yfASEwRaHltmus*j^coFh+twTIw zMwipDRE;~LNi1FrA$}Ip&wlZkO4Fp|LRRAzEhLVVp%5tsymO<(OCJ$YaqzfhX5$zw z={YEXo!P1mUI|VL=t~F1gpMpXttvV#=78Hrfi6Vfo-HXukMl8mk`9GddP#Kg@uaLr?b{XoYr5X!ta8My7nLbR_SUCPPO57izf<4K=6$1Mk=pKV z#|cqJ9OCL@W&pEf-fp3rjLpT}nK?*;Z?lcW;IW=(<-)We0R6C)8~&ti9XfM#nAj)) zf!!UL+!9aov`drmLk0*lsoRdgcJu>SXj^p0cNnsxP`SNa1d7Z_=Rp${a^$!?DSlv3 z7>x8PwuX|_=f;?juxwb5J!&R}GM$wN65#I%A<$hi=0ku*2#3a~zge|7HWzFeA)`^& zaN;ubROna{@b>Fu%iUUV#db`6{0|@V^96d|@&}J9R!2&T1|}oaJk;txwQ7ApqwQ;x zKc&rIR`oavzr1cu0`){+wn85w?i&5Rg%q)d0wKr(8U4mA4=obJOkwCW-P*?l**5Y8 zuE7L&0BPXzMTskLk-3PfccnC}c`iYOnB_ZsYtu@$q9aq~hS9QZ1_CePCW>pd&Zdxl z!&iXyx)?P1)ncQ!K_kfDIl+@%L`i|ILwee)s`NhnBD)?5Wq1LFG4B~ktJ@o_Dco>R1i`o6v!_P^*+j|-(Z&;2t-_fd)ZuwrHB^ko>89< zEQswcqQupGGj7?hi1!lWZz9$iAd?{Jj$xgqf>5 z8pKZlxE6Urqx2GV1_QKnM0;bW+vq&4_($!4MMn;w`)PiytW7q^r%vJ3Xvq596Tw-N z>}~+K_Q3_}=zwNJaGgIOm$4nPG_P1TwkwQ#UmZSn>%1u1O`*0pe%(1(@U6!(Bhg$lOQ$-=< zH+ix5i=)N9#r|dKiQ%3K@qGa_bqoF3Xk7s5AK?%QnuT|JqeS4_KZEzX0hIR%EYKW% z2`u673!L$_gC(MXp^FF)Miew47vs*h*#cQ;6XOH@J#3F5#)!gusSrE}V1-R_p%kCO zr8dyF3g=2&kJcQgUxbUYmcA-Bl&gTOMU)yJ;!nv*Mt!!817F;`r*9?h-{wH1ZXq6^ zai-3o#)m31cF>pT**>3?(1*f-7BN;vJp-cTK$RN5kW`%sS=_s( zZ*}6|cIR0;PY2R4Z^fWC4XSjvrZ2^(b~gU152Xz={N%}?ru$R;NMF^RFqOInMCs0w zffSue$Bi}>XeFR-3*vYjJs{~xk%77kXENzuz9|E#UX|0)Zvjh~7LiC2PV@-BRvW?U zGPG*r-1=mK6>VrWCw*ifN)|F-=7`q;x*&q8zW!8Kjy1I*4OBI&_eZjUD6x;eInQ}8-A&AgIrj(V)G zs3gq6OP+5QHQFqH3r6f)qp~TetoAMFX5(EzbfB85SR9>Q)|xqWq>q$#i=r))dI_Tm_jRTiW1y#Da`EKql(cd)o6|=umy}`=M;~HriiOcj)eN%D-RMj zdlf2i)OiW&vXr$&`cpyW*D4g^(tmik6gYABtMrqaV@WoENRc%1fGwz`*br5UXlLsm zRagDT*A%;GSqjErn}5z9VF^m$au6>oVn7|JLj8~7ROCpYJEU0%I=#|>T7l@7)+xz6 z9`euW3IFT#?FyVaOB+JO>7Ir^+1$$1PKal4$iGyG{FAF%gxIM{I^4C)#S$#6K&6aJ zEQ4%Vl3jkU15uVsiTnp%YKp#GbdU)XF;QX>t(l15I!Sj*6;*|l$b8MfV*GNirNDt; z2iNAXMx=wJo7}BjW(s@myib@1_u%YTww&0UCb3c($ZLU3H_Yo;t=x=rCAkL&An)@H z{xZ5Q*PeKI*T;yiSd+2`rb?B!$Lt$hf}NVCM=Z7=JXSYB&lJR<$W8)Vu~p;6`@F*} zScGm(j_7uxsui31gVuccG+2aphc}p8$p`BUM`b}P)8RpC^9^vP1q$jq zE~F}K{T!hj&t5gDT1MS?iTKekHL8~+^RAoRvs^l)% zcYHx%%V!$0?nU{_D zsxlu4DY|%LuR5%6gwg9wrDmx705$*{KLy<5c-<=ofrC~C1Ae<%pcxa5kmKpH-wM-* zhiv=a&PMF#tuWxZ|KfST8WzT{2S0p=;8%FrQto*O>(|-Fd^a16<<(~~elBn^&F274Y7ZsMNPGNhB8t7Ia-AbinLouHewjYiJHb-~mT*9l)A*`*R2;ln`vG zLCPEk;mnW9do|<&@D*ea9I7VTWa~hkab@M;h zkH>oTnvdcMF^3sYUQi|li!40~vr#e|28Vnwx`*l=oNY{k_#mNaAh&^A;_Um`f}Edt zf66YOl!d=Jj`@u541ZuIKFh7f;NLNOUh`PxhZDTYn~xhkzB$q#YW5qzp1|Q>E6uY4 z9&(eHOw5A=+4RKfmBN6mc=!lbmPTWM_5-r$hV8>B|0MksD>B`5cL3;^cp zv=FhFN~$I`5u3b;&2b&%i;L&hK9D+saLAgCIYr+4nhSr+cnnMR5xLbi$#F$^)O2wB z^4b?%lt1f~mn44|F`O4pDS`*t^d|HP`itx%`49$KAb=t2DDms(F0m&uMrDN?cj1tmFBzL%czORP+dJm$R?Q%eHSXM-o=I`9 z1SH+;{Lv2Ug@V)S{P0iShh1rSr{3EHw%{vsWw0wa@`dkuY?h229#Uo|2sl|^o;d&U z*@6d_u-6R-YLLuS|rEUC_m#GHG$Wz(AW0FisF2Y-;XP! z$se}F2Y7+E*`SYtloDsA%bK5gsft0{TRAc$>%iNcF_vK6ov1KA`-7*&+8Re6@rzUp z@fzQuF?BHl)z#~B^0%B&L5rWU$nmrB3*8WU3@r3Z?Y~wnZE(2vf%fPq6+rCt3692Wg#3jmc*4GGH>uKXjf)?)xpX z?GxPS&`$OD3I-zNcrow&oamc-V_F8@5@lVW&Q7Rlg2(R_NNK8hwtJy%S$T zy@Tj)CpzmRskEa=mDEW2DpDot<XpV-)g}p~F|=qgI}?ej7bJLkR5e;bFUB7Z^$MD1iTO!WMDvRE z=4+G8X^pbZ^gQl$>dU=m<3avO(p4MmXqE4zf;pN~DUPHW?#ogpstFp-2XdTx^N@y4 zStQQF#N$oi6{5$^bQr3XNln5V;SR9|&r0 z8Nj869ly0NS&!|%=G`F2E;0ByvGkgy%23B@F^;ef7R!`;C5y8P8@17l`$`rI}kQ6_u?Q~fIR5ak1CZJT6kk=len)B&4hoC~sqb}dH?boO{ z_!_BAw_2deWabn-f0IY}4pOEcCzdtwLTQk1zz6MHhpUq|VqzW79?eYX<``zsQlD}JmdzW0_OH(`w zEO_yv_6k%Qag$ z8vGI#s>#h@s|TM($K6UhcS^yrf?+z#=y=-7`4G#=VgSc$375qXg2x!b=iFz6&hvjK z`17EDHzKi_;JvJh`tS26h4Jr7Z#qftXT^!Ac<3j19svEJW~hI%H?#X4m5%e^OO#x7 zliW@VHc_%yjPc%fnS;!J9TUbt8qI3`SOJZ@)muT%BeWaC$)*V}94k!Vv|GV-S;Oft zhL}d??zg@Du@|dtL13VrhD^?O>0iRzRav`09B)$>jj^59mRCK8ln6Q+3u5xm4kpRAKy%UHB`1E$<1jaeD^Ko-=qIrjX*vJPXHC6F42VkZrb* z>QrH7F@+}nP6gtadwJbsLipchFf!jYuQ6%DBa?Xt$Fsu6vw@rsrJPRvIPQZuZ;6~v zvcdDxecJ$Jd+5?$ zPn0icoujf&p}D2K{L$cP)5#FrNz8i)RyFayPgaZ5I-cm0bUcmcWHEu0%@C$_Jgw(^ zXy$Yp!bxZJFYj`lRq@=RrL~N?fX8JHiOvv)PZLHyo-H_@g>*bcBsM2G^nylJ6klqY zTL{0O;l^4APJ5!89J@+nE@KZbGR|Y+O2&{D@T09o1me1Oa$xm<2!$jcxn|KZ?)a4( zl1{5zr+C7w$_DEdD(-jvm0nE_osw{qb1c?1v5K=%>#!{4_n=yr0Xo|ZmwT{gOi5{= zg|=)~@8E4&#*sBv6cL+avgUS5Y{dMU37q5g#?k00=XdeyFumt{^0l_Vh~;T8&!WZS z;sg8jdv~fqG~*B7eej<$m~`h!v>DBy$t{_yCmA*kI{&bAvk2((W>6kM==0ynYQYZY zVuX;SY#Zz()@+VCCR(=5D&wY#Y4e`N>USi%Xh_&}+G$-->~v((WvKF$*iE%?rY%WS zH72xz=C#xb;M`oA+O$hXoVfUL%U{bDDk$;!3I?i;*Z%I&Z}F04HOxyLe0jT1YT1oCRVs1(qfOMtPO z8^J*vmDuViI7Hv-RM@3t>0NL7AM|;0rx7-b!$@W%Zu^gFqu0U?xm{MZQ?#qlR z6J~~(+m3i95wJ2Z6&0!#N0AX095`$ZNYSOwtV}JOwErTmUr1z5BvlIi%=u0ZWL$|g z%R<9kQ@H&h^?|qHTAAJKmrM;C^GAEBZVbe=q!f24)jQ8zAdtrVwddT(3SI7GO>2EG zOsI=3fi|P1`|fPmr7Te_<*4w^klJiQmX@J89)V|?(C7lX9?|Im_M&7*_+g&n7JVHC z*rI$D;K!L~1={gxI+0(qWgHT^HEgZ64XW5;vj8oDRjai?@;fb|bmhvlWpg0A%Od;JN6u*H;J6mr6K3kG{}=;15*vTvRA^hP#Bq&{DCV z@|;bb=mzfYrmBp&10#WWdvu#iVRZ}W5j*FtK@8}VD_B*#f$7~QE&?wzC8)d-RgQF6 zTwPP5+5jOPru<{h`gD3*2q8&IQEq595|{;`a0uijN>?0NdC5aK^D1rEynUJ(ps z)it?L-A#wV3bZM);W!9fh3rtschz*-pdjt3V#%v)FXq75DZN+ zYDHR;*L&MVg$N(Y8x9RD2exmsjRV9-gg74Z0+dqgYDuh#IhSRJXZkL0hM@r3jDhV` zd!gU7B)x$HsDyxzEw!H0ptZz#TA?j;-xodEG(=eLFivZC9lTSZTm2VC8h|gg1yZ*s z`x02LFxw0!&lAbF60o1}m$XaO)_wk#0F-guhby>8`WaMtWvH)y31;&2Ow{UR;47ep z&X&R=&)pFWIG6<7!el3s#*k7kTBILh_;^YYbQ4ov+L?t{(Kt)SlQXn-kMWmmM|f-7 z*z;T2Jn1#qUP5NdM^_|E1UT59A;H1N=uuAAjhA z0HM@>?1MsKa~lbXV<}AZ^}T@xrS;2w{kbzPs*@%?tGfRB+jVJ7oOg%BET^7PWg1&6 zw|9N?73RR48)LJskY~uwv9^+R7fI!P_>j+Be?qmJm@S=`aCK^1vAc<%ulsaDbIo`& zr|tUu@!r#91kd}8jqlEtHW{@_QP~UEe1d@-3t#|d$^hzs3rsB%h#I=44^!(Q%{bm+t$LCa;{L(aS7xWh_XUV9*teO)zXMR z+2K|oINb?A1X}O6VP-A=DdO|c`TofbUggY>wk#k(o_y{92<0$>mpvd^bX^n90A@(%N7Ao&extxQ%&RpaYr1%Ay;9bhDszG6ib9fS*s+k!4lD>=xF8OlS+@SQA| zbW940VA-Np@5aSF=HRp?OiS=%FP(=sC<%pq!RN!|T57P6OQH=P{=g72Kd{X2a|$ENj4=jLr)<=OFG3m#XQCApL~{`oDAUH zWbQ#3KLlVB4o6Z_%=4U19Nfg&^3R{tF7+i)&ut|kC1;jgK^PO@L>K3s>5N~@?;OPG zie23F&m4?b=53kpJdB_G=rk;)GB8#F6fNT{va4v_;>~=_43G|Ix}P_w280AHB0KKY z2Hp=*Mk_RAohEH+W#O%Zpc)FHIXVD?Ml+tvT`ZjJOdKrCT-+V+j30z5#UfN@9eWk6 z6-vNe8v39bD&tfQYkMtnBUKG$Kmma!PeDU1Iwn;kk`!1pLqks~Mk9oj_6xdKocNr$ zCqTOGr5L4_lMZ?ng{UOrFXLz`rD-a~kfg^K0V_tN8V57xGV9l-1qoBC^}CH88!H1P zRlvlfajruvNlrxT1=21m9A)P(VgWxkiQYY2>>SLW^!y*uz4{n~c8H(>0GQbRx55DZ z_h|H=AB6u<{?R|ge^jM;=CCn}NG2hLMj6&#Inge#UVj*nc=)?X)5E1~pcskLnT9i? zTzMQct~Q9N20-7cOJ$qX=Z<nR0m_AJ}{2YRMQM_k|;!G1`0MT1o!w!FQwb!_L@wW2^LggJy1= zs5FZ_an)-&rX=$~)9o9gIzQA(q%jM$WlQHD;{NYaqG%kNv55255_@U$Xvy@1Yyxsf zs8v-!E7`Df76^xZt_0CFGvJlY>p*zGZx?Kv9y3F$7_Et1bj_mcuLT7YhFLdm65Mh_0N4`Oi zAMd+NNEd>d8`*i7h-;PQe`5%Q5O`2lMq25|F~*?KE?jkw3mczvaqCa(T>C4~7M=UF zT1UBX`#r$eXZDUkhfgtwPeD1{=&Jes_4Tyj0UGfKA4?*YZvh%pFhix2yT=7a>mSS_ z`*c<5nw~xNqbxNW$z^c*pb$_7AJvh$fp&nH`q<);;7dC_e)NiX8m;uR=R$8Xv`dO$l}O=X92;7IB(WYVf`_Fo=4d7iD{yo9$4T1+ z{2v_|-_uu_?z-`5i%2!t6NJtc|Nd!M#lH@Ptjj zkLJpXjj`2;>Cn4z>EwH3&^=00kB3e?c&!W^sMM~M9JiNJY8_Zv0wIhlS|la1zC&>h zBRGc4?ziNSF+5>=_6T|4#-9*{Wfe1Lx`Uw3)g{iQBk^}f;%!Sn630ZDrvPNNaFi&e zytG7TFY)MWyRtx4V8Geqh(*ty6HVzO`S`4zfa~HS5!@6pfHOk>=vqwg_dw9FA zQ;d)(8<8-jPS#q!&d})*t$`AqB0CI=D3fvfLe^u25jsh6LezQf!0{1j+4Vwc9UvAr zDVHYw)tM`8V_iEkZjdvA%jCh6;ZH@=mVmE1y-n+I+b0UD z&~>m(y42%uDE8j7Y)f8Y|^#@|Q~d99UjKauKt0tbHEI1?E^%WyuRFEKu&{912(@0E@M3>@sg^j~DRvnu*?)ru--|;CY$wRE1)>F7D{v5jC z=4||Ah(BtoJ)oI*8ID%|RJ4*Ub|-33#t!&e4vI`dqa>B!M`~Ts7w2JVxzXh{)Rsd3 zeas7Sjh@WZUvzL?xdYWC%h11Z>Px0}(Zwj{Iy~{~`KKXtV<0X|GPQxJ`W67lG=ya6 z$2pOZiszJM>O$JGPb)c)$q3v^bNJ(2V<0Pw?+BOFwAqoOCNBC!F8nV6P014Y!%9x< zxMX=siCdeok*>&}LHf+~z|#q@G6x?`U-Elii=P2@1rHG{Hsq4oLgUr@l#yO774=HJ zxAsx_q4b8=p&J|0l$VJNbimF{w10#Ady&rvT<^HwW9u`p@7y+pyjoGqCV0~137=fn zzgn#e-r)PA=67DE`3f)My;=*d2CRWXq6pvZuWfB(?r8wJA=GCZrE*;5&YX7@?4MhIeq4DH++T(-7=*8$!{&f zs%NVWs}n8KNF0E6lmk(qk$uZ zEmJkNL1xijeCc!n9O;z+9;@1)CKOAd3e$-y^x0?I-}Fk$k_yhtN@5*(_w|3px@??v zYW9h=dT>SS>m$^;GlT16RBXr^_gQW5v4M<&KnDX?vlIP*&*=6~)9<#H-;?%D!L~D6 zI%$uB6kcpK^GCk-J(ztAHp1yV5ym_9DERJ-V^}RR&;^r@a-(PCZn=b%fj3ZtdT_tJ zIACcudbX6z`5;SLPywSx0rz&iL46DkCUV58_$PW(6e#{b+TJn9k|*pQY-8HCZQHgz z-P1j7+q!Mrw#{kVwr$()?ce+UVgKg0}yM0RFq>^7qajE|oZ zP>LmgBh!DgB^^j`==@7RaHZv!;F7)LiR?gsIM@+blh_l0-xrV~d+WDRdjApa#pX-nzdqw8g z6?>Cel@u4@v-Am0sr7lNe8U(vHY%8ys`~Xo%yW)JVRjfiYjNe~AMOe{-NR+7sd%U| zRT@3XJz=`S1+0K`Lko3wS8S=PnIpu~(W&NGzIk;B_fpE0ZNcg8evi=)QL#vKJY&Iu zi@E&sCb{INbIm0*P=RBAm7a))?bb5=U;lSlzHG1awO!Sd7`aaqoZQqZu3@~Ji`G^< zZF)10XCd5zi2)waBj#P}>Z1`1W zmD^FHE0X4$EZ3|Hw73EconTv7FLW8!@j6$_aH<#0&(+^mj!jp#-~==0b$bHZ&)3vp zz-%of&}v9>k5*;waRvnFkx+VK$VQp=a!@myI%)j?k3V%983-ViHr#tMz|><-H4Ti_eE z!hacfCq%_)NoBE>;_fdJ>_n(V%kh%g)7t(uV{2|Q5$XSXhiTViWB1%IjDV8W#9-jX z=l_{NnIhg`R9h7Y$k7KFsPzArou&V`8!8yLxFfsrAj$&Z^d*N;uM5$BKV zIwPz8j|;mI*N-DF2NN@k0V~^2(PuYe=U`zs;^O#OWBlWU{j*JF^*?s1|Hb@Y`7i$e z$|c{AgW=+9N7|?fODj9WvQa-%pj{Bn>IN`brZAa`w=b zdUrGMw<(PgJ_MYyNKNjUlb3}ZZ$asAL9}p@n3U*2l(n*uw-o`kZv;>)C0NisCuSzT zG)i%Vdz|5Go^Tt?A}TL8J2E9Im1_iXP{%ERx)dJ~gDMmO8az-$)Q@<|P6$^K5rc;i z9>^e@kX{{e8F-JIDTjEf_rDsRiv23XhP7}mN z93ck_rU4806+}XOLA@RJ8>fdQs5-ThcWZLtBiqQ;DWTNGDj^CE>9frO)gJh;zkr>2 zf}(?!{#OzATQHItY`_e(ON2PVon%OL2dxkj7=!B|AC;c56%!hx^}qmC=O8ZPC*hfp z-EnRz(kt4Ysc^y2NglJfex+}o6ei5rb(nB=Y|LvgApznT6De*4FSABUE_vwu&jvf2 zgJ5WE8=`ko@>>wxtN7QTA|_|W!7;SjOYI76l|3T%czLhzKk&)ecBPe2Q`kY3Kf?h8u%h|R zi^(7%mqJdXTTQ!#M7Y(lqElrL!5TeWtbpVQM+^vjAwMB7kuZHjyhYSTdVJmawcw;x zFMKpAj1Mk66*D=HZ7O7l2iWK*aRF?eSdEzd5r%E{h zO;lG4`6v2iHupn3%Nfs#9jzH>O?volx3tIfuU6}Ppn-lZyo@d?&J|o<5fPdgckalk zNED|8-6)CVcq)mh2(|G|?g;KlRPbKjY;QVS2z0&}VVyapfM#k)kfvX`No8yiTVHNn zT5jzw{V$o`07HFkXM5ub`+Mh)#MBq8-Ja>V=nugZOmj%tB63+0x>R`U^ga$K7(2O2 z>0@tod>9WU8_r=x(MoWqWZ*0%a_$1UOH+2aW1Jwvn?%h3aS0&qrvPZ-s)^(^Z9gK=uDKf1yXdkiHj#flUDZx|HTvd~N)*pAf;W z;N!8nsPsq=i(~8NA1T0^ARC*}FHF9ztU7y~f@J2tB_Ekc+Mo}H@Q?C|@;epzNOVew zTr}RJWie%819nWf;YPQ?;cY!t%xMij@0w|FLfC+jb_c8!4H>2U*86Z_uR73xD%sPt z3Jd-!oFedVcEau`qGFf0PnO5=bk?fHArYej3vvSP=RgcTmxWz^H*k|u;n}9H9HJPO zpTpE$ac5=pO846xTFJxiFIkm^z67P8I+8luDeOJoF^ZC#&PpEGA)TC?Eecy5g_EDF z>~vX6wGyfM#0I%n7^*u#_93d;vF>q}{$vTHVl=BmAbFny6oRNxTT+iO7y2uNs)nQ& zmg6awWrCj44hwRR^Tnc8TeW4fvc+x@`OC9G{}#ygA4*TYxkU7xT^UW!9d@EWXb5tQ z6`C`zEAv899XWO!rRyfb#E1>tSq{|$E9fc6m%tRR#l*l8X6z)2Qb3y$V`sv2iZ!IL zSUaM?4@h={4Nr66%?7$Pd)SkfV5n}&{WoA@CtFO!ZcA}$nojiTHf&<&n@?|s;fxhr zx-RjOWwY1JE(K`M;C@X)R2Vm4nw*rs;)UM0@G8iN3oLD0eI1by1-~SwE)`z@6%EBA zCpt?&?c-8k;u#)$12ZHm9U7}a5|Bv^D-kPs3r&J^sf$nFL6$5hV^;?JThf%o zLtz{MNwQ8>Sfy`Dpo`750*OfKLqla@(TSXQ%-lT)BQ=dIHfmN_2uB^|Ft(z)6i|@`jm1B`1o&F z8ScwL^kre0rXJ&XYW|I9Wr|HzD9tAU>M2b}^D|S4 zO=rbo#bUzocAGM76BM{C`45K*HHYOS9!+IO$W}B~q|ydbXVlsEQ|-6~R5{mNJ~LJD zIRg#-C)Zd*u;OOv`si*nCy#kG?qk%|?=jl!_8ZfuwSIc;l}C=*6|XQ!iywx(>i1kZ z6|b4jY&r8aM+E0}>C)x|pe)hIdmxhLwzIk2&%^g)t))N zK!5N#ssHKg%p7~soj7L0yivF@oaCI;dc1NrnlE#30djhhC!Cbjxpsz&P z(PgZpzRCOU3}VQT)oT`-FCnvP|Cs>Nov}ro! z{LWjLsa>5EIL0}mPGz4c3gax8tQC2$bFze8T}!KZou}O=7%qx`1*LlF=G4IH+GWG& z)zNX*bxwe+SJfWPNHxasi$Ovp!&1+a7I{702jkA-(v1}e@R9rhYuE1+p(g&}wpf=) z#-%ObJtTArUVp1QdjuwQ1zQU+%g#NkDtv=UjUP1Arla4nFC9jt)rr)+1(9qs{L8ZM z>d`f5OGMM0GIjQ)&#Nmuw4!Sgw~`HJ0^kA@V;P%CuJaxwFW{66jA#$R&_9P-!pn1q2t5qE1Ad5<5ergdQ{2-6lmG~6C!|Kb3ZJcF@ z?=K=qO+-YY7j8=#P(EcnG$7U4qy8q$C$0_TQ^_Hj_YBe?35}D9lMt5eoh?ovg2=Xy z_H!QLBe8iH2~A1k(uTvjWp0i%JMLL}sWTZs1>KaHbkZgwvuRWavr(0oi~JQeH{Mym z8f%mY(MYML`|uF0T(5U3KqdVRV9b9Q|6W!q?<$lja7xffgy<-EaEPJo>?4t`VRaPG ze~@mbgd@c&0tVfbGif80uBnZg69iE@6ABVPHMypglVg@v`A4a?mHzaDX?XX8+0BKi z^fvuJn78r;57af3a*xq-llV#=|0EJ^n0_#wBD52W$+3#cAlfw2PU9&%*Z8GXP(qav zsITKGH_z~jgm8#B9P8vVB@!WSbCM|4_?cz`2>DWXsC?<4T!h^zRjx~6}L zy`w%wxle>~cO%kPf}VP?VS9bIz~SuMx%vuuDZw1 zzI@SJN&q&>G+G#~Q3q+P;KZAfF81Kzk;0xl$51un!o*)l7Z;r7kA;PGt);|4;YUQU4DL4S{oJNmi# zX2lDQ5q9}YZeLa}8fI_?HwtK7$vl4lW!Fs5!&Bvg(G2r^*SjNw-I96^?fcepviNCN z&%=AxYcD{A1b_FUZ0f|!sY3P`@JUH(IgoSyj3NY(Wz zPWACwwe>uH!hh=h+&P=4M_UI8Tn>x&UQKpzhBJ}>9J1%)yhmkx_90tH)(2#8UIC9n z%gisw=5zPvpThMKz320V&gR?meFK9+r+v8!YaZ#Ygdfu756TwZM%TtSgJp9;W!oVa zh+rw;g)$(cqhI3T4;IqhM&0-)C6XyGVg}9tITsQ~SC0sIzs|G-cKgw=FC2A`gv*o@ z4iInkwE@7iA%~<+3iF(ptb>IcoK*M8HsTX`ZcJgs2eEnl(Tzy{pb6Uv3N;jXR$R(P zY!Kg2<=HUKj}bb34bwT{HPg8@zTpzzPi_BsT$#={Z48%$q@uN=oUWPY$$n-=9#Jd+ zLzVcdTL?Wp2l&^1(555@i+(Ffz%fW*A>Z-DF@%XVQ%||i$}duikA?@WTY|bo4@}8B zjU}+>%7xj9z*iGB`-PS*0I~flSU^S+V6%I|1t*}!q=@E|m`nZl0748rOGsmT&CBT` z2h-dT>HV6|Q$g}&cB|ay6!WCDXQuX(=N}`zXlRJ7BZpn(l05%LdaMyEI|)opIDxd?(5*%FTVt{KEPY)+>?c z(hDlGI5{ZT$6QZ}1zc^b=`~y|Pl%l{LY86fE>!=rSTQwwSODOTykp8MXVPh&t+}O(nd}AR|ML;J9}YR#!XM2 z^7U#>iNQvr;`%aFaeNm@o(MAcPqnOz{ox`Vin1<8Blu0*+syXSd3DizMWpo@w+Vp~ zad)TAK6=?_;aL{n2P*MpQD7S+qfde4Z*GP@d((W5u%S*?G-UO41dg7X7iJf#iz|!1 z73sC7`WG+c;kY6qc-qoo6HC(@F6o^0Xo{;AKss;(Gx%16u73|PvCmfiCq~!x;-eAu z@UbP;9=1hD?c2)?uHazqrbOhlDvFIZB8eu>q$({$lLkqbdr8vF)lg}XKg3GX#La{N z+C0i`oU2E_=)*dKRhAaTViuIzDO45D8CmYLt(=}xZDTc|y!l*ZnczJ7@>T4wQ_Y&^|o-S$sEg&rFhFMUCA8J z@7h~lbK7@EDqkraIZs?5xBt}Jx3_;^0(>n0y?@p$UMUz=p;tabnphL`FH0|?hqNq> z5;;v1-M~fmh*ldfT}k2&1H`fJzJCEnFVC#$5q61}JM_gFq-yZXDe;a{!Wg6=qMpyL zIfq^k&nJ~&8ta##|CpWC+xG_VG10B?%4hISQqr&h1B+oIaecDUp~eogPrLCoVI6#~ zm~;;tW|&R}j{Y1Iq?iEs>zL*OhQ;1k?)lG|e7CA8Qv|!FN*7e?6dq+RVU%dLLd8`{ z7=+KFg;Bq}E_=YjM}wmd3p0_7!cVUt%eDYFnIQxnf5~M(c7lv#cZU%oGoG?J=8FM0 z`Fyv&<7VT72p}#1#F-Dlb*Sq@$Th}^Wx(s#yIPzo*=Lg}=B_xB#ORtPc-vENH z^bjiGqo-x??bu{(0YSHkB72Xy!}&Gt$XS{-fS&T28KO%Wk-U(-s_N@X~t{ti& z|McCWT&6VOc7byxF)S)<;&l~qqFoyo@zFAf!Z@vq`-BB@ECy@TXUrJW)*L@*k?Bpr z8N)b=33&juHg4Ngc0gMTLKq1!@4e;q?vE^M0E!IeFut&NL-X|ep~hLMCG>z3N?}ZG z1+gH`IH)%!L!|Eqh0Pl>C@o=~Ir54iROQ5F6TD&K4b3F;SNckd1Yeam5MGpbIiL_C z;CJ^ax9d%s;>nQ=j+!G4Cpv%uI9xscHC>m(8abwh)3r@q9vJHZHijsVY9DMQ-lHw0 zU&|BZ4-kek&z;gu{ImnmAz>tiIGbxV%haZEV;M67KQ7g^im7|jD=f^JDuN8J!F8si&Qq z&e*4`y^Z-)2jxB0uE=R}1%roFyy&Wo@NI)4z1E_R5Te6PTUmD>@i|kQvR&iGunx?> zBgfJfqoCgtC@_VWHkZ@N=O*!O8Hypmi*dp2bFBSu0eg&ZZ*SVy=FsBi^7wr2oB=4w$VP3ZjA20MFh}bh<(!@4)=h)*oizAf z2Z+Bid6BO!@93y-m03gkKrCF$FGr4g;DBuLi)NB$^&mtCJGa~O3lF8h{mOSAYR@73 zl}vs(^%V}%Y0f)I(51UUs4gJ2qf$=6(qz!(1b485L4vawW+!T9s~my%#M+=Lc{NZe9Nb?G2?_putV8(AN9vF8xK0DZ}fK6fJ2bR=_;K_ z#%&D@aaO-P)qn(sA971lMUxRX`4qXf9ihK;ZhJ;|{1OJmPdiDA;hKp~OG0yS_$KtO z_y*XY&y42^82VIH;fE37Ir45hbZ8{>bfs`PE72C?%Z;#k-*o__Bh>BpS3e*$eoGz(bm=O5_>V5 zHo$u}esW)|!=Kl}96GP)**R(|zT%6w1?<)s8Z0xq#PC@Qh(~?@8a-DC<%ikK>1mh= zne`b%an3kqs!oe`9&z%Pe8ar0$zK_#FA!btL~4@I{{!Wr7lI6csFLkI62i`)I9iwO z=55f74hKeoby7A%8C-UB#GL+`St`QR`^;IrEN%e2I{D-6xX@@EAqfA(MC* zmx%^q;ObkI;dSI&j?uB*Xna@?NICZ|-L|c^ZDD7GB*UOM=_Zzs70L7(kiKsCkg>V| zZ~C_Pzv0H@$nJ-qxoXf(tlRfTWS~XvpGzhkiY6dB{RGY=DzX*?Hdb~DZVb*r$~uaX zucE`F2?AL}LJz(R4BGqK7Mxa4P9~vAD6sIvg6$!~flZ8qXd34Jp_Vt)ogXiVC@duy z_ecatz2SIe>u?G|yU{Zdi1Ft{JP4XK2zsz$7a->zdyyMu$lSWy$gb)l&Je-A7RRZ- z1z+_ddFflNB=#(NbFgiTrAL=35?}C*+1%f>u$E0V}ANgh6m#X446pKbphz8W}k=z{;;M)=F z%&G0dLcuW#jRx(n*?^NZ95lWAg8NSu)nQ=P8%onH;8Lun7LK8=gRj_A>)#}%e;LMR z&)&J_7t5TjjU6}KJ=vy7jBqNDK=OdWAOxHQe=ibOKWE^;tFWZ=rH-U$t5GrN-2n{O zt(>%$F#ai8UW;H)Ire>T-rXRG;=WiRuLhk4`KIwj97Y4D%E-LLdDbr$;ZTy_vDIQ9 z7bmjI1)iVTY&9t!U1M!PU4)^n-cYJKMd*h}b8&G)Xwsj^d5GnNYHu^ERxA8UDmASG z9X7$WNz34XWx*tV zr|N`dD-$=NP)^ND8nKZ%M3P8U8rK2^r5BPyZaFH_C1s|F7E%DvV}56;KEmE5ll3g4 zF^cS*hpqD~AHPaX_0x+f2(w@GN(f;Tyi!Ck%G_;#qj9Ca>#T&|Nn-?aDE}`}0taMFC{R>R{#)UQRRD7_&_2!(h)sqa{V z#-jPSaX7;ReV{Zrm^n2=x6cF)XG}qA0L$;oS{TX2&6DSX+mZrno=@152bK-)PguK8 z*k*YF6xhVmrBhSklAQkv33*aG+}g` zv~#V&0(rtWxO@l!dCXgq_rY|VWXzD)1EbBCDA5DaRk_1+dL!FmBNMNo0CEwl9@IUH$^y@8lDWsk5MZDy2sh15B_364zr*B9l?Da#qBwE!GE^y>OY)FM z(+Guw@P{^*T}%^*I5MU=UAUZ6e1-5!E13bk+J69fDxjT6wlP!s8W6Pe{esTk1zw>` zyB1Y#(yvk9(Zp0CnJPK~j{P2ZDn`Hvcg@^^QcZ#NZ;{bIqT`&2n0q7Br0OzJDeU9j zGVr_XqzhME&zAyZbaSInaAnNE+EF!GQ7C?XmDI;(evAYW59w~@SVy_*4^0j1;jbjo z(#b-v5OrPfLp37|?1!_UK6!PyfyLO{iox2ADvV#tW*io|LQ#|>pB{d8Rl#NG4u*8S zjnS+tMQo)3Bb5aOgEFI0=Z!dzGeD$8t^60cy7+GcWx@;*?+u_H0R~r8J2oMq4Xy<> zX*Vg67FSd~L#XwQFxc(D6P*#}E29sV!;d_YgS3bqb26cNSby|?kyJ>eO2g*@psjCe zY#Rs1L`vZa6@=Xu%Ek2iOpIV{i}eUMMuu?kg)JWQXjbh6UiJv&7Mql}vdRImkw_-- zT%*oqyOzrCmn_ESeX7R(p1Kwc+&uqw^?=_f_r`sHlVmiWixEKHKmvau-JK8(_6E!#<6lIuvF7t*bBdNb)p+VZ-*N49x4Z$m(y1rU!dCio9k<{P11Q6n(8wu>UmIB zvZPkw&I4T7!7h1aW~PF3v#Mw(S0FE~Bn9uiATRY18$%u$%n$-{`6l?yzOz(k@F9de zQypiffIFv<8Xy_5jeeD>j?xS9P$UXr+C#0i`WjWI^7vZ)+}P<%ADP*4uy7z!NUk*q zsT?R~Bl8!ld*(iJqZ}f*+)!>7q};Lhun^6>Y=VT|4+O$WRtb1jQ>kS3(e1~g3ih-~ zqu8J+*Oy+T9eludFRNGYO;KM})rj_=aEVoifWwDkE%bVgyc>dnuN`xN+Z^E4RZJFp~M<3A~67qNJSZg^hxPg`$+(SVpx&CuSu56{b`zav37=N=1uz75 z@L4uRAg<;iDH?)o<{Z+Ax|k9FeC^gB#P(LfZVD?)KPNR{ADxF(0JOe^_#Q&^djgKK-AF)aLxgWPES=U- z)Ns>f%V$a=Q%r{G$6VH}UWaK$o>eDs-X$QrWMRKhHm`$esQ@IL zjQjcZl;}3{j8tK?zA0%OaI9-hvn4q;1vGT_D(fYn3l$1?B{FSZ$4$)|IO7_zsFVkx z9K^5lLCE%GQ@)PAOrcyftPIJhZfm%JkPj?wU);Fg9l|?f#3t$in59s%U2PYIIq6$h@&?iMFLEg;_RxG_pVR zxLcmyf2@3m{f;*95z8Ia8$f%L-jJ=~&N%(&7O=dJ?$&QstT#l{iBCuMd-gnisD-|a&%E5F(coJ_!Qx$Gg%Rq3hp0LL%1 zg_J}-TCeO&_G!C-zsb5AWAPl9G_NE<)E@zw3Bf{q7JN`G<<@p#t_4IUMutX4i)3I0 zzD7dLZ)gvferQhXy{JwZN;CIZU!3|l0T`k&cSI*V^8RZfhm)m0q#sn*AEXZ>#E%dr zseVErh<7&`L8NtS+OEx-!EGGPh-=PN^lg2T6Zmd_zz(^YbT|0sDUq2pvHun8uQ!T; zZ(m$OnXaodx)TX`{~?tdmxab6fj->=sCL9aK4zDeU?Nb)0nY$1u&$w@`sJ5@7Zjl9 zearZ=7+p)^GnSvf);MbEJI?>M-O%G;Y#lBK`3T(5du{f*?4C!0Odp96MM8%3GvYRI zVD|lJ=W-brkN8QL*Ip?|g3d8zqg&<$G#lBmwpb$xh$k8{eexHfK{XtGD|V}Oigxnq zdf|2cS8M0>nEr~rJF*-%Wc69>I6iDPwe&?^!I-a@2a!qSGgsT%?JT#dL@e(MXBQ-4gpAd6{IXCCi zE%|Wr1@3!IX>2n(s1P(%6HqVCB-rq3Zkc8IZbcx9y}MOD{fR>Um#_VcFG^g($Z|NM zV(X}^u|HfAN{0MS3`Y8G{tCz>(veGFpw0_Sgua!0xxrlxHTrHuo-k34f{hl_;S*!B z@ZTbg+sD31*y?a`ScH_z?XG#BlgQe+xrGS^bopM2f#_#Li*nD)AnXRwY8gd?UUH3N_m9jxac~S_o3a8r zX#IIF!a+J}7&pzSmpYf2H#C``{2&%BDJy3sCfbW{MqbV;9NScx;Ti+U=A`*q6ah4! zn7ORduC9&-Piv zK-=GpcYGx5a{KQDE?&d^Dx80(FQv{hPt>~|^J}a)K(rFKO^~qRZY(pdXZ(JpBuz>%5O_#Zy(27Jkz9!gPDIU^8+)uI zs`-eLbi*->uXX7m(^+@o?#33bV`)-$Jbju{w>!0sr1w_6fSN4o*0(mkuD{34puYlA z?!Q$be!Mg(JBQRcLz5eS!31M|y(ppnx8RN|`N>eQ&|tvATK0X2KjQLv0bG^SiFKP0 z#Dgj8;4O^bp{4u62bB$#YQ=XeRzSfo%h@?UVP0h`pT&1(H8oqXlgtnUg6)F;FHMQ> zOup~)kIB`!x8wB%7GGw8>4P1#XYd5mZ6pk$9tG{7+HPq5uZbT)yV4Rce+Fv^wSCIs8vvQGq@x;|qI+@`&;TVPJ=3IU^b@n5)?sB+0`=cBle5 zihGe!_oL{5z#_YEt(13~ov(ZPXCB#(szVZC$ZSmf8rb$Zud)*H@_gIp(;z+b`8me; zwfNY;Xy=FQzD}|Ca3>px@D|Dfqx~_H2qn z5*`n0XK-f|)~KB|3JB@8caMp_Ss_DI#3yc+dpm@8ggjld%X~9I(q1jQ_t3Jf3Ab8{)p1%+~6c>8ysck44aXjsvU|8DzEjriik0?DR zkLt|lB`__N!0KZCozH`MCQNE2 z2=SVfuy4gO$qnxlKsplkDdfN(axF5)2Z(c$rg@#6jf2?KIVd#T$LYZ!(a(5%bi%-! zwY3ZYzQp>*P0MDUbewP&RMILR)PTVpjoSUvyV4qou0uQV)Fwo!(YPK#9N+uvwS?KmRTc|OO4}CMb z2e)(iQG8HQp8$LD7Z{|lQ3G9ih`abCL`&(_FE=o7`FcH&nYulY39!c%dymE>u-4Rc z4P5AZPU5@ph245$9r|^xOTW}>PAsM6&MCd^Up9EoumX5679|Tm}#*^sZg?lys3TUH9y|+6Gfm90oJ-ouC9D-g+Xqii+@D+hsSXtlwt_ zsa=0~;?2*i4RCKe3W9;`DhF4plE%jUtKTTD((C+AWn)>&#M&=@0fxJ{J!vE+W$64p zZkjLHC@IpO4w&(MMasnIH@#oloM11)29k@r_(OwzJaRwSqph;P{s&v+v)PV)XPo>k zp|w54zU~J82Uy!dG_fyB8QC527Ok)U3_#lL38y~Xmes;1)QV-R9|MFWG5&M(e z!JWi^!fV909D$9xg9g0bgy6K>gaufyc%&k|bNVM+xoo=HTD&0#>eUZz-7fJy{Rd)a z9C2RtsP$$lP{py* z)GJklJ(Hk0U)nQXiugBWRLKV^`0smjfzc@PvkK0fu=KsoHHBdjOPkwyKV|r)H#}Iy z4gyce5kTvai*3Y33SB*keFP<|i-)#onR`^T*wgsi%F#4&dEyqjlEu|cQ)pkWybrpc zW=6$BC0E+rLFPHsWOQk zE**10XvWm8imoqIK0cw_+B(!sXV_9#G;;EpML6ikHM9Rdaia^Lv}!pWDmdqnRnH89 zeUmcpPE)brJj$o#TD~U)Y>dwl*SE@(3@pigx1H?Fk!$d(8iN0?nl@F=Y1t3lyUgbf zBOW0=6~TKAU!S2=w-ptrhM62U1`2?2bN-!_&_zE;&7r8-tEOMsb!TUfZSnRo&-}Fv z_x$yJ*6H)>)WbXS*u%S*>6>>K%V$?0GvA7}Om!odt8a?=A%@v|L!Sp-$af}*ck(;~ zX**{Jk3`$*|Iy9~rkGpb9g&SpBVXVVoi4@xAL&lB)#?2OU=)BCay^o4Gx^1D6vEiW zBh$u0!?pSyN97&2%CPFm<>gxJWP0?yeCRHzo55Tdg*AG5Jn3}$_y9OP_JFsQPGK+h zA?N}=eWuoJ^H-36YMv|9D|(c9!r}B%OLq#=BV8IO9nCiQqOVLjnaQz2kkAH-a`+)J#H1^GO1`;FIA9%aDX<20aihkgeOH|MCQDO8`z{c?f= zVr{&Ko}-btTYXX)tp`TmbTpsAmnjz`+tf?--#WMh<+`~yPlgUxsL>K4dD zTqB(K^cDgrTZ}}*S*kaW)`HK*{VXkPhjvCjevF9^NJ6sdA96a=1g*(?dbFuJ`7-Lf znak4)4Jm;vHU(3B4h7TXyM9087)aJ$FT%Zb8hmd2xLl)Xdnc z$Sjc5?AzkcYWy9O{KfV!pMy9VqTk%T-+R!p+Ej$n3yGx4^u<;&^6E6x;{9*$Q|o9$ zDI{N5DT*0F_Qu}wG1WaNp3hau#QGHy!}+ky(FlzHLuJo4&A=7V%$K9hU0QKQIiXP16gtJxRkGKP1*_B!#dYTlWe!m~) z*wxs$5^^K+=J%gL87_>wcBcb|Bi<3clKC}=shXw6WtQX}%R7(RCSEURe1d()pmk1} zeeg4k%DW(-7T<2aqpi z$BFwS2->0=cG~)o6$-m8NVX9lPXs9x^b3BL?S!fq7cRi(}<5bgR6M0v#VDd@)q` zrOY<2FtN$vlCg^mnKFiZQ6j&5aB-Eqz)$VsIJjDr)WKs6g$6)=Xl~Eu zG3z&K$`MO_(r%q7!Vz6QX>~B=3IF^dZ*7ekaV$~MXcK#v)G1?B*J0c#8IOjO1LBVI zhGMPsCa}RKvi{mhwF+(TfK@_A9u2DlwF#}C(ae*rB<<|92(4E{Bf2yRwf_s{k$njm zMD*-{W#VTQ#$>=}+X==bz(#O_zZ7vb|LLYnOKNw0Jo)#nfk72R8yGTpK*jMcfqjevl(%`cQ|ij$!ng@65V#h5?$`h!7y8M;2D3bMF5b$l@!w7aUtdYJ5|2@ znBhnuX3mbnuFG=}JXBm!x-VB^ufA`4y#cmQJ)sk3VVQ^1r5&r+u zdU&iqgdew|B;=tm_*kqGWlBoQdYv?4I$#_;auy~m8){YxHW!tj_N z()n}f@$5C~y~qwgGS6_OC<}C+9NuT45vOxG&}V&Md$iR%;>|(cyWiLAuHA%#I|Jrh zhKG_DgL_PeIUFpqrnd9s*sA}Y);7i*p`r;(it#c35AD|Iop&MR`p(1Q=yBZJn^>|U z>5&wImV(gdg7=qV`1G>f0Sa#1yzF++6ewTNLd-wNK(D*Y1;oUo(xSUDgKVAf#W~?p zZONu6!%vR9!=2`DKs$E_B?ONz1caBH5-dPXR$Y|igkLRNLbBbbyu)9WDCZq+od8vs z?+BS81`DJ=QMqpHfJsDHB#6l9A=`Ht)^8W)uk?grVvX;OlywgU8?d8=1h;Tr!1A5Y}u@#bg!XrW5#fz|F9t1-Jm{X zOlvrB!k=BE`kKZvZTJZp>i?zi1}yI>g|a1t&i-!#Zxgbkpl2Lt-WS15BA`n=!8!dU zrEHWGUNQr+L;rocRdG<~v7NGnFXt{hJVVDJMf+f68-G3l<||{I zPUxnVslh)axArt4zKImGxEY}LOk^Ok*;a`fyOL@Zl1q4I~k5H3jX&H?j?s`n%&U6D|v;xPC2*-afx@gOb> z^YocqT+F((bFmahxD*GcHg~@z`u~U?z4{kh+HXoNX!nJ;3&G7lj9jS59P(ef#-k1Yh?ZOu|vr&4PM^dMp5HZ#$+pyx+VGu76#4k znH%4-0;v8<_+P3OER1PWnKV5dm+===i6P>ujQj>Oa}5Y?4&8C)Avi{?ohCBEg(`5` zeB})3t9?>b_G;So$}B@9RN<&Qxi$4G%YYrCAZv(c{i4;%1z_duq>4>EHvG&8k()Vid|5HBTUFd5fL7s& zt0PRYVfw&h`b0y>``l@s$#s*H$`v=|v)l75JzxT`tbd8iwUbo zzz{I;>>WMxO~v!UMbD+?tnG*GA8x#FJejwX(SmQ!7k{@d!(NWtkRLDfo&RtHw_kvj zUA`l}ZU--xdlNy~m`gTR#9JU?yzxdLkZ3y!_Oa8v#F_z$&cEA9Sl^8rQ@RYgs+3 z@BhsPPjVW9zPe}BYjsOh&p!c=MGazA)3~9>uDZvr3{J&|n9|a68d#0v`IkR@HNU6; ziwmi>|5CiIG{$naB$plQ>QLgV6gGk*@S(N@{L}a4EoZ4d(l^c4<`j8)3}m<2h4F`0 z2PEYdOyG4XE*Jm%%IR->Y`*ZTWed6DLi$Y&(UsE(VrbQSif@`QPlD}nau_@+{=TYV zFvGo~;vU-u%->uZ^!2)6@XLA}e9XGP_R6cQVgG0ej9So(UkH^io&P)$dehfO)Z*FT zi+vn)p2mTO3Ymi?pT?!%qH!Z0;vNiL5cM4*;$|0dPmky^%+a%-V|CSV6?6hn2DG6@ zC54H!DG}j$VLEe;Ykp{$ou$@aDY?lMA$AB=E|hrt!d#rLN*59`NIJM?%1r1{cExm? ztLwg$oEaaR_D!@YFsrQN%5z5kHIr8Jm(=FQDme!Sbki5A8aLLHpAzpCEj#Mj=XI!7 z-msOAJmxNaU zAr%XIKDV>A6+wxwEe$dYL?QoZ9BpN)EVoB9s`x&t5j=c*WUq8BnonVYD~}$3IAivr zm|adP2P*Y_e0)8${`m1+5j!?jB;4Y89c2zScc#NT5u>ciXfx$hz^P=`{u{1RM ziyY92*rRu=K==Dr3puW3!j|d@RdP@3#-4(rKrb)z7lUOSOro7;$AA+ zMQ8`|*D*7NmfBD&9GkU%Dt4ROK3OVS2X@FR*ChGw&9QAvNiFF|$9DPQ({9Z=x72G_ zaHn)|&przpXbP4cM@Hy4A>IMauA~^M#&Yn}{C#>F2lbg`W`^L$EISq|f6({VmNb9hMhU8IW zrYci2&7e6)qhxKsvLEHD4ChWg+Ev_qaN`)KN)s;9x%sIUoY67vm_`HsN`7zsq6T9JoDCn13g9H~L^#ZCrc|f6`DE?y@a*h8 z`-FB~QX{nmwYIVjUdV80Ocn4(%tXe9g^hu|JF&taEqQrWd7U+^lFAD6s>1+LXE7@yX=P<2O-BnWVNPRXnZBMD%GNawRVLa# z-@G*q4h~IQxq=96&9YOC)zeeT)6-J()9+|AV)pj+jg=KGEi4*nC014?<|QSikh50I zGmVX-iL0g02Z@cPiKF)?V(yNTp45|UwRHxrqRyJ9y^VAH)M02aH)9xCvy0Ry{9*KU zt$wJECBow;P-;WvU?*rKxM1jGoeZN2nvQrC!21MNH3v$0)Y68ub67Z?=B}ED3f1%a z18*ei>I!f27D6m~* zMo41>Et*tYTwhpN1b>H!r(Clksdf`GDWeb&dFr=2=iONsid2us-pS|*v>H>TvAD4A zGpkdrFg?~;tpWMASh}@!Jpee}I-s5?a%gOz{skHcOT;fEC#@I;)d=eeETh}Ww#k>n zl~)J%JEqlal~y2MxN}tDc71W9HlViXy}M)#qiHS-q-C@>(u{Jkcs#C@(4G*UTDQG< zO%C}?r3x$%@v#^hp%L8xHhERr$nqwXnF6c9W;->(O0=m$X(l<8Jk?qev#Yjl_m&y) z&3;X3D9h1J(`0Oxrgx%#GVzC`YLh&ESza|>(P=4Px{6Xm!jiH8glS1dag|kt8O<-N zveFWZlByC5>#{HwRTkDJk+oAw%F;4(i&ag^(=iLm6AH@JveWOxs#{8d5YT-rXw+-# zu7HD(frKNqZ)E{I1x!9$R9EIIY~mHUdb;j3#+o?@)EKti(lkb7L{cd71ouJN=d3Jd~>1KsjJtmtBVJz z_t&QO78dUA)G~y4;AVQ;r3quJMCOAG6q^zL&9{;^fgSp9%vE*rnH)gBEh3$A897uO zoLQP2rUGMn^sS=h%*)vA{byuAQYp>TaalG-4A#>ex9!6CPLj!KqB(S;-HYl6R*Opq z8*64c``1n(zB7b|4?OoMr&K67L^zbo+9*VLI!e#3)HOs-ity`1$oAc-v<*Q<*@{Q> zF(|9OvDy1oR1Z3F;EiVNIa=n}a!by(FNhf8pGPU+&h(d`z_*GR$ylz=N1&*c86$H- zXlrJM4ygslU9$<}p_505KOdmSm2?yT;$>}RuY$9pu*osA%z?{hy!##uz-ffXsV@yI zl=pMW>t>^y9t~cNf~bGVRpk9u`SZND0V`F+glWytu_4t;759>#a=u2OeQF+R`M{jD z9ZPgB%5HSwJ$0&QAreHLG>U_^%-&$7!6^N)q`4= zTL2A+U;bxQ2lN2W78UpjQbrkZZiVRet!K8<8cTN-fncLm>jh28J0=AZH(#l7G@2wu zy=WEDn82vFc}`CK3D->3t8BU650TK2Y-Ij4yH`cQ$d{yezI^&t#HEVhGqsuO@>O{@ zRLWxsU2N2Htm>kl(lrw3)9*l!{-AchUMU`ZV%-pVM&n#Gwg^=IteHj-)0vRc+;S$@ zRt^l2@%3BdWQ}Q8%Y3*)bxys%u;~TZB)@}yGw2Mgc+sT|^9LrllinJ1+#c+IPN0?W zzfBMUF13j?I}=Qvh8u@M0p}okX8w^Nkl-tj5F@}mIs35Z!=ruf0DYl_YhBSNhop*) zsEUoWG~K}CswG)nx@+ObEZS2Vwi6v0U29pSS4J;aQqwH@!#I@^wXSin4-7{nm`C!C z0K8?zR?4j^A*HAeF4uNrJoGB7fUZoY<92-P)P~}w0ph@ddR%c0$b_PhEsFtmTCN`OuDpxd4SStGQub3Rp2j?Qe=H57+|rsbtf2IGZULO~ zS+Iwu%81z_b$EI)Wtf(y5>gt}5dv-=^QmemrL`Dh5`+$(IJuhH%JkbQ+_%%e(X+Fa zjYdkm6G4tOqsF~Zw?GSq^F<3GRgGq7rB`~|;BSCTtpYJw0o-WwitiA&e}5>p^onh8 z&rxNn$WdwMlIEmUjXD}uE#%E2MC@~<<_@Nm9vAZ2NqZ(H7Z+Ki(~cxayOzyIKt=@q zbPF8z_c8#tC-C{@M=FSrEcm^hUVH+Sk>!E3~vIu=roLe@>-xYdr~bw+HOOv`OF^xz_LlKG_F z+*c!8G$yBuA5v{K3KnHTLH- zM^}K=w=$_PCkH25jTMRMg3_=!1`K%|Q{C3`G%k3H^U|0XdMm0VbX8Q=F4to~I!JrD z1~gSqdsB&i-*L3+^$zsi5>^{a z6=_l%j!av~oJ*`HMG)n{`3RrJ1env6<*n7mre+#|80zuleB982+{j`0O|-9y>M+}5 zE=j!6ott8|8TF=33wjX1rGqMQ27~GcVlr?kM>?|4RD8&%I8=jYOSCIC zq)HnmlqQUk6mu%bI&hT&?$r7ILN{6nQ_86Gy={>Vr*H@@a5#kYng>ER!gyfw1^7sS zltLAgWC!_ZfSf=T2R~|P$;&K`z1rj`Bqz(=0X%N`F=~nU@ra-otNLGO(V~?JSe6>M z2k%EqS3_G*4pu`~oy0iz(WsRd(3EFRu1j0RC}CMoMl~rY@|b}vPKfk&??+8Fg{A9j z+nE(~bd_}jTT&**lD5135+@5Nm5WRn#|?&koUuH;3YA8G=`@yuUVC9r0ETGJbr?*@ zZGS!6TbI2W6kLdATPQoQW46rpYypxv$}lq$$4ndC&FrkxYj6(I5G(8U0t8-Jv^^yR zFJk0$<_k7=RANb8iEWB10*GPO`LUE9Cp3$LTt!uH7_4A?@2k1-bZ*TY4Xx0QFYD7J zj*l}=gp=HISlB!h+-fvB*rYqyv^&)DbjlYNPjP~$i8R;dO?vDW$?JF;a?FM+ zrBC#K2rFwGo3f8B%duvN>y}GeqMXxz%UVAbqm0-`WgTh!3p>VWIh!6?%YcDxXVPNj zKIc!ds&TGobUl}zX?c2Gg?ob;b_d>u0+pp`E8+K0yl00%c^t2oL&$6vU=4dide=y z@gRQ@ji;)y?5`mtX-x>y>2>xAon1K-8(?dL+k%Q2H>#-lcN|pV_k}}ypb0d@J(DXDm-qh?xh5JrQx4_R)UM~&C7bzA0_e)S;{1HObI6lhcS%;Q z>VD^!(9+Q@@Q587Z`S&owaTE(0uH+ebtKs9h>og#qD_PYjmE z*fooM=2-)k*@adk>T*hsmZ1t3si{M67-Jc1fx2Wwz=+{Flw%m!Q%!YVn=594v`Myu zfQ|tlk`FlB8eUyupl%dG#R0u6kDLl z*kA;Q+RPE;BNT9m7YtLb-mi6w*ToJd|&a?1dp~kM0d4YY*s^BySJzl}6PO-!=wR z71~e+u92ljiTKPwYz^?2o zW`J(d6&%1@d^-*GJ+xO>@ev#FC-=$<;4Qh$iP|Z-?T*?hyA6rzCALk9>Lu|rYyA20 zDC&>mqbRZaM%Gakui_&H;6q~j5810t;(yMh4xD!f7m zcuQSyuV?_5g*KlCD!A|lBFH@wd|62s7$x^e78oV}Woot!e&CecBURv( z{3BN&t=uC~AaBvt4}fmr6$Wajz;+pGr^xmxYA63TE#`{buUXx$+^Z$j_n_V;GLN)g zXEKkZ-UqT*pI!v=*WbNS{ynpY2B+C@cTS6gZ{u|5#xJ@Rr{GjKU}OI+J^3 zeN{2JSC;%0_p5S@fDf_lEV5U|z%0c_RltYHHU_Gf__iu4UiMWMs+Z(;7dcmO9=-Us zE2<9Pwi|#p|BC3-|2E$PljL3413&wdUoR#3y3}V^dyntkK;0ZgV$>dl&m|NNySM-0 zyH%%k#9oy4BzayO88Cd_bz2AjiHn&(Munck0R2%dKnOP*J7`uSla5Up>-Be}E z!AVG^yz;=JQrMt`4?wB*5)O__X>N}#VE%@nEtHS($?id*sM zN_zRaE*hPrBuZ8fYpeWouD?=dnMeMk&VHW)!jpi>MT!S@$ws9rXBGo7+jb^+#yi49 z-~Fj_Dhf}S#;@04;Gf}w!kwVc4>tvAYfwT{y2BPnam za|FHdCwbAA@XaRAYnqZx2dM*+1O{pmbQcHv6rtE+v9nPC?nTRz>a<21OU(`WLSA*6+#Pc3gkH&1WB%#kB$ysetf5Zr~AWAfhKN;u!^s^YBXwX!T(gqOBb9}_78 zuRk)lx*jNx5;K&mvQDn-YBu(8D=a?#(j0NUOc?roEIb8T4B!M*T6r8D8#1u!=T(Dn zE@x6o@qq+jCi^1pa6qUa_COqfl0!f^ee(w$+ybLd?!4;u>}M92bSrq@Y`Petok(v! z-PDi|FllM>8qG9x+235%suZlaXoT5AQs9b8XS1$$`ZMcAcX<#2!F~hs8+F)gvmgq4 zQOUuxjB@p5K~e9$gX6Q*jwfrNq$BDWNlH~~Z;^rN*~sI5t#`O@0@B%_|2D?#RpB)VXUe;V&uPIl{obn%Mbf{U10wxYouZagPCpqDeNo_? zyW6Y6baa8CCAg11p+-&vTh-czX@|jA)5O)JDNPP<=d4uPXzqVsdxjv}S*nas&+Hd7 z+?F;a9nw1Q(s73l{T1mDajvuw8_iNW_o8I)r3YnIbU=%kp)silaNM6Hugu6rvY% z<@wI`#E?X9xH|E?ZSiv0tOdXqyv<CG4j(B2ciG zUC;N^%-GJ!R$N~`q|!IjHV{gLr_9-|^NgtI%Kc`b7 z+uumuNR%V?&_bch&`?uIOh{G=#rhOaQPI#yQwty`g1{UWB)%ja@)Pg))+DK>CjxH5 z5Y>de6l~4q)y?JUV|93b!%BUZ;wA?6iTLd-B_k6E`3(Vmu7%--L6QN*o}p|DTI9cg zKP24{(2oCv`uY4C8PWj@1eC%1@50jk$9>S$>>sS3FEwBCrSeNEG+kBK#E_E=;SJ#9 zqWPe}`stGm&TI^k1u6*<^^J##v4;)s&(~O|mPfN$I~Qw7`@F*6h+iJOk~gYqH!3O< zl}>8+N3Jq6TO}8|I9gjJ0bP~7%q>Q0NVyXKty6QnC_>K z0jxxM4&ovdDQqwlCKWZPTHZAe3*v0jN5qZD>Miv5oE-J7bl5+PAmN|inh3kyQLq$2 z6z))$&wUhQfV?#}O{&eEn?VQpIl|L$<0CY$y;#v|FCnTY3i#IO9Ptdp1Kt>Vei#cj z((228y@024+iCqZ8r!REz)7m_%Mx#iyZ%fM2*Wdh^`^F0?KUrW!>{!RP;WMugrsvd z7WsTH0#bX}_r&(URI}^d?!gNO0%`v6O|4wh?|tgVG=>~@gNhKHULFGQ_5&{cqeZXZ z!Jr_o-%*YCYT9`v19PP(hHp@h&n3)Lu7X(mPozs+K;nYrkjMKB;ZtWP zeJfw5@tJ>E$!P>b=Klo}q}BTd?ei`zIU5x1^OIQb+Yg4YY)U@6`eXMTTJk5W$Z2GIvHC{h^cy@!0`UGJQfk9+fb5k?%?86R6j}dw z`3`D~`Ia#FJNR={NpxLE^cV@C1)AuFOD2035y_6YZ~^~A)iVeuuue>B0*rzXHPNM@qZqx0 z+=sZg{gf3Qc7EJ2=wW%d>K5Z;IsZmF~m(u$H^NrMXSp(;cwRBEZPOK)rP_ zC^unWQ11&VCZaXfyBXHt3C=QFT=OM^y6UEF4E_mC&r4Fev&=ErraLJ!xNxJReNXNG zPWpEk>}c0h1ejX#*8)>4%$r%Yxqq!W*3&Nzhs!{o#UkZ;st#pFu?yJDGU@0z0hNhj zGQRI9*(M=-5(Xy?UH(^>#b_iAe?ZQcqVJuj&;HEpi32>-r!xoVEqKGOOlt0R{qNcH z->62VTB&4nUevvQ6mmzD{8_&8Vxqka{u@z25I+UEF+A89ZEBFFID!{)nmemS{J4va z7Gm~eH~5_+W7;{+(h{|D<8UWSk(M*stACKCNXLob#of~K#uW5qpEcCm_kN940!>jU z{Dh<@Bm9M0Mf2FkTJP;QoFkqmHsCCY(N5R8c#Yt)AjR+%J%()SDN-b}+9G(>?LfYv zRFfI?*?{8t;y5oVu|Sr zI4do|*o2x0a~MrUL52VJI&y4V!0ESI1|5NS&Dru#@0H7znX0>$CC04p_b2>iDE(X% zl0Y9Qqddq|sPlpr&=uRvpcB%u6*2|=Uxms6U8$di($V|m4y6o*^mo|Un^ATrX$bO| zmq-bJjdLTc;BZ;vn`tO2ggdVWSt*d`BnG<*I}1G2jik0|Zd)Fg5$n_srlsAFE9Q10TCh9`LS2c-(OIqG@WjwWMui4%w7xVd8|E_E} zDhuXZD$baketObq#DSqA0>1s7b-@I!j`sZwBQXi}LM)3kK>D`8fwA^jI_6$V|HZw$ zS315r?iudpa@NZ|!4OTMIrR+9T{yQ-z5kOy-xT@X_n~`w=j>y z-Ndtxk=Mq1qr@%rawxRvjp*iKP->05{&SVa+u7CB)OL2&4Nm7b>?>_nQxw+3Y2wS6 z@|q6qujRJ2wzd0#1Ot5hPWCzk&hs*nG0NrOg;MHduC{#_nN!vxh2iR+!^=qT(X1Au zq6_w?xlqMlZCP4Hj(YeklKYgTU7E|2hUO6xMJLOLGHrA9yt?evq;a+u6C!0+Su7km z2f}4awu`Jjc3P#%Fo*kzYnFAuj!ox@r5C)oFWvW_YvSRCr_Ln48>~r{DKxB-C9Oto zP&KSp?$T2jkaOP8ZLM(LA3f)-byBq6HFkImXVI>m`gv$Tqp&VtjSU(l_0VD`xsZ|m z^~Jq3DtWg^s==T9T#7;Ujcm7(*O%TS&6)G6Ej@fw0tn{ugp z77okES<=TE?9}`=t@?-u=RtmD89`?YhHH$btyuL~+>dh9iroN%VR_<(qzfGTz@0jy$R zJ*WwpvF#Op;||e8!VhM?H_w4MbBT5bIio8MZ~l0{2XgiXLXQkTKQatlO*+9JOq@IU zTj}O>7M-X9GD;B#FAL0zX^NcDPoLQY&zc-|;X_#*81 zwv(O_15pVO1h@S2^ZwN(qQmnjxAdBkuE=;dKppQul7|9rp$Bu>Pf~er_7hy~P%v&$ zVEo=Hd|udrTv9zh>CQL;ttl+r- z)kpBr0E@X7L&7!q{?Lnx-)Ev+l<2Mporg&_AMvEqS1f=d2)e}Y>v-u7;9@I6>4n_O zaysUw-;u|s+`rEhZT+U4WUf4FRl_52mSm=R?@mVWJ>kU?=MjKjj1tLRazhG>tr*oK zzaEsOK;UM`_4W=Fdl4O?{y1q+-;OhRF#ztwhYyWKiLb1-yY9?JbwNoS!IsYu7*7wK zy;&yjyFp$1sTU&<0yyPV%Jw72SduBFUbfWH@?Xv!QuhzWSmI68K&&ZW zGgHAG$lz(e)oHy8g?!6B$|Og~bT~-|a_S;)7*nlfyn6Qhi?b?x*^Fd*b@D*+Tk2-} z@Eq$KL;o7U`}gsECD@b#zrCCqngbC_yV1Z%3bwvyQD!7sN1n*r_}hZ(ni(X((=q{w z%2VZfl`v3blXG9BtXHH*35{EX!#0B=nHx(^k1&EBMZIFXaZ0PILdr_1QgE2ng=vqQ zJ|gA{GgRt)qUbJ&+Wc3OeAC8r(cldkUz>s>?F}cPPsnaxuUW@={YioOHmp-WzkIg8 zy1r%I{-V!StBcZB4zNA9&GsuiM|hCA`>;7txw>JHKS$qsKj6jg1=S;t$9&$rfWS{G znpLind`GNiFC%ORrdeVdXjEW1AEs!ryf(F|ySHk5BX zkx5Vw3zrRxtIe#o55xkbD(3Lh@lQj#IjLF)m5sV-_3^88#rqZ$wEYhXbuy!R z6IwOYaxHM`Hw|pdBon0Ms^KS45tpA;QN?j!rZvy>!vZVHQzdwhCZYa5T!h0ra!9$G zh)QhAIC`ibT1Z5HZsoTOk=z&x$p7@jQGkij$I7;N`JEhCma6FRu2 zeEbuJY0+ly?MOskpWVW_w>smt>%A_|JD>-7D$D(8TS|(Da^l!FxfGjRltFp*}hbgG^Uj- zfZN^**IO1qgL-sC>r>k(A{fmDl{mcmt$Z)jP<1NG*&}UdYsQC(Y#3aPhs&Qax7LCQ zeQ_1&JBYjyA5`IOK)Yus>*JY<5ne>aoI=YM1LqX$?oT-c9Nv999xH-DS~petb>C`V zoUTxXr38eVr8-Qb&!x`nC1B3*-mfXus2>8~69ynaFm;%-F@cqu-G8IA!;MTcUf*?H zoua9#5PXqy~`S-tPQ-VE{0`%1zgSD2`yb&DCX+qyulz7ZYL*-9ei7PL-H+_^@ zZ4Nwbq;;tOCL<@7nG0rOT?gN^L8hIy4igB=?8aPOW9VuISVYJi*jSM(5KeB3$h`|Y zJM!@AM7)VCqZyIC{giGz|C`Oy#k*vu6CA+ek1SRV-9kOY+?a_pvi#f}zuLIV#I`+`u*ac9ok6J|? z!0^u$ig}uCzzdp&8d8!8d<_uV=C1emd|n;(nNJcuL5}r$5NXs*7H!|rK%cK*>2*a1 zE0~Luf5BK!S#QsH`oN{?(!4j82uxPztyb89X~oqCXS9AI1zkrhWYudOboTOkJBk5E zbZ(V_;Z=y)oUIiDo!^2vZ}F|kSuUZxDUWH*<);+Q#pJx$XC0u4?&QyCy14?OLr|_kP)v;Se6dh=v#oQQW|V%9; zP)MK}94R!p>9QQV%f+h@5`1lhET;{xHwaM3rOq{M4A0%n38Rjy8KM=(+KANCxQW6e zEG?8j3I%fSU2%sGUf>(GbtiXeAY3+HA=e(QX875sRQdeCZT{acT{?iQ+2;3P` z2O^fJDteG>_K1d@D2NPnbb?w#VD`k6;XM%gbgI{%lyRjR*?*?V#{<(0^mIBrq`kJ4 zMbSE~SIn%rFF+6ujIfWakRAz|$MgMf4t+eq!(V(PaA?O)QW!im(Mm+G zz-ax1x(wX!TuEcZ$0D*fQwg{jEFZ|08IfjA7_gJ(&L|^G4tn{=pEVqUEt! z0-2c1Pg)K&EqmF_-7Kumcrx^C1M5UItj>bZZ)aIaLJuXrpM>m=2*m3kFg?)Y8~xu{c7p?!tNZ@HKK$NYKfU_w3u zkTLryG1okx{#*cA;7m9EQq&v;2|11IY9>bZwr1j*Vxc9zDZVL0ib>2^4K0Q8!xUXW z9Z1ifl=%3>3^m#4cpw1E4?I*-!Hyx$0WL-=#@=@RW}H%-dQ@_J21a~>dRUxFe8HY_ zLXu`=e2Oxt6j?+CO)frFF*O#Du;cV#vuF=bLq0k#DT*{IPDLXVh}jK~d`%h19t_$K zCm}uV+k(-LP(tNXh9S^6jbth(56x2a{}IJrE{Bnjo}~3lI3il^g*+gikKR%xmzk)M z7@we>psW$-4sD7hYl_^uI?CUR7zkH-DHx4SfW3#@v}I|JP{Af_>iiM}A33$(g4y zPH)Od-IXV7`*-wo-nFMPPH(u6qs%PZ_tMEfsW(Y;w`d;>)Z5yH_lo!6jrYGkl8f7{JOs6W8Yn_zO#p9GZ!ODiW<#}X}-$U0T zaM(`sdQlb1%iLQx?cxpHhIA<2ZlgTgU^zMf934_2p89z+3sAD2hwSs~8Q=eUl<9*g zm|TGKUMcepJA56DtA?<* zn(`D$c##)z1-}|U$@Nq57BzUzzESbe4W~rAbrCe{SW3x8(yjjAZ^Y z4_X=i!Q|r+)bH)6)*W``4I1TSYBk_Fj3wtCT+mR+?+=}^Fxfk%MGVwHm+`Bgq>@@i zt%SwjQ~U-tcfk_A>0dE!+ealEF@LA5?xaCDEr;O!Vyxa%&fjN@TB!3PW59prhChou z{*=>gY;fBlxsS*(iyI2(wLhok@LEMuq?_ALaKU<>g!)kLk~zJ-(Kb;j$qzgM+Y`lH z3GXX#s@iG`-ZxMUxV*|fH(hCL!M^ZJuqS|3eeKYJlb9Ban zQug$W&;Ku2$fI&o&I@YYTaA^!vlUt37Ad{(Lla3-*e9-;pDa!tkSZ~UH(|{)Z|x){ zk{oQht1gun6Y>B}g(vCi zLNKPJXN+kH-($p;aSmwee=gDZz(cNO@z2xR;kwE%e1YcUJ|uC$@lGrnPY zP-T?qAc~##!OjS9b5TAeC)+JOO=kGqoP}O8X0vyn{02V#WQvTIG7CDgV97va?-D&1CJFp^_N|yqrPq$)A(363c^fd8| zb~y&o=R8VWnFhyd#T+3r)L|*ic|}gTaWwtg7c!XOQ9WLXdr`K8t)2M$vNkygJq~fV zgEI(B#{xJsrvj?CG`ED!(R;K7FrHA%ZhCoc7y@JXH&KVVG)&ZkY4E9p7+9=!IXLU- zaeV{TLRJ?sVCak%B3W?{3+jr=%(jH^&L*Q&@&2_;7^BAAnC{BDgOR>4;_t}}POvOGpigfMPJ^@tRdX&)j3jRe^hQ+Lyrr13!;b!% ztr6td!RbpjN2DnQ*ij`2s7HT>-geck`)m?d=(x;K$p(K$5Cn()G}GGjT*RjPvKC*K zrY)QWmVNz=9CU!~>@G5RQU0?o{$$<)*=+Fesh^JZ(v3UShF^j~eWSwP7#1bTyu>pd zA`Y5*+vNs!W&EB-(wy3lI8wurju6dD(v2Gogf^bG!jW<6oeXW`@b-Pe`$P|twDazt8mGNSD<|<^WmZ43v zyQ0jtc(Dtyx71eNX_w#=3dkRFC^m7o-6I61mf)1`UXYTgRi?n9M;4vD8%3};nlkUJz-S9l1tihj-$MIO3>dBgOL0}+xYw5UVtY$8W zB;9L88AhAzG12?bIAq3o{#G=g`Bx)6a^L$&PECHEWBP+O*jk!&PO&Yxsc?uyXL!4@ zpnR)Dm-BkaWt)AuAnv-4`r}6L{3o|CDATN>I~`UwHQ|)UG%WZL%zAeYkf#pKyx!-n zs5KdALjPLvZJw70g^1eFa1P9wweE-w0XsW3N{Z``dyXfa>r4$1LD%qbA@s$2d|2d7 z^)MIy>ROS{FX26X>YRjxuuj4@lE;>`m+SLT2^DEArFU)9`7XnLD5oL?Cn7qo)y z>ck4C(4xISjsGB1r6pHM3E1pA)4Ki~Vn~6!K@I~v4UIvJy#*LaaX21^VWUb8-x;QpT#a9n@Exqy!G}Qnu-LVVcCrlC6nRt;J-|D@kBj;hU)Uug#DFO(WCg57pNW zd9QNK+JR?I-*apP-OM$$w(rpto26|*g8@xth-{S<&e(BkJDCfH^l4P^C&p^RpgK+h7oK!lU==|u;CZ1Uu$l7NI~ zRMc@+1$4e;Zwe(FQP3A=sE(y@m~4w^fl9Mk6*=j90|9vR*Gdd~`Oin=M%5&$GrRN{!)#py|HZ&Nln3w`hXimznE9!lb zbM^Va<{=-}tcgJGkHqrlA)0>_-UBKw*~R94H&b7b0Xvg{fO1p)H2?n2Xoi}fA1!h& zp&VycHYIC=A?GXsL2IcteK|$amS2s_6Kq@Z#;>pcf)hJ&C;=rda4AKO#+#^9%1L*D zyW8&s89R+Dt^Zl={=v_iZ5HIKs}!82ep>KK)>6MXe1@bYS7GK0c(*Q{j3rETfP;Ld z;2|=0)aNSEp?0Bjc@j>W+YRZ;GxqhycsvITm3wDF)*yE^S2wx$fHNBm%MGPpV)!@j z(cVlg^rPGNwqtuQ&qmkUE$hJVk0vnh#8-Irrnc~TI>={Nc;mbcQS{GyN6t6Tuams* z6pvp2xQ*kIpMUNf>zMW|!c)oQCiC{g-Sqc-;rlgV)n(HRN`8KlSv!EbL)(LQ(Z|Il zU91uF-Z>snj<=b-3>w__eLwTfvpV=CXMMSEv<_omwmKM6PMgP5RGD&zN32)_pKsxb z$!H<;4WC%40)bGMhpAEnUtrU_xI}~fwqBX?%TuCs7vFbZ!2nklB64J2MU)JgHpq<-a1IkNM9-0cZz` z(hH+G_R5q|m|3_0!~{v`72so-kp(|_r!AW~6&Ud99sz*{IUn;J!(`l0!~w}mGEM?( zdO}WA!qy}OW5_dIsbP4Q97Brz%29+}mF ze%0KB?t*dm>orY)X%o9*u_6$sZ?K?)v;&rJF`I{PRKQaW|CY!tS$PpHEggrGRiv z`biSB-&bf6N}m>3_I_GW3fNVNs1rwPFD@M+`G;C5?uRm;F7tG0m7n*j%zqOE4{M>r zMhxSWhe^tySN6cKZhG0$+I@yUe?OoOo-{(iW8_I=A_!G{u_sBhxuxe+{m_q%RN=KfS$mTvc1wHVlGNib$$RDUHDH5CNqWkVaZ?Cm|)> zC`e05Nh;kf9fE);C{VmQp&+{Jc`}qCyzMl1Cxi_xKUgMf0t}*AHbF9b! zdb|A;V(rf@5Z$EGg6SiV#DJOWM7KyCisiJ;6S&1o?sp=8=E_F`x|9pB_ottyQp2*P zJc*R#QpodmjGH?%+ZyKgCVhD zL$Xtbs@g*rYPi>ay00;{KT2#)ex@H?h-P1gcNLGPwhH~wGwXyJHgqjpLR_pXO||n1 zIbCWMbc*Y}m~w&py3~5r#2tY(i0JZeV!N{~JFH!l=MgpLW9NSL^6OX@oBd9(;q87t z*!LD!F0~G<3fX#Wq~W_zrez=2`}?d^ea&6Sc^`m?MTbd5hj0IQa|Za427Z}G_Of;# zU0ULdXhJp&adX5v)%(2^AH=73ehW$a@QoF+Mdo>DeSl>7>+K8Tl?MjE+rv>%2s`Uo z7i-*1V{&FN`<~89*LS#+aG4~g_EGBB#J!1o=Ickj7uruJZpbHd^a7~ts7-$MXqZI* zM12;?>poMqLYeXn}u@DI@(qi4|OqcX(%xXYmKONJA8}H9f-hoA;7n}9^ z$DOl&@qM0%Mo$F8o-y$A`4jMqrP7A)AD7yVn)h!=B&FrtEs(Q6o#q z?`Q4YIe~TZd%B+_2Gb<1EB(}WnkvS$pGi*TI)8mUvNz80g@enzxwdOlo21(lzAQFS z6bU3h>-T1+@OBDE`Hy&6{65uHTI8b2eRm4p?R)PSfkfI@)x#%f>9 z8Xt0y%4>A81E8hC6P{_FOsI{a(7kjwrk_?epGoc6md&iNO8hx0M~U^a&y;o5*GMNa zQoYsifaw~FLDzT#m~Ex0r^fghZo~H+5!Ry(8TueA;&SQKj;&i3q{ojYeH zmN~V!Q#q!)HyPXqr&{Up2cgy*djz|lYV~{WxKyo>BP&2Uk~9LYdwJosJ9Bw)TtiOXYXZw4Qxq3Q*o%CE?Dd&i9Ri1?(Tex8VLp+SL2 z^)yZUwq6x^U4auH#SoiU$%yqqMV@+HJ+c2%v;l8(>>Is&qBgZ?qOG^l2Ni0wTW3X( zTFJy|wsU#0Rib%v!baJmU&^Y>H1l=6t_T?k=+RQ3GlQ-ydZ};~+!J8BXF2yENGRQx zuY}G}b%#aVNpYsIM~7KEK=!rTy+TR{X}$o$>sX`gg1ZKA4h{}SV(W4xKW{H)%WGpy ztp@eL6W33jUafQ$MJCCWagsu-#qh=2EymBE*rPv$ZyZV$gz6TnD^8vd6OAB7UvFP) zQNvt;iZLX(Le%&Na?fzUbGTZuI68M1@g$sYQev-mJ5Q?`YY0nC#!TG3`ysg@W%|85 z?HBUYcx)NP@5pG#x)B46Tifl<5!LQ*lYP*|{5eal(4?|{@<$mSN!{KTUY#nS z(#h^aA;B1CSov~G4o-JUdA7=9fRErr{&kOAWJ0EQ%I$PKQOW~`={EO2MOTRs;kA3~J7s4k@f-}VJfwzz$(T73RPQIU7kz%DXOEwf+q;uY~I z(9kobV9hr%Ys#-&qOB^m#vV`UR-?+t5;e-$kYq9JrqB+PoimO+gyE5WbG}>s%`994G>gY z;PrY*Ugd(XB-LzEMoH7Gmi+|s8#&+mFb2^RyR`CLm4^3lv6SPD_(w-5NfYuJ~gFQr11fozD{xT-ZLxs~hhkYg%#g4%OKooFkzTW?K%G0^RKD&lf!4GZN_z%a4}W z)WvL;#f7X~{p7Rjl){vA)9&3E3tNueCH?g(mOCF~=6cqfKB(6quLY5Tg2=c&?Mg2tX*f;%kXU02CxG1HATT}17npxM9 zPK~UYIc{dgot#ZkXglP#xXo3pi@Pmq@J)D!ku1O*Xz6!BTBMB8p_FgcxpyqV39TtF zz2zF~aC_)b@L-0-Ei zS2T8Y@EczwigjKaLFGPjHE9{2-&IFL`cuFwxY7VW)3)r&;iQkwvw~ zMtrZH^{iz*vq80XJHxl=*&Xh>X=07o2REG0=(D1a`&YLIrfv*(v~NX|a|~t7+jh_s z%VqdR9%#X%s)3XQQq@@v%Pm*F}aJ`|#e(t82YzDh zsT*>|26~so3!dNFnvk)~=q`E?<%UKoDh4gC9h|vQ?c-LjUe*@!BUrr*8zrcCcc-`M zPSPnBfjSKe747|*3k_xEM(?$Gnb``{ z2T~)#$yc_nX9h1#e~~EMRGAPp;vXmf7p@xf%+2JGs3$ey)^%7>HSZdua?gD3p&I>4j59UVt^K05L>8!d-Gr|Wiw{0;lqFQtjowl^v{P<~2o zj3XiQQ*!5yn2I zHAt{}H|v%V zrDyoUwgNew)M8>uUy2M$GYc#~QGa)^8yE3GRo6A}>Rp!o39Dz#)sp&(g!`v_*_reN z`R|_KG`md7q3$GCLqEv=P0%)3=#5R(*>KmW8Ykl=*)_-$gi26;(6viq?y)}}uA#YA zPuVx@BRGR+>7qkfIYWZKaKVGE-}h{L5}`5axx{KW(Zy^Dnz4yTEEj!b`7Y6RYd!Vy zl#W>aagQ=r8cHvGEx%YGgdEkT&2@D%=YheNWv0eOrL3?unX=@c{Z^NnIkIR>i}++U z%j@W;$j`8|H?tStUqN)Y~6F1FxA#)Q8cwy^UUV&0MG&ZCE+| zvDKne2eIxkp;J!sf;Wyl0PJbq^Rm=^*(+jCM!Yjic+`2Rs~D{6~ z6=q<%gJ@v-X18O-THK}K1%;f>9@R`JsdU}}`L;LRO5i%J?uEg5QlS{<_t}zPacRR( zJf+R9NzL&c_YMyimtm5VBqVfHzjux7pWgB3>a?SK{c!;IJv#nzb=o1>I23gE#?3Qz zJFj}D=LQ4Y_h>yAR-Bm7=(Y*{z8Jn-`ia6!a{2Rl|4;TqcSB!mQ^+N+5 ze!T5!wmp?;y^FOBBlY@+tDNzXz@oN|m##L715Dmc4&fF_9B-r}8X6mG)90;T zV`g&(f~L<(NQ{*^3#Zh!ULfx*uA2 zXj~ztj?$pF zwY8%OgxDsZ@Vfta{C_rS+fEu>+PJ=^pdPeJZ@Vs~ZcAfBuc*E;tg!Y>5wf-xn4I$@ z{O(D{^r^@<`F~&J=2vx!n=vx(IhpMle-3rsFluNBgGmDJA+SxF3bA%iJxK90L(ofg zw|D9ima1wO@Lex^(mvEiHm4=@jJ4H1Yo^Y+$fXH?zb#v2=F8SgvnSY+jn)dN+D>=o z(el5+L{7sO!_1UE#iM;${zi{6GfPYcGZ&T6BcC<(_Wg)QhC<%&TEsHa8h)zUt6SSo zI;+YyRJIE#d*{-f$bIK$CL~wlefBchXG)E;0Ukx?Rzlvt&pui7XtH&Qoc(IF!lPhi zg{#W;PyEPj;+}c6i(NTMRYLuQ>IT*H2gd8GKZ>NIS$yBcXkiuPz0#=_*A%TQl`kff z#H=yWDSR6CyGXq4fN{*E)FGvtzTdWjLq_D1U)4JCp}FY#OLg^$_!sJNWS`%kOGt=| z(TR*b`yXrJLfKxKj5Cms%$bvrV19eP^4Bi#qnjNaM>jq?^6zcyvEHKZznyS`{QMiP zA||9FqrvC>uWorfwJ3VZ65#*X z^kBGIqeP9p0aSDb`tnNSi%|2nhXD{jfyM^0=kgs%ahl{7>_ZPZ9u%F`dGTYK;j{+{ zoAb-&uE^G|_0zaZ;{u&4k)1yxS#;(*!7VJ6-xc+%+AmYx8d-<(7~c1;eRInBWR}s& zbSNmke=}0(St>P%?Aqq`8s)rd!@^16xhoV?4o@>@&aXcqK;zA&F7KXdeSuYY{Qb7N!%t4% zngkP{XGLGGr40{Cs~zZrTTYi}tbbzfaWWFyx|HGeSN zJ70squ^@LWOY=I_i#;_%DxL&Ld$#^$_Px_Kh72Exm31lVJx;>u(YPMIiWt)u2BYnE zdEIr*LVR)TgWAvee02$@!Ee{Az9EM2#ytFQ&nYz)u$0npscXwDUZw|Xuo`fucxV3z zA3E&~{qQp+%uVvgYzhKiPWP&nUqh5GW9ckmj$E&bYW6e(w>kyJjJ{M>Ljx5oY&=cwfZd~qGx%W77;!2lr&A|DA{IW8x0{mMJ}jHj zM>xPQ8CZg%qTyZUzG4gVk5bbvUC{}l^+>8DD7|_i)L5n zw`Tm2&#Q~FUraT>2~pR*7?3o%Q?`zy^t_V?64@8LeR%Gf$7yHJJH?{{>k?8f7d3?U zQExa}yT6jnvV^UF=ikmLVe*k^NR!`5%LJ#YJJc*F_Poys7B!;wi?voLWl`SEO~w_syvfP%Fzc7ZB5*MuTb zYeMU4ckd&Gu;$wPJpK<0PXT|Wb{8~)5cC-e&MvqcsKVQ+JJzI*U)J@uWR_igR{_t3dsGz1Q^sB4)_odkw9j_# zVE4Y)cVxsTMo8W#wkx_&qKYuTT7i(oO30`{;6=~~l{m{4u|^N@d! zDLx=oG-3C#3>)F!c~2w4MIB=x#X83W3yls7D{KK?=WZkAdKD>ec~HMfi&l-+kqSzV z{&b?P=g9GxPdISVLobGSd^>zaqgI)}Bt>JwqDML4!~98vd;P4AlmKJ(5rTNPmqg?T z`V{N;kj>=kr%K5@k*hLe{MjnqnUbQo3Sd?BnY~TG{H6mS2p(!hNy&`+Y3wr%j{ z`brr+06+d*+e1ZOxC<}l+NOUe@qKr|!iD~wOBQ*Fe~0;lXAJz|%;Lt@p7$f3cUi9o zHM+jf#L!dvh>c=T=*m16n79JeH5i0GIUuFNQwa~3jpLD$-E2Qp*p(;$5{pdik97LfCwp{M9Amc(0l4YOpbpa{Z>+d|OV1 z$dSDc0ii(DTWdG6(DI6MMf#2yrF&7!){H3-4VF0T9gDPHs3J=pKe_L-`Diij&^@e> z$K|BI4*IbixazNX_@p|vE@;6{Tad*269v_*DG(@fDLt8n4ju(&-L;Fa$SD%{@yKqe z@i@AbD{!mAM_Mn`&)J_%#4XEP9h^+o;1J6IjJ}Y|&CzqRTQdE!*_ki$cX`xidib18 z@7QDf=c~@3w03ElwD0^hw*0JdUgGrK^98AMp3>J^G%nwa-*FNMxNzpy*+pewpG;4mB=Q+3i@BXBVs+ICwcaAt6=y0>YK>5>i zi7N^?Bd@+#2~i-t-?UPHDo%CHTUqylthiEujQeB%=CphFraGY+-P3Uj^&asv&b|Y0}y7eYwfCRoYYrP(W%@-D+ z=40nt+zydEY_NXaBctIn(#-j-d3*%lEotU-^G` z?C?H3Yz1wONj#e z;%arp)ynVH7NVr0#v56&g_|>xizGg0A9QEA`jH>#zq7YP)l4@BZ111v-dJ&Oy%a@6 zGa|Pib)Wt`?WIr}BV$@F4c?3-q9YA$1G}Hn2MB(={edQ$$S86*Zc^1WnuhU)KB@QRFC+6=`X-IO`+#nTv~Gd}7d8U-=R(U=0> z-|l=AS#@Qc_6xM(Y|T6N8d4roS; zL-3Qwfb`}7%?~nJl_+Y)eObj)aZSO6lTp-9>b6v~i&#oD2c(_NMe(N5nGToVj53N7 ztO5^G(skLth#e+vc3g3tmL3!fU057x{I+JBD4C}2Qtq%>V0f^TmfXoSy)oG`DZBrp z`BMdC*IC?l6qVik@l{f`rkxyq&b|pY_w_=$-EiFA!u|O*&3Xe^PDc2kz=dA9?Mm~W z{`C*K$xhg`=+8kbPJ6Gkt`(l&NyZ>PtYhj_A?p=DypT4Z=zo=CS(tVuT7_3nP^WvX*{i>Bp@(*Vb&7 z=gbHv_0P+d{p`3{B%3rf;`4dXxwm|@dpu?GVu*F~bvjS9C~pwB$n>>LyEO^Ef=)x?K8OUiYJz2L~rfIiR>T3$}Uq4TefH>>vhNK zZ%7rJB)}_MnUWk*BIZSG*JWEnhPJLXsj{iQ5MO+0dE(tHlXb{m$Z)0)(l=XQQLO^| z#An%&Q0j)y@0I(gwIU9C26s*rh)S}Ks40I!`z4_SbuuyEc0bQhEH~CCP&jD2+?sdd zdO@$nw}SZUNh^IBInVpy$ndUUXwswM`(oET`C5uU8()kH3=5B7x`S(_dSg8wlhRSh&N=MuhNu%51(-A z3D<1>)*oB0XX`-E*Imh~J?s%c2Wh?l6)~S6M+FE-aJXD;4FJ zc!ga0lC>WG>`*RU1+pJsSLKp;&Y7>H%6+r7+N$~T9z`(mB*SKE=K@)yfZbiHXX2|p z?I*P77M z_2stf+F2^h^4Gt#-`$!N_u+m(J-O8WH0iRON|)G-TL+ml?ZNr??hjM^JQKm^4R7_D zTuStKW;0yoOp3ri;>HTrldHIV!!6)8SGhvYS>4C~;NE3&qkpJs+1&F^>ZDTb;kiAs zXHrin-6kxx82aBeN@~r-)-Ni1a;xxpK2l*|@qR4HnHfNn(7ais{FcGfRr7J3`2H}-ci*-yZ7}X9pnIckE5S&=A|rI6 z)9(2<0*$^NtSw}^QD+RiKaLHp*{lSA0lZ!ycl}P#vh3}CuddJ4yhGl3l_55| zjok%iioK#H5##cwm!CQYDPFQpynDkt!P@ST!_>RstJ;dZuWa*TSz^C;IrlD+lx@*y zVQ4qrf6uHk28BVP#>SlYJBAMq@|I}bwX$lYMdwa(nzzU5-%k{Y|5*A~fN})$n%Txq zhmPW8a@cN(n6X50N6~i4jFTDTgAMg^t&?PvcXH>|zGOXO7Pma>CR^1{KX7d&l6AX; z>h`^DuPh!YG)~qkixV&8+;{?8L>|0mJ*D;BFaJSAt zyr4021NKvr=~d|i7+pxQSZ<6;^7n@#@#T|`8%)Gt^%QEZY3-*6c61x`_HACi6}Hu# z?!)3Ju6|wF%fquB++-f>)4I-dZXi+UdFMbCUDjC3lf0eehb~&hFT1rKF(7{X-l1dkzQ!RF?E?Rd?@8WAN^U}x9BgAP<3i6v zPdh#~y#)#r)`Z@I7r#v3)qV-8BmLCTu?(V&$tZHm!@*F^=uYqKpYj*y*jnn&e*lL3 z_9$(KPl9bzR;02d&i7MIJm2HIu%8?YDZX7Ek-B*)koA0W2aSEgjF;%Lk;dnZHpd%uRHrpN zW~5ICkEG=%1B^6bkoBz?Y#djq`v4+R%NNSm;-qEs{36$t>wKZ1r4MJz&oCG`Q1P?V z`^L%hy;ffRDO1d7FMqyJywJ@f7fd%wwQ{2_wm0bpwv30{=LaWHoOJ%PY%?D&16;my^}d z6j72ps+;_upRz+K;1;(P$U3VfsO)0uy`~KjzmB(ATSX{#KEyx9G-}Q;Xy>R90G>ML*N7imOy~wkT5g`M}Xm=L^y;9$Dx0%(KxMa|8}6H1QCSA;PFJ_ud$tZPNtj$=x_-*k7MJa{k_<3-If+sJ@P~X3=M|D z0oOti;0PQBh5$h^I2;TNCK3r?3=B;q5b;O^0gu9h5l{>fg}@Qv1Ol80s1AjI!Lh%z z(Gf9Txeov?5a6b{$MhC|_V;7cw6``V2qREXG!TZMco-CfgCo#b2n?`5z(~PJFkqKJ z%z^^(1ckz45D+jPjz%JZegFf;iw7NP6aPzayVuc`M-F&&9tS6L?q2}+hgHJCC=d`v zVPGO21V+MP2rw23#}Gg`Gy)AKfKXT%hJb+s4hKPl;Y1V^h@nIX4u`~mi4XuV?w82rLwYhk(#9H0+nq&ON!NaM$q!$;2zF|9}>2@%y0J z;mu94!r(th6wm<#jRAv!IDrJhArc0Je=G!nM#7)~xuKx|ae@I-1k4Z%1A)LGG#(8B zSQG|>65x0w_}82e+RBhJ2ACrS;BUppwDx|I?03aU+drWJkx~X@NBApTVvm>`ND>fO zfC~^P0t!KZ0fq`EB5+VB0RqRP2}mRahC$~=YU=)-90tg-mM?k#A0a50cj)*4< zRdWSUdH`qTF;xo9|C=Z^2^QAoN2ZGh!+@9x1?&)q1Oq860t3PmUZK4FWXKtf!xsJpq<5^0O>uuY zCJsylj1vThqmXDcfdIr%G!Y8}s2l))Ug$NahUFJM%%va~YA{{<3(gWy02VB~>@;^0JJ7y(A1;6UyI z0(6Oo0-Onu1Ox#iU_n62gGB)9hJgrRFa!qBK9H^>eyK>wFJvdw0Y&Bk#Ujg&De}td zzW`F%%2L+C+Rphem;?v}iz6VwXbb^zl*a&mi2z~{kbmN^a10b+M;I0g#3X?55kQgy zWCK91jmF^NKyHdbLw?Qv)!&Uoe*j*2q|fqWFb&rK1(+HH3sYkoD|_p|aH23s6bJ!D z0AnUR8ifaPH5g#GC@6%0C1Ri;fK)J8AkQH}Avhui0t_etQpLf5!4(P^T>|F)OLdY` z#h*R_sFM-Ed7Lj{KsnIgH2D2Le5q+_@jrYCa2~)B0GD8ZKnjE#6b6Qc00Slhz#%~3 zB_Odt7Kg*3fMExa`5=&36c`9P2po{b0`3a=b&!?lm1_+HAO-^#TX9U47k>T=5VbJo zrg)5nlxY?#J%$knaCfxc%=bpPq|nZe%h8y@UZWjAODu4}X^|N9&0HTarYi)5mLE zBqWlbNl0{$NrGo4{|)|k)GL3ipZjl7M%StLJ_9mF02FO>OcVjsZxZFt71l=+V*k`P zrU&;>7gqaq|E_l^k^eC@Xi^v|m5PBki+1tuT+{f ztxYBzxbPW>Yx>9JQM~s%pLO*_q~dvW&O?PFeoZ0FT#`|GO|(zx)ni z{v$d4zsu7%{=4P*N0lAl{P%Z(AfzXMLrU "compiler/daml-lf-verify/data/quickstart.dar") + quickstartDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/quickstart.dar") let tmpl = TypeConName ["Iou"] choice = ChoiceName "Iou_Split" field = FieldName "amount" @@ -33,7 +33,7 @@ quickstartTests = testGroup "Quickstart" assertEqual "Verification failed for Iou_Split - amount" Success result , testCase "Iou_Merge" $ do - quickstartDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/data/quickstart.dar") + quickstartDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/quickstart.dar") let tmpl = TypeConName ["Iou"] choice = ChoiceName "Iou_Merge" field = FieldName "amount" @@ -45,7 +45,7 @@ quickstartTests = testGroup "Quickstart" conditionalTests :: TestTree conditionalTests = testGroup "Conditionals" [ testCase "Success A" $ do - condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/data/conditionals.dar") + condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/conditionals.dar") let tmpl = TypeConName ["Iou"] choice = ChoiceName "SuccA" field = FieldName "content" @@ -53,7 +53,7 @@ conditionalTests = testGroup "Conditionals" assertEqual "Verification failed for SuccA - content" Success result , testCase "Success B" $ do - condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/data/conditionals.dar") + condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/conditionals.dar") let tmpl = TypeConName ["Iou"] choice = ChoiceName "SuccB" field = FieldName "content" @@ -61,7 +61,7 @@ conditionalTests = testGroup "Conditionals" assertEqual "Verification failed for SuccB - content" Success result , testCase "Success C" $ do - condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/data/conditionals.dar") + condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/conditionals.dar") let tmpl = TypeConName ["Iou"] choice = ChoiceName "SuccC" field = FieldName "content" @@ -69,7 +69,7 @@ conditionalTests = testGroup "Conditionals" assertEqual "Verification failed for SuccC - content" Success result , testCase "Success D" $ do - condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/data/conditionals.dar") + condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/conditionals.dar") let tmpl = TypeConName ["Iou"] choice = ChoiceName "SuccD" field = FieldName "content" @@ -77,7 +77,7 @@ conditionalTests = testGroup "Conditionals" assertEqual "Verification failed for SuccD - content" Success result , testCase "Fail A" $ do - condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/data/conditionals.dar") + condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/conditionals.dar") let tmpl = TypeConName ["Iou"] choice = ChoiceName "FailA" field = FieldName "content" @@ -86,7 +86,7 @@ conditionalTests = testGroup "Conditionals" Unknown -> assertFailure "Verification inconclusive for FailA - content" Fail _ -> return () , testCase "Fail B" $ do - condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/data/conditionals.dar") + condDar <- locateRunfiles (mainWorkspace "compiler/daml-lf-verify/conditionals.dar") let tmpl = TypeConName ["Iou"] choice = ChoiceName "FailB" field = FieldName "content" From f3bee744d06161a51c867ceb7354b3f31728e5e2 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Mon, 11 May 2020 15:10:24 +0200 Subject: [PATCH 33/50] Proper handling of update types; constraint synonyms --- .../src/DA/Daml/LF/Verify/Context.hs | 137 ++++++----- .../src/DA/Daml/LF/Verify/Generate.hs | 217 ++++++++++++------ .../src/DA/Daml/LF/Verify/Solve.hs | 103 ++++++--- 3 files changed, 290 insertions(+), 167 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 55168b060e14..840e4dbc218d 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -19,6 +19,7 @@ module DA.Daml.LF.Verify.Context , MonadEnv , UpdateSet(..) , Upd(..) + , ChoiceData(..) , UpdChoice(..) , Skolem(..) , getEnv @@ -252,6 +253,20 @@ expr2cid (ERecProj _ f (EVar x)) = return $ CidRec x f expr2cid (EStructProj f (EVar x)) = return $ CidRec x f expr2cid _ = throwError ExpectCid +-- | Data type containing the data stored for a choice definition. +data ChoiceData (ph :: Phase) = ChoiceData + { _cdSelf :: ExprVarName + -- ^ The variable denoting `self`. + , _cdThis :: ExprVarName + -- ^ The variable denoting `this`. + , _cdArgs :: ExprVarName + -- ^ The variable denoting `args`. + , _cdUpds :: Expr -> Expr -> Expr -> UpdateSet ph + -- ^ Function from self, this and args to the updates performed by this choice. + , _cdType :: Type + -- ^ The return type of this choice. + } + -- TODO: Could we alternatively just declare the variables that occur in the updates and drop the skolems? -- | The environment for the DAML-LF verifier data Env (ph :: Phase) where @@ -262,8 +277,9 @@ data Env (ph :: Phase) where -- ^ The bound values. , _envvgdats :: !(HM.HashMap TypeConName DefDataType) -- ^ The set of data constructors. - , _envvgcids :: !(HM.HashMap Cid ExprVarName) - -- ^ The set of fetched cid's mapped to their variable name. + , _envvgcids :: !(HM.HashMap Cid (ExprVarName, [ExprVarName])) + -- ^ The set of fetched cid's mapped to their current variable name, along + -- with a list of any potential old variable names. } -> Env 'ValueGathering EnvCG :: { _envcgskol :: ![Skolem] @@ -272,11 +288,11 @@ data Env (ph :: Phase) where -- ^ The bound values. , _envcgdats :: !(HM.HashMap TypeConName DefDataType) -- ^ The set of data constructors. - , _envcgcids :: !(HM.HashMap Cid ExprVarName) - -- ^ The set of fetched cid's mapped to their variable name. - , _envcgchs :: !(HM.HashMap UpdChoice - (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering)) - -- ^ The set of relevant choices, mapping to functions from self, this and args to its updates. + , _envcgcids :: !(HM.HashMap Cid (ExprVarName, [ExprVarName])) + -- ^ The set of fetched cid's mapped to their current variable name, along + -- with a list of any potential old variable names. + , _envcgchs :: !(HM.HashMap UpdChoice (ChoiceData 'ChoiceGathering)) + -- ^ The set of relevant choices. } -> Env 'ChoiceGathering EnvS :: { _envsskol :: ![Skolem] @@ -285,11 +301,11 @@ data Env (ph :: Phase) where -- ^ The bound values. , _envsdats :: !(HM.HashMap TypeConName DefDataType) -- ^ The set of data constructors. - , _envscids :: !(HM.HashMap Cid ExprVarName) - -- ^ The set of fetched cid's mapped to their variable name. - , _envschs :: !(HM.HashMap UpdChoice - (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'Solving)) - -- ^ The set of relevant choices, mapping to functions from self, this and args to its updates. + , _envscids :: !(HM.HashMap Cid (ExprVarName, [ExprVarName])) + -- ^ The set of fetched cid's mapped to their current variable name, along + -- with a list of any potential old variable names. + , _envschs :: !(HM.HashMap UpdChoice (ChoiceData 'Solving)) + -- ^ The set of relevant choices. } -> Env 'Solving -- | Combine two environments. @@ -398,13 +414,15 @@ extChEnv :: MonadEnv m ph -- ^ Variable to bind the choice argument to. -> UpdateSet ph -- ^ The updates performed by the new choice. + -> Type + -- ^ The result type of the new choice. -> m () -extChEnv tc ch self this arg upd = +extChEnv tc ch self this arg upd typ = let substUpd sExp tExp aExp = substituteTm (createExprSubst [(self,sExp),(this,tExp),(arg,aExp)]) upd in getEnv >>= \case EnvVG{} -> error "Impossible: extChEnv is not used in the value gathering phase" - env@EnvCG{..} -> putEnv env{_envcgchs = HM.insert (UpdChoice tc ch) (self,this,arg,substUpd) _envcgchs} - env@EnvS{..} -> putEnv env{_envschs = HM.insert (UpdChoice tc ch) (self,this,arg,substUpd) _envschs} + env@EnvCG{..} -> putEnv env{_envcgchs = HM.insert (UpdChoice tc ch) (ChoiceData self this arg substUpd typ) _envcgchs} + env@EnvS{..} -> putEnv env{_envschs = HM.insert (UpdChoice tc ch) (ChoiceData self this arg substUpd typ) _envschs} -- | Extend the environment with a list of new data type definitions. extDatsEnv :: MonadEnv m ph @@ -425,11 +443,16 @@ extCidEnv :: MonadEnv m ph -- ^ The variable name to which the fetched contract is bound. -> m () extCidEnv exp var = do + prev <- do + { (cur, old) <- lookupCid exp + ; return $ cur : old } + `catchError` (\_ -> return []) cid <- expr2cid exp + let new = (var, prev) getEnv >>= \case - env@EnvVG{..} -> putEnv env{_envvgcids = HM.insert cid var _envvgcids} - env@EnvCG{..} -> putEnv env{_envcgcids = HM.insert cid var _envcgcids} - env@EnvS{..} -> putEnv env{_envscids = HM.insert cid var _envscids} + env@EnvVG{..} -> putEnv env{_envvgcids = HM.insert cid new _envvgcids} + env@EnvCG{..} -> putEnv env{_envcgcids = HM.insert cid new _envcgcids} + env@EnvS{..} -> putEnv env{_envscids = HM.insert cid new _envscids} -- TODO: Is one layer of recursion enough? -- | Recursively skolemise the given record fields, when they have a record @@ -494,13 +517,13 @@ lookupVal val = do -- | Lookup a choice name in the environment. Returns a function which, once -- self, this and args have been instantiated, returns the set of updates it --- performs. +-- performs. Also returns the return type of the choice. lookupChoice :: MonadEnv m ph => Qualified TypeConName -- ^ The template name in which this choice is defined. -> ChoiceName -- ^ The choice name to lookup. - -> m (Expr -> Expr -> Expr -> UpdateSet ph) + -> m (Expr -> Expr -> Expr -> UpdateSet ph, Type) lookupChoice tem ch = do chs <- getEnv >>= \case EnvVG{..} -> return HM.empty @@ -508,7 +531,7 @@ lookupChoice tem ch = do EnvS{..} -> return _envschs case lookupChoInHMap chs (qualObject tem) ch of Nothing -> throwError (UnknownChoice ch) - Just (_,_,_,upd) -> return upd + Just ChoiceData{..} -> return (_cdUpds, _cdType) -- | Lookup a data type definition in the environment. lookupDataCon :: MonadEnv m ph @@ -525,11 +548,11 @@ lookupDataCon tc = do Just def -> return def -- | Lookup a contract id in the environment. Returns the variable its fetched --- contract is bound to. +-- contract is bound to, along with a list of any previous bindings. lookupCid :: MonadEnv m ph => Expr -- ^ The contract id to lookup. - -> m ExprVarName + -> m (ExprVarName, [ExprVarName]) lookupCid exp = do cid <- expr2cid exp cids <- getEnv >>= \case @@ -554,14 +577,13 @@ lookupValInHMap hmap val = listToMaybe $ HM.elems -- | Helper function to lookup a choice in a HashMap. Returns the variables for -- self, this and args used, as well as a function which, given the values for -- self, this and args, produces the list of updates performed by this choice. -lookupChoInHMap :: HM.HashMap UpdChoice - (ExprVarName, ExprVarName, ExprVarName, Expr -> Expr -> Expr -> UpdateSet ph) +lookupChoInHMap :: HM.HashMap UpdChoice (ChoiceData ph) -- ^ The HashMap in which to look. -> TypeConName -- ^ The template in which the choice is defined. -> ChoiceName -- ^ The choice name to lookup. - -> Maybe (ExprVarName, ExprVarName, ExprVarName, Expr -> Expr -> Expr -> UpdateSet ph) + -> Maybe (ChoiceData ph) -- TODO: This TypeConName should be qualified -- TODO: The type con name really should be taken into account here lookupChoInHMap hmap _tem cho = listToMaybe $ HM.elems @@ -616,54 +638,55 @@ solveChoiceReferences EnvCG{..} = in EnvS _envcgskol valhmap _envcgdats _envcgcids chshmap where lookup_ref :: UpdChoice - -> HM.HashMap UpdChoice (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering) - -> (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering) + -> HM.HashMap UpdChoice (ChoiceData 'ChoiceGathering) + -> ChoiceData 'ChoiceGathering lookup_ref UpdChoice{..} hmap = fromMaybe (error "Impossible: Undefined choice ref while solving") (lookupChoInHMap hmap (qualObject _choTemp) _choName) - get_refs :: (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering) - -> ([Cond UpdChoice], (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering)) + get_refs :: (ChoiceData 'ChoiceGathering) + -> ([Cond UpdChoice], ChoiceData 'ChoiceGathering) -- TODO: This is gonna result in a ton of substitutions - get_refs (self,this,args,updfunc0) = + get_refs chdat@ChoiceData{..} = -- TODO: This seems to be a rather common pattern. Abstract to reduce duplication. - let chos = _uscgChoice $ updfunc0 (EVar self) (EVar this) (EVar args) + let chos = _uscgChoice $ _cdUpds (EVar _cdSelf) (EVar _cdThis) (EVar _cdArgs) updfunc1 (selfexp :: Expr) (thisexp :: Expr) (argsexp :: Expr) = - let upds@UpdateSetCG{..} = updfunc0 selfexp thisexp argsexp + let upds@UpdateSetCG{..} = _cdUpds selfexp thisexp argsexp in upds{_uscgChoice = []} - in (chos, (self,this,args,updfunc1)) - - ext_upds :: (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering) - -> (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering) - -> (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering) - ext_upds (self,this,args,updfunc1) (_,_,_,updfunc2) = - let updfunc3 (selfexp :: Expr) (thisexp :: Expr) (argsexp :: Expr) = - updfunc1 selfexp thisexp argsexp `concatUpdateSet` updfunc2 selfexp thisexp argsexp - in (self,this,args,updfunc3) - - intro_cond :: Cond (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet ph) - -> (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet ph) + in (chos, chdat{_cdUpds = updfunc1}) + + ext_upds :: ChoiceData 'ChoiceGathering + -> ChoiceData 'ChoiceGathering + -> ChoiceData 'ChoiceGathering + ext_upds chdat1 chdat2 = + let updfunc (selfexp :: Expr) (thisexp :: Expr) (argsexp :: Expr) = + (_cdUpds chdat1) selfexp thisexp argsexp `concatUpdateSet` + (_cdUpds chdat2) selfexp thisexp argsexp + in chdat1{_cdUpds = updfunc} + + intro_cond :: Cond (ChoiceData ph) + -> ChoiceData ph intro_cond (Determined x) = x - intro_cond (Conditional cond (self,this,args,updfunc1) y) = - let updfunc3 (selfexp :: Expr) (thisexp :: Expr) (argsexp :: Expr) = - introCond (Conditional cond (updfunc1 selfexp thisexp argsexp) - ((\(_,_,_,updfunc2) -> updfunc2 selfexp thisexp argsexp) <$> y)) - in (self,this,args,updfunc3) + intro_cond (Conditional cond chdatx y) = + let updfunc (selfexp :: Expr) (thisexp :: Expr) (argsexp :: Expr) = + introCond (Conditional cond ((_cdUpds chdatx) selfexp thisexp argsexp) + ((\chdaty -> (_cdUpds chdaty) selfexp thisexp argsexp) <$> y)) + in chdatx{_cdUpds = updfunc} - inlineChoices :: HM.HashMap UpdChoice (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'Solving) + inlineChoices :: HM.HashMap UpdChoice (ChoiceData 'Solving) -> (Expr, UpdateSet 'ChoiceGathering) -> (Expr, UpdateSet 'Solving) inlineChoices chshmap (exp, UpdateSetCG{..}) = let lookupRes = map (intro_cond . fmap (\ch -> fromMaybe (error "Impossible: missing choice while solving") (HM.lookup ch chshmap))) _uscgChoice - chupds = concatMap (\(self,this,args,upds) -> _ussUpdate $ upds (EVar self) (EVar this) (EVar args)) lookupRes + chupds = concatMap (\ChoiceData{..} -> _ussUpdate $ _cdUpds (EVar _cdSelf) (EVar _cdThis) (EVar _cdArgs)) lookupRes in (exp, UpdateSetS (_uscgUpdate ++ chupds)) - convertChHMap :: HM.HashMap UpdChoice (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'ChoiceGathering) - -> HM.HashMap UpdChoice (ExprVarName,ExprVarName,ExprVarName,Expr -> Expr -> Expr -> UpdateSet 'Solving) - convertChHMap = HM.map (\(self,this,args,updfunc) -> - (self,this,args, \(selfExp :: Expr) (thisExp :: Expr) (argsExp :: Expr) -> - updateSetCG2S $ updfunc selfExp thisExp argsExp)) + convertChHMap :: HM.HashMap UpdChoice (ChoiceData 'ChoiceGathering) + -> HM.HashMap UpdChoice (ChoiceData 'Solving) + convertChHMap = HM.map (\chdat@ChoiceData{..} -> + chdat{_cdUpds = \(selfExp :: Expr) (thisExp :: Expr) (argsExp :: Expr) -> + updateSetCG2S $ _cdUpds selfExp thisExp argsExp}) updateSetCG2S :: UpdateSet 'ChoiceGathering -> UpdateSet 'Solving updateSetCG2S UpdateSetCG{..} = if null _uscgChoice diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index c4616ba6c61d..785a4f677d90 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -11,7 +11,7 @@ module DA.Daml.LF.Verify.Generate , Phase(..) ) where -import Control.Monad.Error.Class (catchError, throwError) +import Control.Monad.Error.Class (throwError) import Data.Maybe (listToMaybe) import qualified Data.NameMap as NM @@ -114,7 +114,7 @@ genValue :: (GenPhase ph, MonadEnv m ph) -- ^ The value to be analysed and added. -> m () genValue pac mod val = do - expOut <- genExpr (dvalBody val) + expOut <- genExpr True (dvalBody val) let qname = Qualified pac mod (fst $ dvalBinder val) extValEnv qname (_oExpr expOut) (_oUpdate expOut) @@ -140,12 +140,12 @@ genChoice tem (this',this) temFs TemplateChoice{..} = do extVarEnv arg argFs <- recTypFields (snd chcArgBinder) extRecEnv arg argFs - expOut <- genExpr + expOut <- genExpr True $ substituteTm (createExprSubst [(self',EVar self),(this',EVar this),(arg',EVar arg)]) chcUpdate let out = if chcConsuming then addArchiveUpd tem fields expOut else expOut - extChEnv tem chcName self this arg (_oUpdate out) + extChEnv tem chcName self this arg (_oUpdate out) chcReturnType where fields = map (\f -> (f, ERecProj (TypeConApp tem []) f (EVar this))) temFs @@ -178,42 +178,60 @@ genTemplate pac mod Template{..} = do -- | Analyse an expression, and produce an Output storing its (partial) -- evaluation result and the set of performed updates. genExpr :: (GenPhase ph, MonadEnv m ph) - => Expr + => Bool + -- ^ Argument denoting whether updates should be analysed. + -> Expr -- ^ The expression to be analysed. -> m (Output ph) -genExpr = \case - ETmApp fun arg -> genForTmApp fun arg - ETyApp expr typ -> genForTyApp expr typ - ELet bind body -> genForLet bind body - EVar name -> genForVar name - EVal w -> genForVal w - ERecProj tc f e -> genForRecProj tc f e - EStructProj f e -> genForStructProj f e - ELocation _ expr -> genExpr expr - EUpdate (UCreate tem arg) -> genForCreate tem arg - EUpdate (UExercise tem ch cid par arg) -> genForExercise tem ch cid par arg - EUpdate (UBind bind expr) -> genForBind bind expr - EUpdate (UPure _ expr) -> genExpr expr - ECase e cs -> genForCase e cs +genExpr updFlag = \case + ETmApp fun arg -> genForTmApp updFlag fun arg + ETyApp expr typ -> genForTyApp updFlag expr typ + ELet bind body -> genForLet updFlag bind body + EVar name -> genForVar updFlag name + EVal w -> genForVal updFlag w + ERecProj tc f e -> genForRecProj updFlag tc f e + EStructProj f e -> genForStructProj updFlag f e + ELocation _ expr -> genExpr updFlag expr + ECase e cs -> genForCase updFlag e cs + EUpdate upd -> if updFlag + then fst <$> genUpdate upd + else return $ emptyOut $ EUpdate upd -- TODO: Extend additional cases e -> return $ emptyOut e +-- | Analyse an update expression, and produce both an Output and its result type. +genUpdate :: (GenPhase ph, MonadEnv m ph) + => Update + -- ^ The update expression to be analysed. + -> m (Output ph, Type) +genUpdate = \case + UCreate tem arg -> genForCreate tem arg + UExercise tem ch cid par arg -> genForExercise tem ch cid par arg + UBind bind expr -> genForBind bind expr + UPure typ expr -> do + out <- genExpr True expr + return (out, typ) + -- TODO: Extend additional cases + _ -> error $ "Update not implemented yet" + -- | Analyse a term application expression. genForTmApp :: (GenPhase ph, MonadEnv m ph) - => Expr + => Bool + -- ^ Flag denoting whether updates should be analysed. + -> Expr -- ^ The function expression. -> Expr -- ^ The argument expression. -> m (Output ph) -genForTmApp fun arg = do - funOut <- genExpr fun - arout <- genExpr arg +genForTmApp updFlag fun arg = do + funOut <- genExpr updFlag fun + arout <- genExpr updFlag arg case _oExpr funOut of -- TODO: Should we rename here? ETmLam bndr body -> do let subst = singleExprSubst (fst bndr) (_oExpr arout) resExpr = substituteTm subst body - resOut <- genExpr resExpr + resOut <- genExpr updFlag resExpr return $ combineOut resOut $ combineOut funOut arout fun' -> return $ updateOutExpr (ETmApp fun' (_oExpr arout)) @@ -221,63 +239,73 @@ genForTmApp fun arg = do -- | Analyse a type application expression. genForTyApp :: (GenPhase ph, MonadEnv m ph) - => Expr + => Bool + -- ^ Flag denoting whether updates should be analysed. + -> Expr -- ^ The function expression. -> Type -- ^ The argument type. -> m (Output ph) -genForTyApp expr typ = do - exprOut <- genExpr expr +genForTyApp updFlag expr typ = do + exprOut <- genExpr updFlag expr case _oExpr exprOut of ETyLam bndr body -> do let subst = singleTypeSubst (fst bndr) typ resExpr = substituteTy subst body - resOut <- genExpr resExpr + resOut <- genExpr updFlag resExpr return $ combineOut resOut exprOut expr' -> return $ updateOutExpr (ETyApp expr' typ) exprOut -- | Analyse a let binding expression. genForLet :: (GenPhase ph, MonadEnv m ph) - => Binding + => Bool + -- ^ Flag denoting whether updates should be analysed. + -> Binding -- ^ The binding to be bound. -> Expr -- ^ The expression in which the binding should be available. -> m (Output ph) -genForLet bind body = do - bindOut <- genExpr (bindingBound bind) +genForLet updFlag bind body = do + bindOut <- genExpr updFlag (bindingBound bind) let subst = singleExprSubst (fst $ bindingBinder bind) (_oExpr bindOut) resExpr = substituteTm subst body - resOut <- genExpr resExpr + resOut <- genExpr updFlag resExpr return $ combineOut resOut bindOut -- | Analyse an expression variable. genForVar :: (GenPhase ph, MonadEnv m ph) - => ExprVarName + => Bool + -- ^ Flag denoting whether updates should be analysed. + -> ExprVarName -- ^ The expression variable to be analysed. -> m (Output ph) -genForVar name = lookupVar name >> return (emptyOut (EVar name)) +genForVar _updFlag name = lookupVar name >> return (emptyOut (EVar name)) -- | Analyse a value reference. genForVal :: (GenPhase ph, MonadEnv m ph) - => Qualified ExprValName + => Bool + -- ^ Flag denoting whether updates should be analysed. + -> Qualified ExprValName -- ^ The value reference to be analysed. -> m (Output ph) -genForVal w = getEnv >>= \case +genForVal _updFlag w = getEnv >>= \case EnvVG{} -> return $ Output (EVal w) (emptyUpdateSet{_usvgValue = [Determined w]}) EnvCG{} -> lookupVal w >>= \ (expr, upds) -> return (Output expr upds) EnvS{} -> error "Impossible: genForVal can't be used in the solving phase" -- | Analyse a record projection expression. genForRecProj :: (GenPhase ph, MonadEnv m ph) - => TypeConApp + => Bool + -- ^ Flag denoting whether updates should be analysed. + -> TypeConApp -- ^ The type constructor of the record which is projected. -> FieldName -- ^ The field which is projected. -> Expr -- ^ The record expression which is projected. -> m (Output ph) -genForRecProj tc f body = do - bodyOut <- genExpr body +genForRecProj updFlag tc f body = do + bodyOut <- genExpr updFlag body case _oExpr bodyOut of -- TODO: I think we can reduce duplication a bit more here EVar x -> do @@ -288,18 +316,20 @@ genForRecProj tc f body = do expr -> do fs <- recExpFields expr case lookup f fs of - Just expr -> genExpr expr + Just expr -> genExpr updFlag expr Nothing -> throwError $ UnknownRecField f -- | Analyse a struct projection expression. genForStructProj :: (GenPhase ph, MonadEnv m ph) - => FieldName + => Bool + -- ^ Flag denoting whether updates should be analysed. + -> FieldName -- ^ The field which is projected. -> Expr -- ^ The record expression which is projected. -> m (Output ph) -genForStructProj f body = do - bodyOut <- genExpr body +genForStructProj updFlag f body = do + bodyOut <- genExpr updFlag body case _oExpr bodyOut of -- TODO: I think we can reduce duplication a bit more here EVar x -> do @@ -310,25 +340,27 @@ genForStructProj f body = do expr -> do fs <- recExpFields expr case lookup f fs of - Just expr -> genExpr expr + Just expr -> genExpr updFlag expr Nothing -> throwError $ UnknownRecField f -- | Analyse a case expression. -- TODO: Atm only boolean cases are supported genForCase :: (GenPhase ph, MonadEnv m ph) - => Expr + => Bool + -- ^ Flag denoting whether updates should be analysed. + -> Expr -- ^ The expression to match on. -> [CaseAlternative] -- ^ The list of alternatives. -> m (Output ph) -genForCase exp cs = do - expOut <- genExpr exp +genForCase updFlag exp cs = do + expOut <- genExpr updFlag exp case findBool True of Just tru -> do - truOut <- genExpr tru + truOut <- genExpr updFlag tru case findBool False of Just fal -> do - falOut <- genExpr fal + falOut <- genExpr updFlag fal let resExp = ECase (_oExpr expOut) [ CaseAlternative (CPBool True) (_oExpr truOut) , CaseAlternative (CPBool False) (_oExpr falOut) ] @@ -347,19 +379,22 @@ genForCase exp cs = do findBool b1 = listToMaybe $ [e | CaseAlternative (CPBool b2) e <- cs, b1 == b2] -- | Analyse a create update expression. +-- Returns both the generator output and the return type. genForCreate :: (GenPhase ph, MonadEnv m ph) => Qualified TypeConName -- ^ The template of which a new instance is being created. -> Expr -- ^ The argument expression. - -> m (Output ph) + -> m (Output ph, Type) genForCreate tem arg = do - arout <- genExpr arg + arout <- genExpr True arg fs <- recExpFields (_oExpr arout) - return (Output (EUpdate (UCreate tem $ _oExpr arout)) $ addUpd emptyUpdateSet (UpdCreate tem fs)) + return ( Output (EUpdate (UCreate tem $ _oExpr arout)) $ addUpd emptyUpdateSet (UpdCreate tem fs) + , TCon tem ) -- TODO: We could potentially filter here to only store the interesting fields? -- | Analyse an exercise update expression. +-- Returns both the generator output and the return type of the choice. genForExercise :: (GenPhase ph, MonadEnv m ph) => Qualified TypeConName -- ^ The template on which a choice is being exercised. @@ -371,36 +406,74 @@ genForExercise :: (GenPhase ph, MonadEnv m ph) -- ^ The party which exercises the choice. -> Expr -- ^ The arguments with which the choice is being exercised. - -> m (Output ph) + -> m (Output ph, Type) genForExercise tem ch cid par arg = do - cidOut <- genExpr cid - arout <- genExpr arg - updSubst <- lookupChoice tem ch - -- TODO: Temporary solution. To be fixed urgently. - this <- lookupCid (_oExpr cidOut) `catchError` - -- (\_ -> trace ("Not found: " ++ show (_oExpr cidOut)) $ return $ ExprVarName "this") - (\_ -> return $ ExprVarName "this") + cidOut <- genExpr True cid + arout <- genExpr True arg + (updSubst, resType) <- lookupChoice tem ch + this <- fst <$> lookupCid (_oExpr cidOut) -- TODO: Should we further eval after subst? But how to eval an update set? let updSet = updSubst (_oExpr cidOut) (EVar this) (_oExpr arout) - return (Output (EUpdate (UExercise tem ch (_oExpr cidOut) par (_oExpr arout))) updSet) + return ( Output (EUpdate (UExercise tem ch (_oExpr cidOut) par (_oExpr arout))) updSet + , resType ) -- | Analyse a bind update expression. --- TODO: Handle arbitrary update outputs, not just simple fetches +-- Returns both the generator output and the return type. genForBind :: (GenPhase ph, MonadEnv m ph) => Binding -- ^ The binding being bound with this update. -> Expr -- ^ The expression in which this binding is being made available. - -> m (Output ph) + -> m (Output ph, Type) genForBind bind body = do - bindOut <- genExpr (bindingBound bind) - case _oExpr bindOut of + bindOut <- genExpr False (bindingBound bind) + bindUpd <- case _oExpr bindOut of EUpdate (UFetch tc cid) -> do - fs <- recTypConFields $ qualObject tc - extRecEnv (fst $ bindingBinder bind) (map fst fs) - cidOut <- genExpr cid - extCidEnv (_oExpr cidOut) (fst $ bindingBinder bind) - _ -> return () + bindCids (TContractId (TCon tc)) cid (EVar $ fst $ bindingBinder bind) + return emptyUpdateSet + -- fs <- recTypConFields $ qualObject tc + -- extRecEnv (fst $ bindingBinder bind) (map fst fs) + -- cidOut <- genExpr updFlag cid + -- extCidEnv (_oExpr cidOut) (fst $ bindingBinder bind) + EUpdate upd -> do + (updOut, updTyp) <- genUpdate upd + this <- genRenamedVar (ExprVarName "this") + bindCids updTyp (EVar $ fst $ bindingBinder bind) (EVar this) + return $ _oUpdate updOut + _ -> return emptyUpdateSet extVarEnv (fst $ bindingBinder bind) - bodyOut <- genExpr body - return $ combineOut bodyOut bindOut + bodyOut <- genExpr False body + case _oExpr bodyOut of + EUpdate bodyUpd -> do + (bodyUpdOut, bodyTyp) <- genUpdate bodyUpd + return ( Output + (_oExpr bodyUpdOut) + (_oUpdate bindOut + `concatUpdateSet` bindUpd + `concatUpdateSet` _oUpdate bodyOut + `concatUpdateSet` _oUpdate bodyUpdOut) + , bodyTyp ) + _ -> error "Impossible: The body of a bind should be an update expression" + +bindCids :: (GenPhase ph, MonadEnv m ph) + => Type + -- ^ The type of the contract id's being bound. + -> Expr + -- ^ The contract id's being bound. + -- TODO: Make this a maybe ExprVarName + -> Expr + -- ^ The variables to bind them to. + -> m () +bindCids (TContractId (TCon tc)) cid (EVar this) = do + fs <- recTypConFields $ qualObject tc + extRecEnv this (map fst fs) + cidOut <- genExpr True cid + extCidEnv (_oExpr cidOut) this +bindCids (TCon tc) cid (EVar this) = do + fs <- recTypConFields $ qualObject tc + extRecEnv this (map fst fs) + cidOut <- genExpr True cid + extCidEnv (_oExpr cidOut) this +bindCids (TBuiltin BTUnit) _ _ = return () +-- TODO: Extend additional cases, like tuples. +bindCids _ _ _ = error "Binding contract id's for this particular type has not been implemented yet" diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index f7ef3906876e..02065ce797c1 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -14,6 +14,7 @@ module DA.Daml.LF.Verify.Solve import Data.Bifunctor import Data.Maybe (fromJust, maybeToList) import Data.List (lookup, union, intersect) +import qualified Data.HashMap.Strict as HM import qualified Data.Text as T import qualified SimpleSMT as S @@ -62,39 +63,49 @@ instance Show ConstraintExpr where -- | Class covering the types converteable to constraint expressions. class ConstrExpr a where -- | Convert the given data type to a constraint expression. - toCExp :: a -> ConstraintExpr + toCExp :: [(ExprVarName, ExprVarName)] + -- ^ The contract name synonyms, along with their current alias. + -> a + -- ^ The data to convert to a constraint expression. + -> ConstraintExpr instance ConstrExpr BoolExpr where - toCExp (BExpr e) = toCExp e - toCExp (BAnd b1 b2) = CAnd (toCExp b1) (toCExp b2) - toCExp (BNot b) = CNot (toCExp b) + toCExp syns (BExpr e) = toCExp syns e + toCExp syns (BAnd b1 b2) = CAnd (toCExp syns b1) (toCExp syns b2) + toCExp syns (BNot b) = CNot (toCExp syns b) instance ConstrExpr Expr where - toCExp (EVar x) = CVar x - toCExp (ERecProj _ f (EVar x)) = CVar $ recProj2Var x f - toCExp (EStructProj f (EVar x)) = CVar $ recProj2Var x f - toCExp (ETmApp (ETmApp op e1) e2) = case op of - (EBuiltin (BEEqual _)) -> CEq (toCExp e1) (toCExp e2) - (EBuiltin BEAddInt64) -> CAdd (toCExp e1) (toCExp e2) - (EBuiltin BESubInt64) -> CSub (toCExp e1) (toCExp e2) - (ETyApp (EBuiltin BEAddNumeric) _) -> CAdd (toCExp e1) (toCExp e2) - (ETyApp (EBuiltin BESubNumeric) _) -> CSub (toCExp e1) (toCExp e2) + toCExp syns (EVar x) = case lookup x syns of + Just y -> CVar y + Nothing -> CVar x + toCExp syns (ERecProj _ f (EVar x)) = case lookup x syns of + Just y -> CVar $ recProj2Var y f + Nothing -> CVar $ recProj2Var x f + toCExp syns (EStructProj f (EVar x)) = case lookup x syns of + Just y -> CVar $ recProj2Var y f + Nothing -> CVar $ recProj2Var x f + toCExp syns (ETmApp (ETmApp op e1) e2) = case op of + (EBuiltin (BEEqual _)) -> CEq (toCExp syns e1) (toCExp syns e2) + (EBuiltin BEAddInt64) -> CAdd (toCExp syns e1) (toCExp syns e2) + (EBuiltin BESubInt64) -> CSub (toCExp syns e1) (toCExp syns e2) + (ETyApp (EBuiltin BEAddNumeric) _) -> CAdd (toCExp syns e1) (toCExp syns e2) + (ETyApp (EBuiltin BESubNumeric) _) -> CSub (toCExp syns e1) (toCExp syns e2) (ETmApp (ETyApp (EVal (Qualified _ _ (ExprValName "+"))) _) _) -> - CAdd (toCExp e1) (toCExp e2) + CAdd (toCExp syns e1) (toCExp syns e2) (ETmApp (ETyApp (EVal (Qualified _ _ (ExprValName "-"))) _) _) -> - CSub (toCExp e1) (toCExp e2) + CSub (toCExp syns e1) (toCExp syns e2) _ -> error ("Builtin: " ++ show op) - toCExp (ELocation _ e) = toCExp e - toCExp (EBuiltin (BEBool b)) = CBool b - toCExp (EBuiltin (BEInt64 i)) = CInt $ toInteger i + toCExp syns (ELocation _ e) = toCExp syns e + toCExp _syns (EBuiltin (BEBool b)) = CBool b + toCExp _syns (EBuiltin (BEInt64 i)) = CInt $ toInteger i -- TODO - -- toCExp (EBuiltin (BENumeric i)) = CReal i - toCExp e = error ("Conversion: " ++ show e) + -- toCExp syns (EBuiltin (BENumeric i)) = CReal i + toCExp _syns e = error ("Conversion: " ++ show e) instance ConstrExpr a => ConstrExpr (Cond a) where - toCExp (Determined x) = toCExp x - toCExp (Conditional b x Nothing) = CWhen (toCExp b) (toCExp x) - toCExp (Conditional b x (Just y)) = CIf (toCExp b) (toCExp x) (toCExp y) + toCExp syns (Determined x) = toCExp syns x + toCExp syns (Conditional b x Nothing) = CWhen (toCExp syns b) (toCExp syns x) + toCExp syns (Conditional b x (Just y)) = CIf (toCExp syns b) (toCExp syns x) (toCExp syns y) -- | Gather all free variables in a constraint expression. gatherFreeVars :: ConstraintExpr @@ -144,36 +155,40 @@ data ConstraintSet = ConstraintSet -- It returns either a create or an archive update. filterUpd :: TypeConName -- ^ The template name to filter against. + -> [(ExprVarName, ExprVarName)] + -- ^ The contract name synonyms, along with their current alias. -> FieldName -- ^ The field name to be verified. -> Upd -- ^ The update expression to convert and filter. -> (Maybe ConstraintExpr, Maybe ConstraintExpr) -filterUpd tem f UpdCreate{..} = if tem == qualObject _creTemp - then (Just (toCExp $ fromJust $ lookup f _creField), Nothing) +filterUpd tem syns f UpdCreate{..} = if tem == qualObject _creTemp + then (Just (toCExp syns $ fromJust $ lookup f _creField), Nothing) else (Nothing, Nothing) -filterUpd tem f UpdArchive{..} = if tem == qualObject _arcTemp - then (Nothing, Just (toCExp $ fromJust $ lookup f _arcField)) +filterUpd tem syns f UpdArchive{..} = if tem == qualObject _arcTemp + then (Nothing, Just (toCExp syns $ fromJust $ lookup f _arcField)) else (Nothing, Nothing) -- | Filters and converts a conditional update into (possibly two) constraint -- expressions, while splitting it into create and archive updates. filterCondUpd :: TypeConName -- ^ The template name to filter against + -> [(ExprVarName, ExprVarName)] + -- ^ The contract name synonyms, along with their current alias. -> FieldName -- ^ The field name to be verified. -> Cond Upd -- ^ The conditional update expression to convert and filter. -> ([ConstraintExpr], [ConstraintExpr]) -filterCondUpd tem f (Determined x) = bimap maybeToList maybeToList $ filterUpd tem f x -filterCondUpd tem f (Conditional b x Nothing) = - let cb = toCExp b - cx = bimap maybeToList maybeToList $ filterUpd tem f x +filterCondUpd tem syns f (Determined x) = bimap maybeToList maybeToList $ filterUpd tem syns f x +filterCondUpd tem syns f (Conditional b x Nothing) = + let cb = toCExp syns b + cx = bimap maybeToList maybeToList $ filterUpd tem syns f x in bimap (map (CWhen cb)) (map (CWhen cb)) cx -filterCondUpd tem f (Conditional b x (Just y)) = - let cb = toCExp b - (cxcre,cxarc) = bimap maybeToList maybeToList $ filterUpd tem f x - (cycre,cyarc) = bimap maybeToList maybeToList $ filterUpd tem f y +filterCondUpd tem syns f (Conditional b x (Just y)) = + let cb = toCExp syns b + (cxcre,cxarc) = bimap maybeToList maybeToList $ filterUpd tem syns f x + (cycre,cyarc) = bimap maybeToList maybeToList $ filterUpd tem syns f y -- TODO: We should try to use an if here. in ( map (CWhen cb) cxcre ++ map (CWhen (CNot cb)) cycre , map (CWhen cb) cxarc ++ map (CWhen (CNot cb)) cyarc ) @@ -189,6 +204,17 @@ filterVars vars cexprs = let freevars = foldl (\fv e -> fv `union` gatherFreeVars e) [] cexprs in freevars `intersect` vars +-- | Construct a list of all contract name synonyms, along with their current +-- alias. +constructSynonyms :: [(ExprVarName, [ExprVarName])] + -- ^ The current contract names, along with any previous synonyms. + -> [(ExprVarName, ExprVarName)] +constructSynonyms = foldl step [] + where + step :: [(ExprVarName, ExprVarName)] -> (ExprVarName, [ExprVarName]) + -> [(ExprVarName, ExprVarName)] + step acc (cur, prevs) = acc ++ map (\prev -> (prev, cur)) prevs + -- | Constructs a constraint set from the generator environment, together with -- the template name, the choice and field to be verified. constructConstr :: Env 'Solving @@ -204,11 +230,12 @@ constructConstr :: Env 'Solving -> ConstraintSet constructConstr env chtem ch ftem f = case lookupChoInHMap (_envschs env) chtem ch of - Just (self, this, arg, updSubst) -> - let upds = _ussUpdate $ updSubst (EVar self) (EVar this) (EVar arg) + Just ChoiceData{..} -> + let upds = _ussUpdate $ _cdUpds (EVar _cdSelf) (EVar _cdThis) (EVar _cdArgs) vars = concatMap skol2var (_envsskol env) + syns = constructSynonyms $ HM.elems $ _envscids env (cres, arcs) = foldl - (\(cs,as) upd -> let (cs',as') = filterCondUpd ftem f upd in (cs ++ cs',as ++ as')) + (\(cs,as) upd -> let (cs',as') = filterCondUpd ftem syns f upd in (cs ++ cs',as ++ as')) ([],[]) upds in ConstraintSet vars cres arcs Nothing -> error "Choice not found" From 13eb8a4e29450006c484fff3028614760d856c4e Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Thu, 14 May 2020 15:06:05 +0200 Subject: [PATCH 34/50] Additional equality constraints after create update --- .../src/DA/Daml/LF/Verify/Context.hs | 45 ++++++++---- .../src/DA/Daml/LF/Verify/Generate.hs | 53 ++++++++------ .../src/DA/Daml/LF/Verify/Solve.hs | 70 ++++++++++++++++++- 3 files changed, 130 insertions(+), 38 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 840e4dbc218d..061c1e686eb6 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -26,7 +26,7 @@ module DA.Daml.LF.Verify.Context , runEnv , genRenamedVar , emptyEnv - , extVarEnv, extRecEnv, extValEnv, extChEnv, extDatsEnv, extCidEnv + , extVarEnv, extRecEnv, extValEnv, extChEnv, extDatsEnv, extCidEnv, extCtrRec , extRecEnvLvl1 , lookupVar, lookupRec, lookupVal, lookupChoice, lookupDataCon, lookupCid , concatEnv @@ -172,15 +172,15 @@ class GenPhase ph where instance GenPhase 'ValueGathering where emptyUpdateSet = UpdateSetVG [] [] [] - emptyEnv = EnvVG [] HM.empty HM.empty HM.empty + emptyEnv = EnvVG [] HM.empty HM.empty HM.empty [] instance GenPhase 'ChoiceGathering where emptyUpdateSet = UpdateSetCG [] [] - emptyEnv = EnvCG [] HM.empty HM.empty HM.empty HM.empty + emptyEnv = EnvCG [] HM.empty HM.empty HM.empty [] HM.empty instance GenPhase 'Solving where emptyUpdateSet = UpdateSetS [] - emptyEnv = EnvS [] HM.empty HM.empty HM.empty HM.empty + emptyEnv = EnvS [] HM.empty HM.empty HM.empty [] HM.empty -- | Combine two update sets. concatUpdateSet :: UpdateSet ph @@ -280,6 +280,8 @@ data Env (ph :: Phase) where , _envvgcids :: !(HM.HashMap Cid (ExprVarName, [ExprVarName])) -- ^ The set of fetched cid's mapped to their current variable name, along -- with a list of any potential old variable names. + , _envvgctrs :: ![(Expr, Expr)] + -- ^ Additional equality constraints. } -> Env 'ValueGathering EnvCG :: { _envcgskol :: ![Skolem] @@ -291,6 +293,8 @@ data Env (ph :: Phase) where , _envcgcids :: !(HM.HashMap Cid (ExprVarName, [ExprVarName])) -- ^ The set of fetched cid's mapped to their current variable name, along -- with a list of any potential old variable names. + , _envcgctrs :: ![(Expr, Expr)] + -- ^ Additional equality constraints. , _envcgchs :: !(HM.HashMap UpdChoice (ChoiceData 'ChoiceGathering)) -- ^ The set of relevant choices. } -> Env 'ChoiceGathering @@ -304,6 +308,8 @@ data Env (ph :: Phase) where , _envscids :: !(HM.HashMap Cid (ExprVarName, [ExprVarName])) -- ^ The set of fetched cid's mapped to their current variable name, along -- with a list of any potential old variable names. + , _envsctrs :: ![(Expr, Expr)] + -- ^ Additional equality constraints. , _envschs :: !(HM.HashMap UpdChoice (ChoiceData 'Solving)) -- ^ The set of relevant choices. } -> Env 'Solving @@ -314,15 +320,15 @@ concatEnv :: Env ph -> Env ph -- ^ The second environment to be combined. -> Env ph -concatEnv (EnvVG vars1 vals1 dats1 cids1) (EnvVG vars2 vals2 dats2 cids2) = +concatEnv (EnvVG vars1 vals1 dats1 cids1 ctrs1) (EnvVG vars2 vals2 dats2 cids2 ctrs2) = EnvVG (vars1 ++ vars2) (vals1 `HM.union` vals2) (dats1 `HM.union` dats2) - (cids1 `HM.union` cids2) -concatEnv (EnvCG vars1 vals1 dats1 cids1 chos1) (EnvCG vars2 vals2 dats2 cids2 chos2) = + (cids1 `HM.union` cids2) (ctrs1 ++ ctrs2) +concatEnv (EnvCG vars1 vals1 dats1 cids1 ctrs1 chos1) (EnvCG vars2 vals2 dats2 cids2 ctrs2 chos2) = EnvCG (vars1 ++ vars2) (vals1 `HM.union` vals2) (dats1 `HM.union` dats2) - (cids1 `HM.union` cids2) (chos1 `HM.union` chos2) -concatEnv (EnvS vars1 vals1 dats1 cids1 chos1) (EnvS vars2 vals2 dats2 cids2 chos2) = + (cids1 `HM.union` cids2) (ctrs1 ++ ctrs2) (chos1 `HM.union` chos2) +concatEnv (EnvS vars1 vals1 dats1 cids1 ctrs1 chos1) (EnvS vars2 vals2 dats2 cids2 ctrs2 chos2) = EnvS (vars1 ++ vars2) (vals1 `HM.union` vals2) (dats1 `HM.union` dats2) - (cids1 `HM.union` cids2) (chos1 `HM.union` chos2) + (cids1 `HM.union` cids2) (ctrs1 ++ ctrs2) (chos1 `HM.union` chos2) -- TODO: union makes me slightly nervous, as it allows overlapping keys -- (and just uses the first). `unionWith concatUpdateSet` would indeed be better, -- but this still makes me nervous as the expr and exprvarnames wouldn't be merged. @@ -454,6 +460,21 @@ extCidEnv exp var = do env@EnvCG{..} -> putEnv env{_envcgcids = HM.insert cid new _envcgcids} env@EnvS{..} -> putEnv env{_envscids = HM.insert cid new _envscids} +-- | Extend the environment with additional equality constraints, between a +-- variable and its field values. +extCtrRec :: MonadEnv m ph + => ExprVarName + -- ^ The variable to be asserted. + -> [(FieldName, Expr)] + -- ^ The fields with their values. + -> m () +extCtrRec var fields = do + let ctrs = map (\(f, e) -> (EStructProj f (EVar var), e)) fields + getEnv >>= \case + env@EnvVG{..} -> putEnv env{_envvgctrs = ctrs ++ _envvgctrs} + env@EnvCG{..} -> putEnv env{_envcgctrs = ctrs ++ _envcgctrs} + env@EnvS{..} -> putEnv env{_envsctrs = ctrs ++ _envsctrs} + -- TODO: Is one layer of recursion enough? -- | Recursively skolemise the given record fields, when they have a record -- type. Note that this only works 1 level deep. @@ -595,7 +616,7 @@ lookupChoInHMap hmap _tem cho = listToMaybe $ HM.elems solveValueReferences :: Env 'ValueGathering -> Env 'ChoiceGathering solveValueReferences EnvVG{..} = let valhmap = foldl (\hmap ref -> snd $ solveReference lookup_ref get_refs ext_upds intro_cond [] hmap ref) _envvgvals (HM.keys _envvgvals) - in EnvCG _envvgskol (convertHMap valhmap) _envvgdats _envvgcids HM.empty + in EnvCG _envvgskol (convertHMap valhmap) _envvgdats _envvgcids _envvgctrs HM.empty where lookup_ref :: Qualified ExprValName -> HM.HashMap (Qualified ExprValName) (Expr, UpdateSet 'ValueGathering) @@ -635,7 +656,7 @@ solveChoiceReferences EnvCG{..} = let chhmap = foldl (\hmap ref -> snd $ solveReference lookup_ref get_refs ext_upds intro_cond [] hmap ref) _envcgchs (HM.keys _envcgchs) chshmap = convertChHMap chhmap valhmap = HM.map (inlineChoices chshmap) _envcgvals - in EnvS _envcgskol valhmap _envcgdats _envcgcids chshmap + in EnvS _envcgskol valhmap _envcgdats _envcgcids _envcgctrs chshmap where lookup_ref :: UpdChoice -> HM.HashMap UpdChoice (ChoiceData 'ChoiceGathering) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index 785a4f677d90..eda215046956 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -194,23 +194,26 @@ genExpr updFlag = \case ELocation _ expr -> genExpr updFlag expr ECase e cs -> genForCase updFlag e cs EUpdate upd -> if updFlag - then fst <$> genUpdate upd + then do + (out, _, _) <- genUpdate upd + return out else return $ emptyOut $ EUpdate upd -- TODO: Extend additional cases e -> return $ emptyOut e --- | Analyse an update expression, and produce both an Output and its result type. +-- | Analyse an update expression, and produce both an Output, its return type +-- and potentially the field values of any created contracts. genUpdate :: (GenPhase ph, MonadEnv m ph) => Update -- ^ The update expression to be analysed. - -> m (Output ph, Type) + -> m (Output ph, Type, Maybe Expr) genUpdate = \case UCreate tem arg -> genForCreate tem arg UExercise tem ch cid par arg -> genForExercise tem ch cid par arg UBind bind expr -> genForBind bind expr UPure typ expr -> do out <- genExpr True expr - return (out, typ) + return (out, typ, Nothing) -- TODO: Extend additional cases _ -> error $ "Update not implemented yet" @@ -385,12 +388,13 @@ genForCreate :: (GenPhase ph, MonadEnv m ph) -- ^ The template of which a new instance is being created. -> Expr -- ^ The argument expression. - -> m (Output ph, Type) + -> m (Output ph, Type, Maybe Expr) genForCreate tem arg = do arout <- genExpr True arg fs <- recExpFields (_oExpr arout) return ( Output (EUpdate (UCreate tem $ _oExpr arout)) $ addUpd emptyUpdateSet (UpdCreate tem fs) - , TCon tem ) + , TCon tem + , Just $ EStructCon fs ) -- TODO: We could potentially filter here to only store the interesting fields? -- | Analyse an exercise update expression. @@ -406,7 +410,7 @@ genForExercise :: (GenPhase ph, MonadEnv m ph) -- ^ The party which exercises the choice. -> Expr -- ^ The arguments with which the choice is being exercised. - -> m (Output ph, Type) + -> m (Output ph, Type, Maybe Expr) genForExercise tem ch cid par arg = do cidOut <- genExpr True cid arout <- genExpr True arg @@ -415,7 +419,8 @@ genForExercise tem ch cid par arg = do -- TODO: Should we further eval after subst? But how to eval an update set? let updSet = updSubst (_oExpr cidOut) (EVar this) (_oExpr arout) return ( Output (EUpdate (UExercise tem ch (_oExpr cidOut) par (_oExpr arout))) updSet - , resType ) + , resType + , Nothing ) -- TODO! -- | Analyse a bind update expression. -- Returns both the generator output and the return type. @@ -424,35 +429,32 @@ genForBind :: (GenPhase ph, MonadEnv m ph) -- ^ The binding being bound with this update. -> Expr -- ^ The expression in which this binding is being made available. - -> m (Output ph, Type) + -> m (Output ph, Type, Maybe Expr) genForBind bind body = do bindOut <- genExpr False (bindingBound bind) bindUpd <- case _oExpr bindOut of EUpdate (UFetch tc cid) -> do - bindCids (TContractId (TCon tc)) cid (EVar $ fst $ bindingBinder bind) + bindCids (TContractId (TCon tc)) cid (EVar $ fst $ bindingBinder bind) Nothing return emptyUpdateSet - -- fs <- recTypConFields $ qualObject tc - -- extRecEnv (fst $ bindingBinder bind) (map fst fs) - -- cidOut <- genExpr updFlag cid - -- extCidEnv (_oExpr cidOut) (fst $ bindingBinder bind) EUpdate upd -> do - (updOut, updTyp) <- genUpdate upd + (updOut, updTyp, creFs) <- genUpdate upd this <- genRenamedVar (ExprVarName "this") - bindCids updTyp (EVar $ fst $ bindingBinder bind) (EVar this) + bindCids updTyp (EVar $ fst $ bindingBinder bind) (EVar this) creFs return $ _oUpdate updOut _ -> return emptyUpdateSet extVarEnv (fst $ bindingBinder bind) bodyOut <- genExpr False body case _oExpr bodyOut of EUpdate bodyUpd -> do - (bodyUpdOut, bodyTyp) <- genUpdate bodyUpd + (bodyUpdOut, bodyTyp, creFs) <- genUpdate bodyUpd return ( Output (_oExpr bodyUpdOut) (_oUpdate bindOut `concatUpdateSet` bindUpd `concatUpdateSet` _oUpdate bodyOut `concatUpdateSet` _oUpdate bodyUpdOut) - , bodyTyp ) + , bodyTyp + , creFs ) _ -> error "Impossible: The body of a bind should be an update expression" bindCids :: (GenPhase ph, MonadEnv m ph) @@ -460,20 +462,25 @@ bindCids :: (GenPhase ph, MonadEnv m ph) -- ^ The type of the contract id's being bound. -> Expr -- ^ The contract id's being bound. - -- TODO: Make this a maybe ExprVarName -> Expr -- ^ The variables to bind them to. + -> Maybe Expr + -- ^ The field values for any created contracts, if available. -> m () -bindCids (TContractId (TCon tc)) cid (EVar this) = do +bindCids (TContractId (TCon tc)) cid (EVar this) fsExp = do fs <- recTypConFields $ qualObject tc extRecEnv this (map fst fs) cidOut <- genExpr True cid extCidEnv (_oExpr cidOut) this -bindCids (TCon tc) cid (EVar this) = do + creFs <- maybe (pure []) recExpFields fsExp + extCtrRec this creFs +bindCids (TCon tc) cid (EVar this) fsExp = do fs <- recTypConFields $ qualObject tc extRecEnv this (map fst fs) cidOut <- genExpr True cid extCidEnv (_oExpr cidOut) this -bindCids (TBuiltin BTUnit) _ _ = return () + creFs <- maybe (pure []) recExpFields fsExp + extCtrRec this creFs +bindCids (TBuiltin BTUnit) _ _ _ = return () -- TODO: Extend additional cases, like tuples. -bindCids _ _ _ = error "Binding contract id's for this particular type has not been implemented yet" +bindCids _ _ _ _ = error "Binding contract id's for this particular type has not been implemented yet" diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 02065ce797c1..04edd1224649 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -13,7 +13,8 @@ module DA.Daml.LF.Verify.Solve import Data.Bifunctor import Data.Maybe (fromJust, maybeToList) -import Data.List (lookup, union, intersect) +import Data.List (lookup, union, intersect, partition, (\\), nub) +import Data.Tuple.Extra (both) import qualified Data.HashMap.Strict as HM import qualified Data.Text as T import qualified SimpleSMT as S @@ -147,6 +148,8 @@ data ConstraintSet = ConstraintSet -- ^ The field values of all newly created instances. , _cArcs :: ![ConstraintExpr] -- ^ The field values of all archived instances. + , _cCtrs :: ![(ConstraintExpr, ConstraintExpr)] + -- ^ Additional equality constraints. } deriving Show @@ -234,10 +237,11 @@ constructConstr env chtem ch ftem f = let upds = _ussUpdate $ _cdUpds (EVar _cdSelf) (EVar _cdThis) (EVar _cdArgs) vars = concatMap skol2var (_envsskol env) syns = constructSynonyms $ HM.elems $ _envscids env + ctrs = map (both (toCExp syns)) $ _envsctrs env (cres, arcs) = foldl (\(cs,as) upd -> let (cs',as') = filterCondUpd ftem syns f upd in (cs ++ cs',as ++ as')) ([],[]) upds - in ConstraintSet vars cres arcs + in ConstraintSet vars cres arcs ctrs Nothing -> error "Choice not found" -- | Convert a constraint expression into an SMT expression from the solving library. @@ -294,6 +298,64 @@ declareVars s xs = zip xs <$> mapM (\x -> S.declare s (var2str x) S.tReal) xs var2str :: ExprVarName -> String var2str (ExprVarName x) = T.unpack x +-- | Assert the additional equality constraints. Binds and returns any +-- additional required variables. +declareCtrs :: S.Solver + -- ^ The SMT solver. + -> [(ExprVarName,S.SExpr)] + -- ^ The set of variable names, mapped to their corresponding SMT counterparts. + -> [(ConstraintExpr, ConstraintExpr)] + -- ^ The equality constraints to be declared. + -> IO [(ExprVarName,S.SExpr)] +declareCtrs sol cvars1 ctrs = do + let edges = map (\(l,r) -> (l,r,gatherFreeVars l ++ gatherFreeVars r)) ctrs + components = conn_comp edges + useful_nodes = map fst cvars1 + useful_components = filter + (\comp -> let comp_vars = concatMap (\(_,_,vars) -> vars) comp + in not $ null $ intersect comp_vars useful_nodes) + components + useful_equalities = concatMap (map (\(l,r,_) -> (l,r))) useful_components + required_vars = + ( nub (concatMap (concatMap (\(_,_,vars) -> vars)) useful_components) ) + \\ useful_nodes + cvars2 <- declareVars sol required_vars + mapM_ (declare $ cvars1 ++ cvars2) useful_equalities + return cvars2 + where + -- | Compute connected components of the equality constraints graph. + -- Two edges are adjacent when at least one of their nodes shares a variable. + conn_comp :: [(ConstraintExpr,ConstraintExpr,[ExprVarName])] + -- ^ The edges of the graph, annotated with the contained variables. + -> [[(ConstraintExpr,ConstraintExpr,[ExprVarName])]] + conn_comp [] = [] + conn_comp (edge:edges) = let (comp,rem) = cc_step edges edge + in comp : conn_comp rem + + -- | Compute the strongly connected component containing a given edge from + -- the graph, as well as the remaining edges which do not belong to this + -- component. + cc_step :: [(ConstraintExpr,ConstraintExpr,[ExprVarName])] + -- ^ The edges of the graph, which do not yet belong to any component. + -> (ConstraintExpr,ConstraintExpr,[ExprVarName]) + -- ^ The current edge for which the component is being computed. + -> ( [(ConstraintExpr,ConstraintExpr,[ExprVarName])] + -- ^ The computed connected component. + , [(ConstraintExpr,ConstraintExpr,[ExprVarName])] ) + -- ^ The remaining edges which do not belong to the connected component. + cc_step [] _ = ([],[]) + cc_step edges0 (l,r,vars) = + let (neighbors,edges1) = partition (\(_,_,vars') -> not $ null $ intersect vars vars') edges0 + in foldl (\(conn,edges2) edge -> first (conn ++) $ cc_step edges2 edge) + ((l,r,vars):neighbors,edges1) neighbors + + declare :: [(ExprVarName,S.SExpr)] -> (ConstraintExpr, ConstraintExpr) -> IO () + declare vars (cexp1, cexp2) = do + sexp1 <- cexp2sexp vars cexp1 + sexp2 <- cexp2sexp vars cexp2 + putStrLn $ "Assert: " ++ S.ppSExpr sexp1 (" = " ++ S.ppSExpr sexp2 "") + S.assert sol (sexp1 `S.eq` sexp2) + -- | Data type denoting the outcome of the solver. data Result = Success @@ -324,7 +386,9 @@ solveConstr :: FilePath solveConstr spath ConstraintSet{..} = do log <- S.newLogger 1 sol <- S.newSolver spath ["-in"] (Just log) - vars <- declareVars sol $ filterVars _cVars (_cCres ++ _cArcs) + vars1 <- declareVars sol $ filterVars _cVars (_cCres ++ _cArcs) + vars2 <- declareCtrs sol vars1 _cCtrs + let vars = vars1 ++ vars2 cre <- foldl S.add (S.real 0) <$> mapM (cexp2sexp vars) _cCres arc <- foldl S.add (S.real 0) <$> mapM (cexp2sexp vars) _cArcs S.assert sol (S.not (cre `S.eq` arc)) From 16aa3e3fc0ed3a2167fad6ca51ff49fc7452c571 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Thu, 14 May 2020 15:12:11 +0200 Subject: [PATCH 35/50] Make assertion print conditional --- compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs | 2 +- .../daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index 72e20202967b..1c47e4a656ef 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -72,4 +72,4 @@ verify dar verbose choiceTmpl choiceName fieldTmpl fieldName = do let cset = constructConstr env4 choiceTmpl choiceName fieldTmpl fieldName when verbose $ putStr "Create: " >> print (_cCres cset) when verbose $ putStr "Archive: " >> print (_cArcs cset) - solveConstr solver cset + solveConstr solver verbose cset diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 04edd1224649..0cafddc0d501 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -11,6 +11,7 @@ module DA.Daml.LF.Verify.Solve , Result(..) ) where +import Control.Monad (when) import Data.Bifunctor import Data.Maybe (fromJust, maybeToList) import Data.List (lookup, union, intersect, partition, (\\), nub) @@ -302,12 +303,14 @@ declareVars s xs = zip xs <$> mapM (\x -> S.declare s (var2str x) S.tReal) xs -- additional required variables. declareCtrs :: S.Solver -- ^ The SMT solver. + -> Bool + -- ^ Flag denoting whether to print verbosely. -> [(ExprVarName,S.SExpr)] -- ^ The set of variable names, mapped to their corresponding SMT counterparts. -> [(ConstraintExpr, ConstraintExpr)] -- ^ The equality constraints to be declared. -> IO [(ExprVarName,S.SExpr)] -declareCtrs sol cvars1 ctrs = do +declareCtrs sol verbose cvars1 ctrs = do let edges = map (\(l,r) -> (l,r,gatherFreeVars l ++ gatherFreeVars r)) ctrs components = conn_comp edges useful_nodes = map fst cvars1 @@ -353,7 +356,7 @@ declareCtrs sol cvars1 ctrs = do declare vars (cexp1, cexp2) = do sexp1 <- cexp2sexp vars cexp1 sexp2 <- cexp2sexp vars cexp2 - putStrLn $ "Assert: " ++ S.ppSExpr sexp1 (" = " ++ S.ppSExpr sexp2 "") + when verbose $ putStr "Assert: " >> print (S.ppSExpr sexp1 (" = " ++ S.ppSExpr sexp2 "")) S.assert sol (sexp1 `S.eq` sexp2) -- | Data type denoting the outcome of the solver. @@ -380,14 +383,16 @@ instance Show Result where -- equal. solveConstr :: FilePath -- ^ The path to the constraint solver. + -> Bool + -- ^ Flag denoting whether to print verbosely. -> ConstraintSet -- ^ The constraint set to solve. -> IO Result -solveConstr spath ConstraintSet{..} = do +solveConstr spath verbose ConstraintSet{..} = do log <- S.newLogger 1 sol <- S.newSolver spath ["-in"] (Just log) vars1 <- declareVars sol $ filterVars _cVars (_cCres ++ _cArcs) - vars2 <- declareCtrs sol vars1 _cCtrs + vars2 <- declareCtrs sol verbose vars1 _cCtrs let vars = vars1 ++ vars2 cre <- foldl S.add (S.real 0) <$> mapM (cexp2sexp vars) _cCres arc <- foldl S.add (S.real 0) <$> mapM (cexp2sexp vars) _cArcs From 642c1b9da00c3dff74debc9aa356f8e779472ca6 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Thu, 14 May 2020 15:42:16 +0200 Subject: [PATCH 36/50] Various improvements from PR feedback --- compiler/daml-lf-verify/BUILD.bazel | 2 + .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 62 ++++++++++++------- .../src/DA/Daml/LF/Verify/Context.hs | 51 +++++++++------ .../src/DA/Daml/LF/Verify/Solve.hs | 55 ++++++++-------- .../tests/DA/Daml/LF/Verify/Tests.hs | 21 ++++--- 5 files changed, 114 insertions(+), 77 deletions(-) diff --git a/compiler/daml-lf-verify/BUILD.bazel b/compiler/daml-lf-verify/BUILD.bazel index 6a8f954b31af..254ca78df196 100644 --- a/compiler/daml-lf-verify/BUILD.bazel +++ b/compiler/daml-lf-verify/BUILD.bazel @@ -24,6 +24,7 @@ da_haskell_binary( "lens", "mtl", "optparse-applicative", + "prettyprinter", "recursion-schemes", "safe", "scientific", @@ -67,6 +68,7 @@ da_haskell_library( "lens", "mtl", "optparse-applicative", + "prettyprinter", "recursion-schemes", "safe", "scientific", diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index 1c47e4a656ef..f641818fb3d2 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -9,9 +9,12 @@ module DA.Daml.LF.Verify , verify ) where -import Control.Monad (when) import Data.Text +import Data.Text.Prettyprint.Doc +import Data.Text.Prettyprint.Doc.Render.String import Options.Applicative +import System.Exit +import System.IO import DA.Daml.LF.Ast.Base import DA.Daml.LF.Verify.Generate @@ -30,14 +33,24 @@ main = do choiceName = ChoiceName (pack optChoiceName) fieldTmpl = TypeConName [pack optFieldTmpl] fieldName = FieldName (pack optFieldName) - result <- verify optInputDar True choiceTmpl choiceName fieldTmpl fieldName + result <- verify optInputDar putStrLn choiceTmpl choiceName fieldTmpl fieldName print result +outputError :: Error + -- ^ The error message. + -> String + -- ^ An additional message providing context. + -> IO Result +outputError err msg = do + hPutStrLn stderr msg + hPutStrLn stderr (show err) + exitFailure + -- | Execute the full verification pipeline. verify :: FilePath -- ^ The DAR file to load. - -> Bool - -- ^ Enable print outs. + -> (String -> IO ()) + -- ^ Function for debugging printouts. -> TypeConName -- ^ The template in which the given choice is defined. -> ChoiceName @@ -47,29 +60,36 @@ verify :: FilePath -> FieldName -- ^ The field to be verified. -> IO Result -verify dar verbose choiceTmpl choiceName fieldTmpl fieldName = do +verify dar debug choiceTmpl choiceName fieldTmpl fieldName = do + -- Read the packages to analyse, and initialise the provided solver. pkgs <- readPackages [dar] solver <- getSolver - when verbose $ putStrLn "Start value gathering" + -- Start reading data type and value definitions. References to other + -- values are just stored as references at this point. + debug "Start value gathering" case runEnv (genPackages pkgs) (emptyEnv :: Env 'ValueGathering) of - Left err-> do - putStrLn "Value phase finished with error: " - print err - return Unknown + Left err-> outputError err "Value phase finished with error: " Right env1 -> do - when verbose $ putStrLn "Start value solving" + -- All value definitions have been handled. Start computing closures of + -- the stored value references. After this phase, all value references + -- should be inlined. + debug "Start value solving" let env2 = solveValueReferences env1 - when verbose $ putStrLn "Start choice gathering" + -- Start reading template definitions. References to choices are just + -- stored as references at this point. + debug "Start choice gathering" case runEnv (genPackages pkgs) env2 of - Left err -> do - putStrLn "Choice phase finished with error: " - print err - return Unknown + Left err -> outputError err "Choice phase finished with error: " Right env3 -> do - when verbose $ putStrLn "Start choice solving" + -- All choice definitions have been handled. Start computing closures + -- of the stored choice references. After this phase, all choice + -- references should be inlined. + debug "Start choice solving" let env4 = solveChoiceReferences env3 - when verbose $ putStrLn "Start constraint solving phase" + -- Construct the actual constraints to be solved by the SMT solver. + debug "Start constraint solving phase" let cset = constructConstr env4 choiceTmpl choiceName fieldTmpl fieldName - when verbose $ putStr "Create: " >> print (_cCres cset) - when verbose $ putStr "Archive: " >> print (_cArcs cset) - solveConstr solver verbose cset + debug $ renderString $ layoutCompact ("Create: " <+> pretty (_cCres cset)) + debug $ renderString $ layoutCompact ("Archive: " <+> pretty (_cArcs cset)) + -- Pass the constraints to the SMT solver. + solveConstr solver debug cset diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 061c1e686eb6..bcde8bd51fa2 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -66,7 +66,8 @@ data Phase -- have been inlined. -- | Data type denoting a boolean condition expression. This data type was --- introduced to avoid having to use imported daml-if prelude functions. +-- introduced as DAML-LF does not have build-in boolean operators, and using +-- prelude functions gets messy. data BoolExpr = BExpr Expr -- ^ A daml-lf expression. @@ -89,23 +90,19 @@ instance Functor Cond where fmap f (Determined x) = Determined (f x) fmap f (Conditional e x y) = Conditional e (f x) (f <$> y) --- | Class covering the types which store conditionals inside. -class Conditional a where - -- | Shift the conditional inside the data type. - introCond :: Cond a -> a - -instance Conditional (UpdateSet ph) where - introCond (Determined upds) = upds - introCond (Conditional e updx updy) = case updx of - UpdateSetVG{} -> UpdateSetVG - (concatCond $ Conditional e (_usvgUpdate updx) (_usvgUpdate <$> updy)) - (concatCond $ Conditional e (_usvgChoice updx) (_usvgChoice <$> updy)) - (concatCond $ Conditional e (_usvgValue updx) (_usvgValue <$> updy)) - UpdateSetCG{} -> UpdateSetCG - (concatCond $ Conditional e (_uscgUpdate updx) (_uscgUpdate <$> updy)) - (concatCond $ Conditional e (_uscgChoice updx) (_uscgChoice <$> updy)) - UpdateSetS{} -> UpdateSetS - (concatCond $ Conditional e (_ussUpdate updx) (_ussUpdate <$> updy)) +-- | Shift the conditional inside the update set. +introCond :: Cond (UpdateSet ph) -> UpdateSet ph +introCond (Determined upds) = upds +introCond (Conditional e updx updy) = case updx of + UpdateSetVG{} -> UpdateSetVG + (concatCond $ Conditional e (_usvgUpdate updx) (_usvgUpdate <$> updy)) + (concatCond $ Conditional e (_usvgChoice updx) (_usvgChoice <$> updy)) + (concatCond $ Conditional e (_usvgValue updx) (_usvgValue <$> updy)) + UpdateSetCG{} -> UpdateSetCG + (concatCond $ Conditional e (_uscgUpdate updx) (_uscgUpdate <$> updy)) + (concatCond $ Conditional e (_uscgChoice updx) (_uscgChoice <$> updy)) + UpdateSetS{} -> UpdateSetS + (concatCond $ Conditional e (_ussUpdate updx) (_ussUpdate <$> updy)) -- | Flatten nested conditionals into a single level. concatCond :: Cond [Cond a] -> [Cond a] @@ -732,23 +729,39 @@ solveReference :: forall updset ref. (Eq ref, Hashable ref) -- ^ The reference to be solved. -> (updset, HM.HashMap ref updset) solveReference lookup getRefs extUpds introCond vis hmap0 ref0 = + -- Lookup updates performed by the given reference, and split in new + -- references and reference-free updates. let upd0 = lookup ref0 hmap0 (refs, upd1) = getRefs upd0 + -- Check for loops. If the references has already been visited, then the + -- reference should be flagged as recursive. in if ref0 `elem` vis -- TODO: Recursion! then (upd1, hmap0) -- TODO: At least remove the references? + -- When no recursion has been detected, continue inlining the references. else let (upd2, hmap1) = foldl handle_ref (upd1, hmap0) refs in (upd1, HM.insert ref0 upd2 hmap1) where - handle_ref :: (updset, HM.HashMap ref updset) -> Cond ref + -- | Extend the closure by computing and adding the reference closure for + -- the given reference. + handle_ref :: (updset, HM.HashMap ref updset) + -- ^ The current closure (update set) and the current map for reference to update. + -> Cond ref + -- ^ The reference to be computed and added. -> (updset, HM.HashMap ref updset) + -- For a simple reference, the closure is computed straightforwardly. handle_ref (upd_i0, hmap_i0) (Determined ref_i) = let (upd_i1, hmap_i1) = solveReference lookup getRefs extUpds introCond (ref0:vis) hmap_i0 ref_i in (extUpds upd_i0 upd_i1, hmap_i1) + -- A conditional reference is more involved, as the conditional needs to be + -- preserved in the computed closure (update set). handle_ref (upd_i0, hmap_i0) (Conditional cond ref_ia ref_ib) = + -- Compute the closure for the true-case. let (upd_ia, hmap_ia) = solveReference lookup getRefs extUpds introCond (ref0:vis) hmap_i0 ref_ia + -- Compute the closure for the false-case, when this case exists. (upd_ib, hmap_ib) = maybe (Nothing, hmap_ia) (first Just . solveReference lookup getRefs extUpds introCond (ref0:vis) hmap_ia) ref_ib + -- Move the conditional inwards, in the update set. upd_i1 = extUpds upd_i0 $ introCond $ Conditional cond upd_ia upd_ib in (upd_i1, hmap_ib) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 0cafddc0d501..3db8bc021022 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -11,11 +11,11 @@ module DA.Daml.LF.Verify.Solve , Result(..) ) where -import Control.Monad (when) import Data.Bifunctor import Data.Maybe (fromJust, maybeToList) import Data.List (lookup, union, intersect, partition, (\\), nub) import Data.Tuple.Extra (both) +import Data.Text.Prettyprint.Doc import qualified Data.HashMap.Strict as HM import qualified Data.Text as T import qualified SimpleSMT as S @@ -48,19 +48,21 @@ data ConstraintExpr | CIf !ConstraintExpr !ConstraintExpr !ConstraintExpr -- | If then expression. | CWhen !ConstraintExpr !ConstraintExpr + deriving Show -instance Show ConstraintExpr where - show (CBool b) = show b - show (CInt i) = show i - show (CReal i) = show i - show (CVar x) = T.unpack $ unExprVarName x - show (CAdd e1 e2) = show e1 ++ " + " ++ show e2 - show (CSub e1 e2) = show e1 ++ " - " ++ show e2 - show (CEq e1 e2) = show e1 ++ " == " ++ show e2 - show (CAnd e1 e2) = show e1 ++ " and " ++ show e2 - show (CNot e) = "not " ++ show e - show (CIf e1 e2 e3) = "if " ++ show e1 ++ " then " ++ show e2 ++ " else " ++ show e3 - show (CWhen e1 e2) = "when " ++ show e1 ++ " then " ++ show e2 +instance Pretty ConstraintExpr where + pretty (CBool b) = pretty b + pretty (CInt i) = pretty i + pretty (CReal i) = pretty $ show i + pretty (CVar x) = pretty $ unExprVarName x + pretty (CAdd e1 e2) = pretty e1 <+> " <+> " <+> pretty e2 + pretty (CSub e1 e2) = pretty e1 <+> " - " <+> pretty e2 + pretty (CEq e1 e2) = pretty e1 <+> " == " <+> pretty e2 + pretty (CAnd e1 e2) = pretty e1 <+> " and " <+> pretty e2 + pretty (CNot e) = "not " <+> pretty e + pretty (CIf e1 e2 e3) = "if " <+> pretty e1 <+> " then " <+> pretty e2 + <+> " else " <+> pretty e3 + pretty (CWhen e1 e2) = "when " <+> pretty e1 <+> " then " <+> pretty e2 -- | Class covering the types converteable to constraint expressions. class ConstrExpr a where @@ -184,15 +186,14 @@ filterCondUpd :: TypeConName -> Cond Upd -- ^ The conditional update expression to convert and filter. -> ([ConstraintExpr], [ConstraintExpr]) -filterCondUpd tem syns f (Determined x) = bimap maybeToList maybeToList $ filterUpd tem syns f x +filterCondUpd tem syns f (Determined x) = both maybeToList $ filterUpd tem syns f x filterCondUpd tem syns f (Conditional b x Nothing) = let cb = toCExp syns b - cx = bimap maybeToList maybeToList $ filterUpd tem syns f x - in bimap (map (CWhen cb)) (map (CWhen cb)) cx + in both (map (CWhen cb) . maybeToList) $ filterUpd tem syns f x filterCondUpd tem syns f (Conditional b x (Just y)) = let cb = toCExp syns b - (cxcre,cxarc) = bimap maybeToList maybeToList $ filterUpd tem syns f x - (cycre,cyarc) = bimap maybeToList maybeToList $ filterUpd tem syns f y + (cxcre,cxarc) = both maybeToList $ filterUpd tem syns f x + (cycre,cyarc) = both maybeToList $ filterUpd tem syns f y -- TODO: We should try to use an if here. in ( map (CWhen cb) cxcre ++ map (CWhen (CNot cb)) cycre , map (CWhen cb) cxarc ++ map (CWhen (CNot cb)) cyarc ) @@ -243,7 +244,7 @@ constructConstr env chtem ch ftem f = (\(cs,as) upd -> let (cs',as') = filterCondUpd ftem syns f upd in (cs ++ cs',as ++ as')) ([],[]) upds in ConstraintSet vars cres arcs ctrs - Nothing -> error "Choice not found" + Nothing -> error ("Choice not found " ++ show ch) -- | Convert a constraint expression into an SMT expression from the solving library. cexp2sexp :: [(ExprVarName,S.SExpr)] @@ -303,14 +304,14 @@ declareVars s xs = zip xs <$> mapM (\x -> S.declare s (var2str x) S.tReal) xs -- additional required variables. declareCtrs :: S.Solver -- ^ The SMT solver. - -> Bool - -- ^ Flag denoting whether to print verbosely. + -> (String -> IO ()) + -- ^ Function for debugging printouts. -> [(ExprVarName,S.SExpr)] -- ^ The set of variable names, mapped to their corresponding SMT counterparts. -> [(ConstraintExpr, ConstraintExpr)] -- ^ The equality constraints to be declared. -> IO [(ExprVarName,S.SExpr)] -declareCtrs sol verbose cvars1 ctrs = do +declareCtrs sol debug cvars1 ctrs = do let edges = map (\(l,r) -> (l,r,gatherFreeVars l ++ gatherFreeVars r)) ctrs components = conn_comp edges useful_nodes = map fst cvars1 @@ -356,7 +357,7 @@ declareCtrs sol verbose cvars1 ctrs = do declare vars (cexp1, cexp2) = do sexp1 <- cexp2sexp vars cexp1 sexp2 <- cexp2sexp vars cexp2 - when verbose $ putStr "Assert: " >> print (S.ppSExpr sexp1 (" = " ++ S.ppSExpr sexp2 "")) + debug ("Assert: " ++ (S.ppSExpr sexp1 (" = " ++ S.ppSExpr sexp2 ""))) S.assert sol (sexp1 `S.eq` sexp2) -- | Data type denoting the outcome of the solver. @@ -383,16 +384,16 @@ instance Show Result where -- equal. solveConstr :: FilePath -- ^ The path to the constraint solver. - -> Bool - -- ^ Flag denoting whether to print verbosely. + -> (String -> IO ()) + -- ^ Function for debugging printouts. -> ConstraintSet -- ^ The constraint set to solve. -> IO Result -solveConstr spath verbose ConstraintSet{..} = do +solveConstr spath debug ConstraintSet{..} = do log <- S.newLogger 1 sol <- S.newSolver spath ["-in"] (Just log) vars1 <- declareVars sol $ filterVars _cVars (_cCres ++ _cArcs) - vars2 <- declareCtrs sol verbose vars1 _cCtrs + vars2 <- declareCtrs sol debug vars1 _cCtrs let vars = vars1 ++ vars2 cre <- foldl S.add (S.real 0) <$> mapM (cexp2sexp vars) _cCres arc <- foldl S.add (S.real 0) <$> mapM (cexp2sexp vars) _cArcs diff --git a/compiler/daml-lf-verify/tests/DA/Daml/LF/Verify/Tests.hs b/compiler/daml-lf-verify/tests/DA/Daml/LF/Verify/Tests.hs index f44d93ffc9e1..e8a8fada5859 100644 --- a/compiler/daml-lf-verify/tests/DA/Daml/LF/Verify/Tests.hs +++ b/compiler/daml-lf-verify/tests/DA/Daml/LF/Verify/Tests.hs @@ -14,8 +14,6 @@ import DA.Daml.LF.Verify import DA.Daml.LF.Verify.Solve import DA.Bazel.Runfiles --- TODO: Build the dar files from within bazel, instead of passing them in manually. - mainTest :: IO () mainTest = defaultMain $ testGroup "DA.Daml.LF.Verify" [ quickstartTests @@ -29,7 +27,7 @@ quickstartTests = testGroup "Quickstart" let tmpl = TypeConName ["Iou"] choice = ChoiceName "Iou_Split" field = FieldName "amount" - result <- verify quickstartDar False tmpl choice tmpl field + result <- verify quickstartDar debug tmpl choice tmpl field assertEqual "Verification failed for Iou_Split - amount" Success result , testCase "Iou_Merge" $ do @@ -37,7 +35,7 @@ quickstartTests = testGroup "Quickstart" let tmpl = TypeConName ["Iou"] choice = ChoiceName "Iou_Merge" field = FieldName "amount" - result <- verify quickstartDar False tmpl choice tmpl field + result <- verify quickstartDar debug tmpl choice tmpl field assertEqual "Verification failed for Iou_Merge - amount" Success result ] @@ -49,7 +47,7 @@ conditionalTests = testGroup "Conditionals" let tmpl = TypeConName ["Iou"] choice = ChoiceName "SuccA" field = FieldName "content" - result <- verify condDar False tmpl choice tmpl field + result <- verify condDar debug tmpl choice tmpl field assertEqual "Verification failed for SuccA - content" Success result , testCase "Success B" $ do @@ -57,7 +55,7 @@ conditionalTests = testGroup "Conditionals" let tmpl = TypeConName ["Iou"] choice = ChoiceName "SuccB" field = FieldName "content" - result <- verify condDar False tmpl choice tmpl field + result <- verify condDar debug tmpl choice tmpl field assertEqual "Verification failed for SuccB - content" Success result , testCase "Success C" $ do @@ -65,7 +63,7 @@ conditionalTests = testGroup "Conditionals" let tmpl = TypeConName ["Iou"] choice = ChoiceName "SuccC" field = FieldName "content" - result <- verify condDar False tmpl choice tmpl field + result <- verify condDar debug tmpl choice tmpl field assertEqual "Verification failed for SuccC - content" Success result , testCase "Success D" $ do @@ -73,7 +71,7 @@ conditionalTests = testGroup "Conditionals" let tmpl = TypeConName ["Iou"] choice = ChoiceName "SuccD" field = FieldName "content" - result <- verify condDar False tmpl choice tmpl field + result <- verify condDar debug tmpl choice tmpl field assertEqual "Verification failed for SuccD - content" Success result , testCase "Fail A" $ do @@ -81,7 +79,7 @@ conditionalTests = testGroup "Conditionals" let tmpl = TypeConName ["Iou"] choice = ChoiceName "FailA" field = FieldName "content" - verify condDar False tmpl choice tmpl field >>= \case + verify condDar debug tmpl choice tmpl field >>= \case Success -> assertFailure "Verification wrongfully passed for FailA - content" Unknown -> assertFailure "Verification inconclusive for FailA - content" Fail _ -> return () @@ -90,8 +88,11 @@ conditionalTests = testGroup "Conditionals" let tmpl = TypeConName ["Iou"] choice = ChoiceName "FailB" field = FieldName "content" - verify condDar False tmpl choice tmpl field >>= \case + verify condDar debug tmpl choice tmpl field >>= \case Success -> assertFailure "Verification wrongfully passed for FailB - content" Unknown -> assertFailure "Verification inconclusive for FailB - content" Fail _ -> return () ] + +debug :: String -> IO () +debug _ = return () From c791f31f13a9eac48c2304271b6d14b585503a17 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Thu, 14 May 2020 17:25:42 +0200 Subject: [PATCH 37/50] Apply suggestions from code review Co-authored-by: Moritz Kiefer --- .../daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs | 12 ++++-------- .../daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs | 8 ++++---- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index bcde8bd51fa2..8bf42da28321 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -84,11 +84,7 @@ data Cond a | Conditional BoolExpr a (Maybe a) -- ^ Conditional value, with a (Boolean) condition, a value in case the -- condition holds, and possibly a value in case it doesn't. - deriving Show - -instance Functor Cond where - fmap f (Determined x) = Determined (f x) - fmap f (Conditional e x y) = Conditional e (f x) (f <$> y) + deriving (Show, Functor) -- | Shift the conditional inside the update set. introCond :: Cond (UpdateSet ph) -> UpdateSet ph @@ -133,7 +129,7 @@ data Upd } deriving Show --- | Data type denoting an exercised choice update. +-- | Data type denoting an exercised choice. data UpdChoice = UpdChoice { _choTemp :: !(Qualified TypeConName) -- ^ Qualified type constructor corresponding to the contract template. @@ -489,8 +485,8 @@ extRecEnvLvl1 = mapM_ step -- TODO: Temporary fix `catchError` (\_ -> return ()) --- | Lookup an expression variable in the environment. Succeeds if this variable --- has been skolemised, or throws an error if it hasn't. +-- | Lookup an expression variable in the environment. Returns `True` if this variable +-- has been skolemised, or `False` otherwise. lookupVar :: MonadEnv m ph => ExprVarName -- ^ The expression variable to look up. diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 3db8bc021022..da720b0def67 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -64,7 +64,7 @@ instance Pretty ConstraintExpr where <+> " else " <+> pretty e3 pretty (CWhen e1 e2) = "when " <+> pretty e1 <+> " then " <+> pretty e2 --- | Class covering the types converteable to constraint expressions. +-- | Class covering the types convertible to constraint expressions. class ConstrExpr a where -- | Convert the given data type to a constraint expression. toCExp :: [(ExprVarName, ExprVarName)] @@ -148,9 +148,9 @@ data ConstraintSet = ConstraintSet { _cVars :: ![ExprVarName] -- ^ The variables to be declared. , _cCres :: ![ConstraintExpr] - -- ^ The field values of all newly created instances. + -- ^ The field values of all newly created contracts. , _cArcs :: ![ConstraintExpr] - -- ^ The field values of all archived instances. + -- ^ The field values of all archived contracts. , _cCtrs :: ![(ConstraintExpr, ConstraintExpr)] -- ^ Additional equality constraints. } @@ -206,7 +206,7 @@ filterVars :: [ExprVarName] -- ^ The constraint expressions in which the skolems should occur. -> [ExprVarName] filterVars vars cexprs = - let freevars = foldl (\fv e -> fv `union` gatherFreeVars e) [] cexprs + let freevars = foldl' (\fv e -> fv `union` gatherFreeVars e) [] cexprs in freevars `intersect` vars -- | Construct a list of all contract name synonyms, along with their current From ba1fad5e3eb30c59b2169bb7b73e13d97f5ed070 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Thu, 14 May 2020 17:28:11 +0200 Subject: [PATCH 38/50] Small fix: Add missing import --- compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index da720b0def67..1df347ad83e6 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -13,7 +13,7 @@ module DA.Daml.LF.Verify.Solve import Data.Bifunctor import Data.Maybe (fromJust, maybeToList) -import Data.List (lookup, union, intersect, partition, (\\), nub) +import Data.List (lookup, union, intersect, partition, (\\), nub, foldl') import Data.Tuple.Extra (both) import Data.Text.Prettyprint.Doc import qualified Data.HashMap.Strict as HM From 344eca87b93cd6085b72fa0807b41f5ff9befbb2 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Fri, 15 May 2020 13:04:13 +0200 Subject: [PATCH 39/50] Small fix: convert numerics --- compiler/daml-lf-ast/src/DA/Daml/LF/Ast/Numeric.hs | 2 +- compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/compiler/daml-lf-ast/src/DA/Daml/LF/Ast/Numeric.hs b/compiler/daml-lf-ast/src/DA/Daml/LF/Ast/Numeric.hs index 4b5dad234948..23293e2327a0 100644 --- a/compiler/daml-lf-ast/src/DA/Daml/LF/Ast/Numeric.hs +++ b/compiler/daml-lf-ast/src/DA/Daml/LF/Ast/Numeric.hs @@ -3,7 +3,7 @@ -- | DAML-LF Numeric literals, with scale attached. module DA.Daml.LF.Ast.Numeric - ( Numeric + ( Numeric (..) , NumericError (..) , E10 , numeric diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 1df347ad83e6..07a31a53e13b 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -21,6 +21,7 @@ import qualified Data.Text as T import qualified SimpleSMT as S import DA.Daml.LF.Ast.Base +import DA.Daml.LF.Ast.Numeric import DA.Daml.LF.Verify.Context -- TODO: Since S.SExpr is so similar, we could just drop this. @@ -102,8 +103,7 @@ instance ConstrExpr Expr where toCExp syns (ELocation _ e) = toCExp syns e toCExp _syns (EBuiltin (BEBool b)) = CBool b toCExp _syns (EBuiltin (BEInt64 i)) = CInt $ toInteger i - -- TODO - -- toCExp syns (EBuiltin (BENumeric i)) = CReal i + toCExp _syns (EBuiltin (BENumeric i)) = CReal $ toRational $ numericDecimal i toCExp _syns e = error ("Conversion: " ++ show e) instance ConstrExpr a => ConstrExpr (Cond a) where @@ -286,7 +286,7 @@ cexp2sexp vars (CWhen ce1 ce2) = do se1 <- cexp2sexp vars ce1 se2 <- cexp2sexp vars ce2 -- TODO: Temporary hack - return $ S.ite se1 se2 (S.real 0) + return $ S.ite se1 se2 (S.real 0.0) -- | Declare a list of variables for the SMT solver. Returns a list of the -- declared variables, together with their corresponding SMT counterparts. @@ -395,8 +395,8 @@ solveConstr spath debug ConstraintSet{..} = do vars1 <- declareVars sol $ filterVars _cVars (_cCres ++ _cArcs) vars2 <- declareCtrs sol debug vars1 _cCtrs let vars = vars1 ++ vars2 - cre <- foldl S.add (S.real 0) <$> mapM (cexp2sexp vars) _cCres - arc <- foldl S.add (S.real 0) <$> mapM (cexp2sexp vars) _cArcs + cre <- foldl S.add (S.real 0.0) <$> mapM (cexp2sexp vars) _cCres + arc <- foldl S.add (S.real 0.0) <$> mapM (cexp2sexp vars) _cArcs S.assert sol (S.not (cre `S.eq` arc)) S.check sol >>= \case S.Sat -> do From 1cdf6e4be05a943001f54312cf36b6bb3ff56572 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Fri, 15 May 2020 15:18:35 +0200 Subject: [PATCH 40/50] Replace PRSelf with correct package reference --- .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 51 ++++++++++++++++-- .../src/DA/Daml/LF/Verify/Context.hs | 41 +++----------- .../src/DA/Daml/LF/Verify/Generate.hs | 13 +++-- .../src/DA/Daml/LF/Verify/Solve.hs | 14 ++--- .../src/DA/Daml/LF/Verify/Subst.hs | 54 +++++++++++++++++++ 5 files changed, 125 insertions(+), 48 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index f641818fb3d2..c93691b87cb4 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -9,7 +9,9 @@ module DA.Daml.LF.Verify , verify ) where -import Data.Text +import Data.Maybe (maybe, listToMaybe, catMaybes) +import qualified Data.NameMap as NM +import Data.Text hiding (map, null, filter) import Data.Text.Prettyprint.Doc import Data.Text.Prettyprint.Doc.Render.String import Options.Applicative @@ -40,7 +42,7 @@ outputError :: Error -- ^ The error message. -> String -- ^ An additional message providing context. - -> IO Result + -> IO a outputError err msg = do hPutStrLn stderr msg hPutStrLn stderr (show err) @@ -60,10 +62,13 @@ verify :: FilePath -> FieldName -- ^ The field to be verified. -> IO Result -verify dar debug choiceTmpl choiceName fieldTmpl fieldName = do +verify dar debug choiceTmplName choiceName fieldTmplName fieldName = do -- Read the packages to analyse, and initialise the provided solver. pkgs <- readPackages [dar] solver <- getSolver + -- Find the given template names in the packages. + choiceTmpl <- findTemplate pkgs choiceTmplName + fieldTmpl <- findTemplate pkgs fieldTmplName -- Start reading data type and value definitions. References to other -- values are just stored as references at this point. debug "Start value gathering" @@ -93,3 +98,43 @@ verify dar debug choiceTmpl choiceName fieldTmpl fieldName = do debug $ renderString $ layoutCompact ("Archive: " <+> pretty (_cArcs cset)) -- Pass the constraints to the SMT solver. solveConstr solver debug cset + where + -- | Lookup the first package that defines the given template. This avoids + -- having to pass in the package reference manually when using the tool. + findTemplate :: [(PackageId, (Package, Maybe PackageName))] + -- ^ The package from the DAR file. + -> TypeConName + -- ^ The template name. + -> IO (Qualified TypeConName) + findTemplate pkgs tem = maybe + (outputError (UnknownTmpl tem) "Parsing phase finished with error: ") + (\(pacid, mod) -> return $ Qualified (PRImport pacid) mod tem) + (listToMaybe $ catMaybes $ map (templateInPackage tem) pkgs) + + -- | Return the package id and the name of the module containing the given + -- template, if it exists. + templateInPackage :: TypeConName + -- ^ The template to look for. + -> (PackageId, (Package, Maybe PackageName)) + -- ^ The package to look in. + -> Maybe (PackageId, ModuleName) + templateInPackage tem (id, (pac,_)) = + case templateInModules tem $ NM.toList $ packageModules pac of + Nothing -> Nothing + Just mod -> Just (id, mod) + + -- | Return the name of the module containing the given template, if it + -- exists. + templateInModules :: TypeConName + -- ^ The template to look for. + -> [Module] + -- ^ The modules to look in. + -> Maybe ModuleName + templateInModules tem mods = + listToMaybe $ catMaybes $ + map ( \Module{..} -> + let tmpls = NM.toList moduleTemplates + in if null (filter (\Template{..} -> tplTypeCon == tem) tmpls) + then Nothing + else Just moduleName ) + mods diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 8bf42da28321..8c909b7b2771 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -36,7 +36,6 @@ module DA.Daml.LF.Verify.Context , conditionalUpdateSet , solveValueReferences , solveChoiceReferences - , lookupChoInHMap , fieldName2VarName , recTypConFields, recTypFields, recExpFields ) where @@ -45,7 +44,7 @@ import Control.Monad.Error.Class (MonadError (..), throwError) import Control.Monad.State.Lazy import Data.Hashable import GHC.Generics -import Data.Maybe (listToMaybe, isJust, fromMaybe) +import Data.Maybe (isJust, fromMaybe) import Data.List (find) import Data.Bifunctor import qualified Data.HashMap.Strict as HM @@ -525,7 +524,7 @@ lookupVal val = do EnvVG{..} -> return _envvgvals EnvCG{..} -> return _envcgvals EnvS{..} -> return _envsvals - case lookupValInHMap vals val of + case HM.lookup val vals of Just res -> return res Nothing -> throwError (UnknownValue val) @@ -543,7 +542,7 @@ lookupChoice tem ch = do EnvVG{..} -> return HM.empty EnvCG{..} -> return _envcgchs EnvS{..} -> return _envschs - case lookupChoInHMap chs (qualObject tem) ch of + case HM.lookup (UpdChoice tem ch) chs of Nothing -> throwError (UnknownChoice ch) Just ChoiceData{..} -> return (_cdUpds, _cdType) @@ -577,32 +576,6 @@ lookupCid exp = do Nothing -> throwError $ UnknownCid cid Just var -> return var --- TODO: There seems to be something wrong with the PackageRef in Qualified. --- | Helper function to lookup a value definition in a HashMap. -lookupValInHMap :: HM.HashMap (Qualified ExprValName) (Expr, UpdateSet ph) - -- ^ The HashMap in which to look. - -> Qualified ExprValName - -- ^ The value name to lookup. - -> Maybe (Expr, UpdateSet ph) -lookupValInHMap hmap val = listToMaybe $ HM.elems - $ HM.filterWithKey (\name _ -> qualObject name == qualObject val && qualModule name == qualModule val) hmap - --- TODO: Does this really need to be a seperate function? --- | Helper function to lookup a choice in a HashMap. Returns the variables for --- self, this and args used, as well as a function which, given the values for --- self, this and args, produces the list of updates performed by this choice. -lookupChoInHMap :: HM.HashMap UpdChoice (ChoiceData ph) - -- ^ The HashMap in which to look. - -> TypeConName - -- ^ The template in which the choice is defined. - -> ChoiceName - -- ^ The choice name to lookup. - -> Maybe (ChoiceData ph) --- TODO: This TypeConName should be qualified --- TODO: The type con name really should be taken into account here -lookupChoInHMap hmap _tem cho = listToMaybe $ HM.elems - $ HM.filterWithKey (\upd _ -> _choName upd == cho) hmap - -- | Solves the value references by computing the closure of all referenced -- values, for each value in the environment. -- It thus empties `_usValue` by collecting all updates made by this closure. @@ -615,7 +588,7 @@ solveValueReferences EnvVG{..} = -> HM.HashMap (Qualified ExprValName) (Expr, UpdateSet 'ValueGathering) -> (Expr, UpdateSet 'ValueGathering) lookup_ref ref hmap = fromMaybe (error "Impossible: Undefined value ref while solving") - (lookupValInHMap hmap ref) + (HM.lookup ref hmap) get_refs :: (Expr, UpdateSet 'ValueGathering) -> ([Cond (Qualified ExprValName)], (Expr, UpdateSet 'ValueGathering)) @@ -654,8 +627,8 @@ solveChoiceReferences EnvCG{..} = lookup_ref :: UpdChoice -> HM.HashMap UpdChoice (ChoiceData 'ChoiceGathering) -> ChoiceData 'ChoiceGathering - lookup_ref UpdChoice{..} hmap = fromMaybe (error "Impossible: Undefined choice ref while solving") - (lookupChoInHMap hmap (qualObject _choTemp) _choName) + lookup_ref upd hmap = fromMaybe (error "Impossible: Undefined choice ref while solving") + (HM.lookup upd hmap) get_refs :: (ChoiceData 'ChoiceGathering) -> ([Cond UpdChoice], ChoiceData 'ChoiceGathering) @@ -848,6 +821,7 @@ data Error | UnboundVar ExprVarName | UnknownRecField FieldName | UnknownCid Cid + | UnknownTmpl TypeConName | ExpectRecord | ExpectCid | CyclicModules [ModuleName] @@ -860,6 +834,7 @@ instance Show Error where show (UnboundVar name) = "Impossible: Unbound term variable: " ++ show name show (UnknownRecField f) = "Impossible: Unknown record field: " ++ show f show (UnknownCid cid) = "Impossible: Unknown contract id: " ++ show cid + show (UnknownTmpl tem) = "Impossible: Unknown template: " ++ show tem show ExpectRecord = "Impossible: Expected a record type" show ExpectCid = "Impossible: Expected a contract id" show (CyclicModules mods) = "Cyclic modules: " ++ show mods diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index eda215046956..078f4a95fb13 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -114,14 +114,16 @@ genValue :: (GenPhase ph, MonadEnv m ph) -- ^ The value to be analysed and added. -> m () genValue pac mod val = do - expOut <- genExpr True (dvalBody val) + expOut <- genExpr True (instPRSelf pac $ dvalBody val) let qname = Qualified pac mod (fst $ dvalBinder val) extValEnv qname (_oExpr expOut) (_oUpdate expOut) -- | Analyse a choice definition and add to the environment. -- TODO: Handle annotated choices, by returning a set of annotations. genChoice :: MonadEnv m 'ChoiceGathering - => Qualified TypeConName + => PackageRef + -- ^ A reference to the package in which this choice is defined. + -> Qualified TypeConName -- ^ The template in which this choice is defined. -> (ExprVarName,ExprVarName) -- ^ The original and renamed variable `this` referencing the contract on @@ -131,7 +133,7 @@ genChoice :: MonadEnv m 'ChoiceGathering -> TemplateChoice -- ^ The choice to be analysed and added. -> m () -genChoice tem (this',this) temFs TemplateChoice{..} = do +genChoice pac tem (this',this) temFs TemplateChoice{..} = do let self' = chcSelfBinder arg' = fst chcArgBinder self <- genRenamedVar self' @@ -141,7 +143,8 @@ genChoice tem (this',this) temFs TemplateChoice{..} = do argFs <- recTypFields (snd chcArgBinder) extRecEnv arg argFs expOut <- genExpr True - $ substituteTm (createExprSubst [(self',EVar self),(this',EVar this),(arg',EVar arg)]) chcUpdate + $ substituteTm (createExprSubst [(self',EVar self),(this',EVar this),(arg',EVar arg)]) + $ instPRSelf pac chcUpdate let out = if chcConsuming then addArchiveUpd tem fields expOut else expOut @@ -167,7 +170,7 @@ genTemplate pac mod Template{..} = do extVarEnv this extRecEnv this fs extRecEnvLvl1 fields - mapM_ (genChoice name (tplParam,this) fs) (archive : NM.toList tplChoices) + mapM_ (genChoice pac name (tplParam,this) fs) (archive : NM.toList tplChoices) where archive :: TemplateChoice archive = TemplateChoice Nothing (ChoiceName "Archive") True diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 07a31a53e13b..515c89cbaaa5 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -159,7 +159,7 @@ data ConstraintSet = ConstraintSet -- | Filters a single update to match the given template, and takes out the -- field of interest. The update gets converted into a constraint expression. -- It returns either a create or an archive update. -filterUpd :: TypeConName +filterUpd :: Qualified TypeConName -- ^ The template name to filter against. -> [(ExprVarName, ExprVarName)] -- ^ The contract name synonyms, along with their current alias. @@ -168,16 +168,16 @@ filterUpd :: TypeConName -> Upd -- ^ The update expression to convert and filter. -> (Maybe ConstraintExpr, Maybe ConstraintExpr) -filterUpd tem syns f UpdCreate{..} = if tem == qualObject _creTemp +filterUpd tem syns f UpdCreate{..} = if tem == _creTemp then (Just (toCExp syns $ fromJust $ lookup f _creField), Nothing) else (Nothing, Nothing) -filterUpd tem syns f UpdArchive{..} = if tem == qualObject _arcTemp +filterUpd tem syns f UpdArchive{..} = if tem == _arcTemp then (Nothing, Just (toCExp syns $ fromJust $ lookup f _arcField)) else (Nothing, Nothing) -- | Filters and converts a conditional update into (possibly two) constraint -- expressions, while splitting it into create and archive updates. -filterCondUpd :: TypeConName +filterCondUpd :: Qualified TypeConName -- ^ The template name to filter against -> [(ExprVarName, ExprVarName)] -- ^ The contract name synonyms, along with their current alias. @@ -224,17 +224,17 @@ constructSynonyms = foldl step [] -- the template name, the choice and field to be verified. constructConstr :: Env 'Solving -- ^ The generator environment to convert. - -> TypeConName + -> Qualified TypeConName -- ^ The template name of the choice to be verified. -> ChoiceName -- ^ The choice name to be verified. - -> TypeConName + -> Qualified TypeConName -- ^ The template name of the field to be verified. -> FieldName -- ^ The field name to be verified. -> ConstraintSet constructConstr env chtem ch ftem f = - case lookupChoInHMap (_envschs env) chtem ch of + case HM.lookup (UpdChoice chtem ch) (_envschs env) of Just ChoiceData{..} -> let upds = _ussUpdate $ _cdUpds (EVar _cdSelf) (EVar _cdThis) (EVar _cdArgs) vars = concatMap skol2var (_envsskol env) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs index 902f10bbfec2..32929048fbaf 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Subst.hs @@ -9,6 +9,7 @@ module DA.Daml.LF.Verify.Subst , createExprSubst , SubstTm(..) , SubstTy(..) + , InstPR(..) ) where import Control.Lens hiding (Context) @@ -155,3 +156,56 @@ instance SubstTy TypeConApp where instance SubstTy CaseAlternative where substituteTy s (CaseAlternative p e) = CaseAlternative p (substituteTy s e) + +-- | A class covering the data types containing package references which can be +-- instantiated.. +class InstPR a where + -- | Instantiate `PRSelf` with the given package reference. + instPRSelf :: PackageRef + -- ^ The package reference to substitute with. + -> a + -- ^ The data type to substitute in. + -> a + +instance InstPR (Qualified a) where + instPRSelf pac qx@(Qualified pac' mod x) = case pac' of + PRSelf -> Qualified pac mod x + _ -> qx + +instance InstPR Expr where + instPRSelf pac = \case + EVal val -> EVal (instPRSelf pac val) + ERecCon t fs -> ERecCon t $ map (over _2 (instPRSelf pac)) fs + ERecProj t f e -> ERecProj t f $ instPRSelf pac e + ERecUpd t f e1 e2 -> ERecUpd t f (instPRSelf pac e1) (instPRSelf pac e2) + EVariantCon t v e -> EVariantCon t v (instPRSelf pac e) + EStructCon fs -> EStructCon $ map (over _2 (instPRSelf pac)) fs + EStructProj f e -> EStructProj f (instPRSelf pac e) + EStructUpd f e1 e2 -> EStructUpd f (instPRSelf pac e1) (instPRSelf pac e2) + ETmApp e1 e2 -> ETmApp (instPRSelf pac e1) (instPRSelf pac e2) + ETyApp e t -> ETyApp (instPRSelf pac e) t + ETmLam b e -> ETmLam b (instPRSelf pac e) + ETyLam b e -> ETyLam b (instPRSelf pac e) + ECase e cs -> ECase (instPRSelf pac e) + $ map (\CaseAlternative{..} -> CaseAlternative altPattern (instPRSelf pac altExpr)) cs + ELet Binding{..} e -> ELet (Binding bindingBinder $ instPRSelf pac bindingBound) + (instPRSelf pac e) + ECons t e1 e2 -> ECons t (instPRSelf pac e1) (instPRSelf pac e2) + ESome t e -> ESome t (instPRSelf pac e) + EToAny t e -> EToAny t (instPRSelf pac e) + EFromAny t e -> EFromAny t (instPRSelf pac e) + EUpdate u -> EUpdate $ instPRSelf pac u + ELocation l e -> ELocation l (instPRSelf pac e) + e -> e + +instance InstPR Update where + instPRSelf pac = \case + UPure t e -> UPure t (instPRSelf pac e) + UBind Binding{..} e -> UBind (Binding bindingBinder $ instPRSelf pac bindingBound) + (instPRSelf pac e) + UCreate tem arg -> UCreate (instPRSelf pac tem) (instPRSelf pac arg) + UExercise tem ch cid act arg -> UExercise (instPRSelf pac tem) ch + (instPRSelf pac cid) (instPRSelf pac <$> act) (instPRSelf pac arg) + UFetch tem cid -> UFetch (instPRSelf pac tem) (instPRSelf pac cid) + UEmbedExpr t e -> UEmbedExpr t (instPRSelf pac e) + u -> u From cdbed0916c9854a227a0c5bf0378ba3bf4140302 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Fri, 15 May 2020 15:29:31 +0200 Subject: [PATCH 41/50] Style fixes --- compiler/daml-lf-verify/BUILD.bazel | 7 ++--- .../daml/conditionals/.dlint.yaml | 4 +++ .../daml/conditionals/daml.yaml | 4 +++ .../daml/conditionals/daml/Iou.daml | 2 +- .../daml/conditionals/daml/Main.daml | 2 +- .../daml/conditionals/daml/Setup.daml | 2 +- .../daml/conditionals/frontend-config.js | 2 +- .../digitalasset/quickstart/iou/IouMain.java | 2 +- .../daml/quickstart/.dlint.yaml | 4 +++ .../daml-lf-verify/daml/quickstart/daml.yaml | 4 +++ .../daml/quickstart/daml/Iou.daml | 2 +- .../daml/quickstart/daml/IouTrade.daml | 2 +- .../daml/quickstart/daml/Main.daml | 2 +- .../daml/quickstart/daml/Tests/Iou.daml | 2 +- .../daml/quickstart/daml/Tests/Trade.daml | 2 +- .../daml/quickstart/frontend-config.js | 2 +- .../digitalasset/quickstart/iou/IouMain.java | 2 +- .../daml-lf-verify/src/DA/Daml/LF/Verify.hs | 28 +++++++++---------- .../src/DA/Daml/LF/Verify/Context.hs | 10 +++---- .../src/DA/Daml/LF/Verify/Generate.hs | 2 +- .../src/DA/Daml/LF/Verify/Solve.hs | 9 +++--- 21 files changed, 56 insertions(+), 40 deletions(-) diff --git a/compiler/daml-lf-verify/BUILD.bazel b/compiler/daml-lf-verify/BUILD.bazel index 254ca78df196..5d7b87496356 100644 --- a/compiler/daml-lf-verify/BUILD.bazel +++ b/compiler/daml-lf-verify/BUILD.bazel @@ -94,21 +94,21 @@ da_haskell_library( daml_compile( name = "quickstart", srcs = glob(["daml/quickstart/**/*.daml"]), - version = "1.0.0" + version = "1.0.0", ) daml_compile( name = "conditionals", srcs = glob(["daml/conditionals/**/*.daml"]), - version = "1.0.0" + version = "1.0.0", ) da_haskell_test( name = "verify-tests", srcs = glob(["tests/**/*.hs"]), data = [ - ":quickstart.dar", ":conditionals.dar", + ":quickstart.dar", ], hackage_deps = [ "base", @@ -128,4 +128,3 @@ da_haskell_test( "//libs-haskell/test-utils", ], ) - diff --git a/compiler/daml-lf-verify/daml/conditionals/.dlint.yaml b/compiler/daml-lf-verify/daml/conditionals/.dlint.yaml index add1b6066c20..af7bafc6d33e 100644 --- a/compiler/daml-lf-verify/daml/conditionals/.dlint.yaml +++ b/compiler/daml-lf-verify/daml/conditionals/.dlint.yaml @@ -1,3 +1,6 @@ +# Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + # This file controls the behaviour of the dlint linting tool. Below are two # examples of how to enable or disable a rule. @@ -6,3 +9,4 @@ # This rule is disabled by default. Uncomment to enable. #- suggest: {name: Use module export list} + diff --git a/compiler/daml-lf-verify/daml/conditionals/daml.yaml b/compiler/daml-lf-verify/daml/conditionals/daml.yaml index 6d760fc351d1..b76748a081d9 100644 --- a/compiler/daml-lf-verify/daml/conditionals/daml.yaml +++ b/compiler/daml-lf-verify/daml/conditionals/daml.yaml @@ -1,3 +1,6 @@ +# Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + # sdk-version: 0.13.55 sdk-version: 1.0.1 name: quickstart @@ -15,3 +18,4 @@ dependencies: - daml-prim - daml-stdlib - daml-script + diff --git a/compiler/daml-lf-verify/daml/conditionals/daml/Iou.daml b/compiler/daml-lf-verify/daml/conditionals/daml/Iou.daml index 6cc0393785dd..ddaa16544748 100644 --- a/compiler/daml-lf-verify/daml/conditionals/daml/Iou.daml +++ b/compiler/daml-lf-verify/daml/conditionals/daml/Iou.daml @@ -1,4 +1,4 @@ --- Copyright (c) 2020 The DAML Authors. All rights reserved. +-- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -- SPDX-License-Identifier: Apache-2.0 diff --git a/compiler/daml-lf-verify/daml/conditionals/daml/Main.daml b/compiler/daml-lf-verify/daml/conditionals/daml/Main.daml index ecf17cc46a5b..305db39c3cbd 100644 --- a/compiler/daml-lf-verify/daml/conditionals/daml/Main.daml +++ b/compiler/daml-lf-verify/daml/conditionals/daml/Main.daml @@ -1,4 +1,4 @@ --- Copyright (c) 2020 The DAML Authors. All rights reserved. +-- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -- SPDX-License-Identifier: Apache-2.0 diff --git a/compiler/daml-lf-verify/daml/conditionals/daml/Setup.daml b/compiler/daml-lf-verify/daml/conditionals/daml/Setup.daml index 06650c0bab7a..ae107320dd34 100644 --- a/compiler/daml-lf-verify/daml/conditionals/daml/Setup.daml +++ b/compiler/daml-lf-verify/daml/conditionals/daml/Setup.daml @@ -1,4 +1,4 @@ --- Copyright (c) 2020 The DAML Authors. All rights reserved. +-- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -- SPDX-License-Identifier: Apache-2.0 module Setup where diff --git a/compiler/daml-lf-verify/daml/conditionals/frontend-config.js b/compiler/daml-lf-verify/daml/conditionals/frontend-config.js index 6c5986fa98d1..cee39e055a63 100644 --- a/compiler/daml-lf-verify/daml/conditionals/frontend-config.js +++ b/compiler/daml-lf-verify/daml/conditionals/frontend-config.js @@ -1,4 +1,4 @@ -// Copyright (c) 2020 The DAML Authors. All rights reserved. +// Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. // SPDX-License-Identifier: Apache-2.0 import { DamlLfValue } from '@da/ui-core'; diff --git a/compiler/daml-lf-verify/daml/conditionals/src/main/java/com/digitalasset/quickstart/iou/IouMain.java b/compiler/daml-lf-verify/daml/conditionals/src/main/java/com/digitalasset/quickstart/iou/IouMain.java index 33ae2e4e0703..d4171fb15bc3 100644 --- a/compiler/daml-lf-verify/daml/conditionals/src/main/java/com/digitalasset/quickstart/iou/IouMain.java +++ b/compiler/daml-lf-verify/daml/conditionals/src/main/java/com/digitalasset/quickstart/iou/IouMain.java @@ -1,4 +1,4 @@ -// Copyright (c) 2020 The DAML Authors. All rights reserved. +// Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. // SPDX-License-Identifier: Apache-2.0 package com.digitalasset.quickstart.iou; diff --git a/compiler/daml-lf-verify/daml/quickstart/.dlint.yaml b/compiler/daml-lf-verify/daml/quickstart/.dlint.yaml index add1b6066c20..af7bafc6d33e 100644 --- a/compiler/daml-lf-verify/daml/quickstart/.dlint.yaml +++ b/compiler/daml-lf-verify/daml/quickstart/.dlint.yaml @@ -1,3 +1,6 @@ +# Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + # This file controls the behaviour of the dlint linting tool. Below are two # examples of how to enable or disable a rule. @@ -6,3 +9,4 @@ # This rule is disabled by default. Uncomment to enable. #- suggest: {name: Use module export list} + diff --git a/compiler/daml-lf-verify/daml/quickstart/daml.yaml b/compiler/daml-lf-verify/daml/quickstart/daml.yaml index 2a8ead4555be..b8166910f0bc 100644 --- a/compiler/daml-lf-verify/daml/quickstart/daml.yaml +++ b/compiler/daml-lf-verify/daml/quickstart/daml.yaml @@ -1,3 +1,6 @@ +# Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + sdk-version: 1.0.1 name: quickstart source: daml @@ -13,3 +16,4 @@ exposed-modules: dependencies: - daml-prim - daml-stdlib + diff --git a/compiler/daml-lf-verify/daml/quickstart/daml/Iou.daml b/compiler/daml-lf-verify/daml/quickstart/daml/Iou.daml index eff39d605d6b..9bde3b1c5c69 100644 --- a/compiler/daml-lf-verify/daml/quickstart/daml/Iou.daml +++ b/compiler/daml-lf-verify/daml/quickstart/daml/Iou.daml @@ -1,4 +1,4 @@ --- Copyright (c) 2020 The DAML Authors. All rights reserved. +-- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -- SPDX-License-Identifier: Apache-2.0 diff --git a/compiler/daml-lf-verify/daml/quickstart/daml/IouTrade.daml b/compiler/daml-lf-verify/daml/quickstart/daml/IouTrade.daml index 3556961764d7..55acac3131d1 100644 --- a/compiler/daml-lf-verify/daml/quickstart/daml/IouTrade.daml +++ b/compiler/daml-lf-verify/daml/quickstart/daml/IouTrade.daml @@ -1,4 +1,4 @@ --- Copyright (c) 2020 The DAML Authors. All rights reserved. +-- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -- SPDX-License-Identifier: Apache-2.0 diff --git a/compiler/daml-lf-verify/daml/quickstart/daml/Main.daml b/compiler/daml-lf-verify/daml/quickstart/daml/Main.daml index 56120d39eb18..086584107a9c 100644 --- a/compiler/daml-lf-verify/daml/quickstart/daml/Main.daml +++ b/compiler/daml-lf-verify/daml/quickstart/daml/Main.daml @@ -1,4 +1,4 @@ --- Copyright (c) 2020 The DAML Authors. All rights reserved. +-- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -- SPDX-License-Identifier: Apache-2.0 diff --git a/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Iou.daml b/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Iou.daml index fa1089cf953f..0d5637fe466e 100644 --- a/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Iou.daml +++ b/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Iou.daml @@ -1,4 +1,4 @@ --- Copyright (c) 2020 The DAML Authors. All rights reserved. +-- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -- SPDX-License-Identifier: Apache-2.0 diff --git a/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Trade.daml b/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Trade.daml index 369a60b65936..53ee2f14ba88 100644 --- a/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Trade.daml +++ b/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Trade.daml @@ -1,4 +1,4 @@ --- Copyright (c) 2020 The DAML Authors. All rights reserved. +-- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -- SPDX-License-Identifier: Apache-2.0 diff --git a/compiler/daml-lf-verify/daml/quickstart/frontend-config.js b/compiler/daml-lf-verify/daml/quickstart/frontend-config.js index 6c5986fa98d1..cee39e055a63 100644 --- a/compiler/daml-lf-verify/daml/quickstart/frontend-config.js +++ b/compiler/daml-lf-verify/daml/quickstart/frontend-config.js @@ -1,4 +1,4 @@ -// Copyright (c) 2020 The DAML Authors. All rights reserved. +// Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. // SPDX-License-Identifier: Apache-2.0 import { DamlLfValue } from '@da/ui-core'; diff --git a/compiler/daml-lf-verify/daml/quickstart/src/main/java/com/digitalasset/quickstart/iou/IouMain.java b/compiler/daml-lf-verify/daml/quickstart/src/main/java/com/digitalasset/quickstart/iou/IouMain.java index 33ae2e4e0703..d4171fb15bc3 100644 --- a/compiler/daml-lf-verify/daml/quickstart/src/main/java/com/digitalasset/quickstart/iou/IouMain.java +++ b/compiler/daml-lf-verify/daml/quickstart/src/main/java/com/digitalasset/quickstart/iou/IouMain.java @@ -1,4 +1,4 @@ -// Copyright (c) 2020 The DAML Authors. All rights reserved. +// Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. // SPDX-License-Identifier: Apache-2.0 package com.digitalasset.quickstart.iou; diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs index c93691b87cb4..dc3be2772951 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify.hs @@ -9,9 +9,9 @@ module DA.Daml.LF.Verify , verify ) where -import Data.Maybe (maybe, listToMaybe, catMaybes) +import Data.Maybe import qualified Data.NameMap as NM -import Data.Text hiding (map, null, filter) +import qualified Data.Text as T import Data.Text.Prettyprint.Doc import Data.Text.Prettyprint.Doc.Render.String import Options.Applicative @@ -31,10 +31,10 @@ getSolver = locateRunfiles "z3_nix/bin/z3" main :: IO () main = do Options{..} <- execParser optionsParserInfo - let choiceTmpl = TypeConName [pack optChoiceTmpl] - choiceName = ChoiceName (pack optChoiceName) - fieldTmpl = TypeConName [pack optFieldTmpl] - fieldName = FieldName (pack optFieldName) + let choiceTmpl = TypeConName [T.pack optChoiceTmpl] + choiceName = ChoiceName (T.pack optChoiceName) + fieldTmpl = TypeConName [T.pack optFieldTmpl] + fieldName = FieldName (T.pack optFieldName) result <- verify optInputDar putStrLn choiceTmpl choiceName fieldTmpl fieldName print result @@ -45,7 +45,7 @@ outputError :: Error -> IO a outputError err msg = do hPutStrLn stderr msg - hPutStrLn stderr (show err) + hPrint stderr err exitFailure -- | Execute the full verification pipeline. @@ -109,7 +109,7 @@ verify dar debug choiceTmplName choiceName fieldTmplName fieldName = do findTemplate pkgs tem = maybe (outputError (UnknownTmpl tem) "Parsing phase finished with error: ") (\(pacid, mod) -> return $ Qualified (PRImport pacid) mod tem) - (listToMaybe $ catMaybes $ map (templateInPackage tem) pkgs) + (listToMaybe $ mapMaybe (templateInPackage tem) pkgs) -- | Return the package id and the name of the module containing the given -- template, if it exists. @@ -131,10 +131,10 @@ verify dar debug choiceTmplName choiceName fieldTmplName fieldName = do -- ^ The modules to look in. -> Maybe ModuleName templateInModules tem mods = - listToMaybe $ catMaybes $ - map ( \Module{..} -> - let tmpls = NM.toList moduleTemplates - in if null (filter (\Template{..} -> tplTypeCon == tem) tmpls) - then Nothing - else Just moduleName ) + listToMaybe $ + mapMaybe ( \Module{..} -> + let tmpls = NM.toList moduleTemplates + in if not (any (\Template{..} -> tplTypeCon == tem) tmpls) + then Nothing + else Just moduleName ) mods diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 8c909b7b2771..15b1a2afdce1 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -630,7 +630,7 @@ solveChoiceReferences EnvCG{..} = lookup_ref upd hmap = fromMaybe (error "Impossible: Undefined choice ref while solving") (HM.lookup upd hmap) - get_refs :: (ChoiceData 'ChoiceGathering) + get_refs :: ChoiceData 'ChoiceGathering -> ([Cond UpdChoice], ChoiceData 'ChoiceGathering) -- TODO: This is gonna result in a ton of substitutions get_refs chdat@ChoiceData{..} = @@ -646,8 +646,8 @@ solveChoiceReferences EnvCG{..} = -> ChoiceData 'ChoiceGathering ext_upds chdat1 chdat2 = let updfunc (selfexp :: Expr) (thisexp :: Expr) (argsexp :: Expr) = - (_cdUpds chdat1) selfexp thisexp argsexp `concatUpdateSet` - (_cdUpds chdat2) selfexp thisexp argsexp + _cdUpds chdat1 selfexp thisexp argsexp `concatUpdateSet` + _cdUpds chdat2 selfexp thisexp argsexp in chdat1{_cdUpds = updfunc} intro_cond :: Cond (ChoiceData ph) @@ -655,8 +655,8 @@ solveChoiceReferences EnvCG{..} = intro_cond (Determined x) = x intro_cond (Conditional cond chdatx y) = let updfunc (selfexp :: Expr) (thisexp :: Expr) (argsexp :: Expr) = - introCond (Conditional cond ((_cdUpds chdatx) selfexp thisexp argsexp) - ((\chdaty -> (_cdUpds chdaty) selfexp thisexp argsexp) <$> y)) + introCond (Conditional cond (_cdUpds chdatx selfexp thisexp argsexp) + ((\chdaty -> _cdUpds chdaty selfexp thisexp argsexp) <$> y)) in chdatx{_cdUpds = updfunc} inlineChoices :: HM.HashMap UpdChoice (ChoiceData 'Solving) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index 078f4a95fb13..b42cbb516f62 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -218,7 +218,7 @@ genUpdate = \case out <- genExpr True expr return (out, typ, Nothing) -- TODO: Extend additional cases - _ -> error $ "Update not implemented yet" + _ -> error "Update not implemented yet" -- | Analyse a term application expression. genForTmApp :: (GenPhase ph, MonadEnv m ph) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 515c89cbaaa5..589b81a55254 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -13,7 +13,8 @@ module DA.Daml.LF.Verify.Solve import Data.Bifunctor import Data.Maybe (fromJust, maybeToList) -import Data.List (lookup, union, intersect, partition, (\\), nub, foldl') +import Data.List +import Data.List.Extra (nubOrd) import Data.Tuple.Extra (both) import Data.Text.Prettyprint.Doc import qualified Data.HashMap.Strict as HM @@ -218,7 +219,7 @@ constructSynonyms = foldl step [] where step :: [(ExprVarName, ExprVarName)] -> (ExprVarName, [ExprVarName]) -> [(ExprVarName, ExprVarName)] - step acc (cur, prevs) = acc ++ map (\prev -> (prev, cur)) prevs + step acc (cur, prevs) = acc ++ map (, cur) prevs -- | Constructs a constraint set from the generator environment, together with -- the template name, the choice and field to be verified. @@ -321,7 +322,7 @@ declareCtrs sol debug cvars1 ctrs = do components useful_equalities = concatMap (map (\(l,r,_) -> (l,r))) useful_components required_vars = - ( nub (concatMap (concatMap (\(_,_,vars) -> vars)) useful_components) ) + nubOrd (concatMap (concatMap (\(_,_,vars) -> vars)) useful_components) \\ useful_nodes cvars2 <- declareVars sol required_vars mapM_ (declare $ cvars1 ++ cvars2) useful_equalities @@ -357,7 +358,7 @@ declareCtrs sol debug cvars1 ctrs = do declare vars (cexp1, cexp2) = do sexp1 <- cexp2sexp vars cexp1 sexp2 <- cexp2sexp vars cexp2 - debug ("Assert: " ++ (S.ppSExpr sexp1 (" = " ++ S.ppSExpr sexp2 ""))) + debug ("Assert: " ++ S.ppSExpr sexp1 (" = " ++ S.ppSExpr sexp2 "")) S.assert sol (sexp1 `S.eq` sexp2) -- | Data type denoting the outcome of the solver. From c62c276ae25098eb270d0acf247c2bcdf8ce293b Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Tue, 19 May 2020 13:20:08 +0200 Subject: [PATCH 42/50] Rework conditionals to remove When --- .../src/DA/Daml/LF/Verify/Context.hs | 146 +++++++++++++----- .../src/DA/Daml/LF/Verify/Generate.hs | 9 +- .../src/DA/Daml/LF/Verify/Solve.hs | 37 ++--- 3 files changed, 122 insertions(+), 70 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 15b1a2afdce1..39ff6210eb42 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -49,6 +49,7 @@ import Data.List (find) import Data.Bifunctor import qualified Data.HashMap.Strict as HM import qualified Data.Text as T +import Debug.Trace import DA.Daml.LF.Ast hiding (lookupChoice) import DA.Daml.LF.Verify.Subst @@ -80,35 +81,68 @@ data BoolExpr data Cond a = Determined a -- ^ Non-conditional value. - | Conditional BoolExpr a (Maybe a) - -- ^ Conditional value, with a (Boolean) condition, a value in case the - -- condition holds, and possibly a value in case it doesn't. + | Conditional BoolExpr [Cond a] [Cond a] + -- ^ Conditional value, with a (Boolean) condition, at least one value in case + -- the condition holds, and at least one value in case it doesn't. + -- Note that these branch lists should not be empty. + -- TODO: Encode this invariant in the type system? deriving (Show, Functor) +-- | Construct a simple conditional. +createCond :: BoolExpr + -- ^ The condition to depend on. + -> a + -- ^ The value in case the condition holds. + -> a + -- ^ The value in case the condition does not hold. + -> Cond a +createCond cond x y = Conditional cond [Determined x] [Determined y] + -- | Shift the conditional inside the update set. introCond :: Cond (UpdateSet ph) -> UpdateSet ph introCond (Determined upds) = upds -introCond (Conditional e updx updy) = case updx of +introCond (Conditional e updx updy) = case getPhase updx of UpdateSetVG{} -> UpdateSetVG - (concatCond $ Conditional e (_usvgUpdate updx) (_usvgUpdate <$> updy)) - (concatCond $ Conditional e (_usvgChoice updx) (_usvgChoice <$> updy)) - (concatCond $ Conditional e (_usvgValue updx) (_usvgValue <$> updy)) + (buildCond updx updy _usvgUpdate) + (buildCond updx updy _usvgChoice) + (buildCond updx updy _usvgValue) UpdateSetCG{} -> UpdateSetCG - (concatCond $ Conditional e (_uscgUpdate updx) (_uscgUpdate <$> updy)) - (concatCond $ Conditional e (_uscgChoice updx) (_uscgChoice <$> updy)) + (buildCond updx updy _uscgUpdate) + (buildCond updx updy _uscgChoice) UpdateSetS{} -> UpdateSetS - (concatCond $ Conditional e (_ussUpdate updx) (_ussUpdate <$> updy)) - --- | Flatten nested conditionals into a single level. -concatCond :: Cond [Cond a] -> [Cond a] -concatCond (Determined xs) = xs -concatCond (Conditional e xs mys) = case mys of - Just ys -> map (ext_cond e) xs ++ map (ext_cond (BNot e)) ys - Nothing -> map (ext_cond e) xs + (buildCond updx updy _ussUpdate) where - ext_cond :: BoolExpr -> Cond b -> Cond b - ext_cond e (Determined x) = Conditional e x Nothing - ext_cond e1 (Conditional e2 x y) = Conditional (BAnd e1 e2) x y + -- | Construct a single conditional, if the input is not empty. + buildCond :: [Cond (UpdateSet ph)] + -- ^ The input for the true case. + -> [Cond (UpdateSet ph)] + -- ^ The input for the false case. + -> (UpdateSet ph -> [Cond a]) + -- ^ The fetch function. + -> [Cond a] + buildCond updx updy get = + let xs = concatCond updx get + ys = concatCond updy get + in if null xs && null ys + then [] + else [Conditional e xs ys] + + -- TODO: Temporary solution. Make introCond a part of the GenPhase class instead. + getPhase :: [Cond (UpdateSet ph)] -> UpdateSet ph + getPhase lst = case head lst of + Determined upds -> upds + Conditional _ xs _ -> getPhase xs + +-- | Fetch the conditionals from the conditional update set, and flatten the +-- two layers into one. +concatCond :: [Cond (UpdateSet ph)] + -- ^ The conditional update set to fetch from. + -> (UpdateSet ph -> [Cond a]) + -- ^ The fetch function. + -> [Cond a] +concatCond upds get = + let upds' = map introCond upds + in concatMap get upds' -- | Data type denoting an update. data Upd @@ -203,11 +237,11 @@ conditionalUpdateSet :: Expr -- ^ The condition on which to combine the two update sets. -> UpdateSet ph -- ^ The update set in case the condition holds. - -> Maybe (UpdateSet ph) - -- ^ Possibly a second update set. + -> UpdateSet ph + -- ^ The update set in case the condition does not hold. -> UpdateSet ph conditionalUpdateSet exp upd1 upd2 = - introCond (Conditional (BExpr exp) upd1 upd2) + introCond $ createCond (BExpr exp) upd1 upd2 -- | Refresh a given expression variable by producing a fresh renamed variable. -- TODO: when a renamed var gets renamed again, it might overlap again. @@ -581,7 +615,7 @@ lookupCid exp = do -- It thus empties `_usValue` by collecting all updates made by this closure. solveValueReferences :: Env 'ValueGathering -> Env 'ChoiceGathering solveValueReferences EnvVG{..} = - let valhmap = foldl (\hmap ref -> snd $ solveReference lookup_ref get_refs ext_upds intro_cond [] hmap ref) _envvgvals (HM.keys _envvgvals) + let valhmap = foldl (\hmap ref -> snd $ solveReference lookup_ref get_refs ext_upds intro_cond empty_upds [] hmap ref) _envvgvals (HM.keys _envvgvals) in EnvCG _envvgskol (convertHMap valhmap) _envvgdats _envvgcids _envvgctrs HM.empty where lookup_ref :: Qualified ExprValName @@ -603,7 +637,17 @@ solveValueReferences EnvVG{..} = -- Note that the expression is not important here, as it will be ignored in -- `ext_upds` later on. intro_cond (Determined x) = x - intro_cond (Conditional cond (e,updx) y) = (e, introCond (Conditional cond updx (snd <$> y))) + intro_cond (Conditional cond cx cy) = + let xs = map intro_cond cx + ys = map intro_cond cy + e = fst $ head xs + updx = foldl concatUpdateSet emptyUpdateSet $ map snd xs + updy = foldl concatUpdateSet emptyUpdateSet $ map snd ys + in (e, introCond $ createCond cond updx updy) + + empty_upds :: (Expr, UpdateSet 'ValueGathering) + -> (Expr, UpdateSet 'ValueGathering) + empty_upds (e, _) = (e, emptyUpdateSet) convertHMap :: HM.HashMap (Qualified ExprValName) (Expr, UpdateSet 'ValueGathering) -> HM.HashMap (Qualified ExprValName) (Expr, UpdateSet 'ChoiceGathering) @@ -619,7 +663,7 @@ solveValueReferences EnvVG{..} = -- It thus empties `_usChoice` by collecting all updates made by this closure. solveChoiceReferences :: Env 'ChoiceGathering -> Env 'Solving solveChoiceReferences EnvCG{..} = - let chhmap = foldl (\hmap ref -> snd $ solveReference lookup_ref get_refs ext_upds intro_cond [] hmap ref) _envcgchs (HM.keys _envcgchs) + let chhmap = foldl (\hmap ref -> snd $ solveReference lookup_ref get_refs ext_upds intro_cond empty_upds [] hmap ref) _envcgchs (HM.keys _envcgchs) chshmap = convertChHMap chhmap valhmap = HM.map (inlineChoices chshmap) _envcgvals in EnvS _envcgskol valhmap _envcgdats _envcgcids _envcgctrs chshmap @@ -650,14 +694,28 @@ solveChoiceReferences EnvCG{..} = _cdUpds chdat2 selfexp thisexp argsexp in chdat1{_cdUpds = updfunc} - intro_cond :: Cond (ChoiceData ph) + intro_cond :: GenPhase ph + => Cond (ChoiceData ph) -> ChoiceData ph + -- Note that the expression and return type is not important here, as it + -- will be ignored in `ext_upds` later on. intro_cond (Determined x) = x - intro_cond (Conditional cond chdatx y) = - let updfunc (selfexp :: Expr) (thisexp :: Expr) (argsexp :: Expr) = - introCond (Conditional cond (_cdUpds chdatx selfexp thisexp argsexp) - ((\chdaty -> _cdUpds chdaty selfexp thisexp argsexp) <$> y)) - in chdatx{_cdUpds = updfunc} + intro_cond (Conditional cond cdatxs cdatys) = + let datxs = map intro_cond cdatxs + datys = map intro_cond cdatys + updfunc (selfexp :: Expr) (thisexp :: Expr) (argsexp :: Expr) = + introCond (createCond cond + (foldl + (\upd dat -> upd `concatUpdateSet` (_cdUpds dat selfexp thisexp argsexp)) + emptyUpdateSet datxs) + (foldl + (\upd dat -> upd `concatUpdateSet` (_cdUpds dat selfexp thisexp argsexp)) + emptyUpdateSet datys)) + in (head datxs){_cdUpds = updfunc} + + empty_upds :: ChoiceData 'ChoiceGathering + -> ChoiceData 'ChoiceGathering + empty_upds dat = dat{_cdUpds = \ _ _ _ -> emptyUpdateSet} inlineChoices :: HM.HashMap UpdChoice (ChoiceData 'Solving) -> (Expr, UpdateSet 'ChoiceGathering) @@ -690,6 +748,8 @@ solveReference :: forall updset ref. (Eq ref, Hashable ref) -- ^ Function for concatinating update sets. -> (Cond updset -> updset) -- ^ Function for moving conditionals inside the update set. + -> (updset -> updset) + -- ^ Function for emptying a given update set of all updates. -> [ref] -- ^ The references which have already been visited. -> HM.HashMap ref updset @@ -697,7 +757,7 @@ solveReference :: forall updset ref. (Eq ref, Hashable ref) -> ref -- ^ The reference to be solved. -> (updset, HM.HashMap ref updset) -solveReference lookup getRefs extUpds introCond vis hmap0 ref0 = +solveReference lookup getRefs extUpds introCond emptyUpds vis hmap0 ref0 = -- Lookup updates performed by the given reference, and split in new -- references and reference-free updates. let upd0 = lookup ref0 hmap0 @@ -706,7 +766,7 @@ solveReference lookup getRefs extUpds introCond vis hmap0 ref0 = -- reference should be flagged as recursive. in if ref0 `elem` vis -- TODO: Recursion! - then (upd1, hmap0) -- TODO: At least remove the references? + then trace "Recursion!" $ (upd1, hmap0) -- TODO: At least remove the references? -- When no recursion has been detected, continue inlining the references. else let (upd2, hmap1) = foldl handle_ref (upd1, hmap0) refs in (upd1, HM.insert ref0 upd2 hmap1) @@ -720,18 +780,20 @@ solveReference lookup getRefs extUpds introCond vis hmap0 ref0 = -> (updset, HM.HashMap ref updset) -- For a simple reference, the closure is computed straightforwardly. handle_ref (upd_i0, hmap_i0) (Determined ref_i) = - let (upd_i1, hmap_i1) = solveReference lookup getRefs extUpds introCond (ref0:vis) hmap_i0 ref_i + let (upd_i1, hmap_i1) = + solveReference lookup getRefs extUpds introCond emptyUpds (ref0:vis) hmap_i0 ref_i in (extUpds upd_i0 upd_i1, hmap_i1) -- A conditional reference is more involved, as the conditional needs to be -- preserved in the computed closure (update set). - handle_ref (upd_i0, hmap_i0) (Conditional cond ref_ia ref_ib) = + handle_ref (upd_i0, hmap_i0) (Conditional cond refs_ia refs_ib) = + -- Construct an update set without any updates. + let upd_i0_empty = emptyUpds upd_i0 -- Compute the closure for the true-case. - let (upd_ia, hmap_ia) = solveReference lookup getRefs extUpds introCond (ref0:vis) hmap_i0 ref_ia - -- Compute the closure for the false-case, when this case exists. - (upd_ib, hmap_ib) = maybe (Nothing, hmap_ia) - (first Just . solveReference lookup getRefs extUpds introCond (ref0:vis) hmap_ia) ref_ib + (upd_ia, hmap_ia) = foldl handle_ref (upd_i0_empty, hmap_i0) refs_ia + -- Compute the closure for the false-case. + (upd_ib, hmap_ib) = foldl handle_ref (upd_i0_empty, hmap_ia) refs_ib -- Move the conditional inwards, in the update set. - upd_i1 = extUpds upd_i0 $ introCond $ Conditional cond upd_ia upd_ib + upd_i1 = extUpds upd_i0 $ introCond $ createCond cond upd_ia upd_ib in (upd_i1, hmap_ib) -- TODO: This should work recursively @@ -797,7 +859,7 @@ instance SubstTm BoolExpr where instance SubstTm a => SubstTm (Cond a) where substituteTm s (Determined x) = Determined $ substituteTm s x substituteTm s (Conditional e x y) = - Conditional (substituteTm s e) (substituteTm s x) (substituteTm s y) + Conditional (substituteTm s e) (map (substituteTm s) x) (map (substituteTm s) y) instance SubstTm (UpdateSet ph) where substituteTm s UpdateSetVG{..} = UpdateSetVG susUpdate _usvgChoice _usvgValue diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index b42cbb516f62..20dae5e20d99 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -371,14 +371,9 @@ genForCase updFlag exp cs = do [ CaseAlternative (CPBool True) (_oExpr truOut) , CaseAlternative (CPBool False) (_oExpr falOut) ] resUpd = _oUpdate expOut `concatUpdateSet` - conditionalUpdateSet (_oExpr expOut) (_oUpdate truOut) (Just $ _oUpdate falOut) - return $ Output resExp resUpd - Nothing -> do - let resExp = ECase (_oExpr expOut) - [ CaseAlternative (CPBool True) (_oExpr truOut) ] - resUpd = _oUpdate expOut `concatUpdateSet` - conditionalUpdateSet (_oExpr expOut) (_oUpdate truOut) Nothing + conditionalUpdateSet (_oExpr expOut) (_oUpdate truOut) (_oUpdate falOut) return $ Output resExp resUpd + Nothing -> error "Impossible: Missing False-case in if statement" Nothing -> return $ emptyOut (ECase exp cs) where findBool :: Bool -> Maybe Expr diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index 589b81a55254..cdcaa462409d 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -12,7 +12,7 @@ module DA.Daml.LF.Verify.Solve ) where import Data.Bifunctor -import Data.Maybe (fromJust, maybeToList) +import Data.Maybe import Data.List import Data.List.Extra (nubOrd) import Data.Tuple.Extra (both) @@ -48,8 +48,6 @@ data ConstraintExpr | CNot !ConstraintExpr -- | If then else expression. | CIf !ConstraintExpr !ConstraintExpr !ConstraintExpr - -- | If then expression. - | CWhen !ConstraintExpr !ConstraintExpr deriving Show instance Pretty ConstraintExpr where @@ -64,7 +62,12 @@ instance Pretty ConstraintExpr where pretty (CNot e) = "not " <+> pretty e pretty (CIf e1 e2 e3) = "if " <+> pretty e1 <+> " then " <+> pretty e2 <+> " else " <+> pretty e3 - pretty (CWhen e1 e2) = "when " <+> pretty e1 <+> " then " <+> pretty e2 + +-- | Add a bunch of constraint expressions. +addMany :: [ConstraintExpr] -> ConstraintExpr +addMany [] = CReal 0.0 +addMany (x:[]) = x +addMany (x:xs) = CAdd x (addMany xs) -- | Class covering the types convertible to constraint expressions. class ConstrExpr a where @@ -109,8 +112,10 @@ instance ConstrExpr Expr where instance ConstrExpr a => ConstrExpr (Cond a) where toCExp syns (Determined x) = toCExp syns x - toCExp syns (Conditional b x Nothing) = CWhen (toCExp syns b) (toCExp syns x) - toCExp syns (Conditional b x (Just y)) = CIf (toCExp syns b) (toCExp syns x) (toCExp syns y) + -- TODO: Can we assume this should always be a sum? + toCExp syns (Conditional b x y) = CIf (toCExp syns b) + (addMany $ map (toCExp syns) x) + (addMany $ map (toCExp syns) y) -- | Gather all free variables in a constraint expression. gatherFreeVars :: ConstraintExpr @@ -127,7 +132,6 @@ gatherFreeVars (CAnd e1 e2) = gatherFreeVars e1 `union` gatherFreeVars e2 gatherFreeVars (CNot e) = gatherFreeVars e gatherFreeVars (CIf e1 e2 e3) = gatherFreeVars e1 `union` gatherFreeVars e2 `union` gatherFreeVars e3 -gatherFreeVars (CWhen e1 e2) = gatherFreeVars e1 `union` gatherFreeVars e2 -- | Gather the variable names bound within a skolem variable. skol2var :: Skolem @@ -188,16 +192,12 @@ filterCondUpd :: Qualified TypeConName -- ^ The conditional update expression to convert and filter. -> ([ConstraintExpr], [ConstraintExpr]) filterCondUpd tem syns f (Determined x) = both maybeToList $ filterUpd tem syns f x -filterCondUpd tem syns f (Conditional b x Nothing) = - let cb = toCExp syns b - in both (map (CWhen cb) . maybeToList) $ filterUpd tem syns f x -filterCondUpd tem syns f (Conditional b x (Just y)) = +filterCondUpd tem syns f (Conditional b xs ys) = let cb = toCExp syns b - (cxcre,cxarc) = both maybeToList $ filterUpd tem syns f x - (cycre,cyarc) = both maybeToList $ filterUpd tem syns f y - -- TODO: We should try to use an if here. - in ( map (CWhen cb) cxcre ++ map (CWhen (CNot cb)) cycre - , map (CWhen cb) cxarc ++ map (CWhen (CNot cb)) cyarc ) + (cxcre,cxarc) = both (addMany . concat) $ unzip $ map (filterCondUpd tem syns f) xs + (cycre,cyarc) = both (addMany . concat) $ unzip $ map (filterCondUpd tem syns f) ys + in ( [CIf cb cxcre cycre] + , [CIf cb cxarc cyarc] ) -- | Filter the given set of skolems, to only include those that occur in the -- given constraint expressions. Remove duplicates in the process. @@ -283,11 +283,6 @@ cexp2sexp vars (CIf ce1 ce2 ce3) = do se2 <- cexp2sexp vars ce2 se3 <- cexp2sexp vars ce3 return $ S.ite se1 se2 se3 -cexp2sexp vars (CWhen ce1 ce2) = do - se1 <- cexp2sexp vars ce1 - se2 <- cexp2sexp vars ce2 - -- TODO: Temporary hack - return $ S.ite se1 se2 (S.real 0.0) -- | Declare a list of variables for the SMT solver. Returns a list of the -- declared variables, together with their corresponding SMT counterparts. From ed91ada1af700d95c5aad0d3f94402d2a4e32094 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Tue, 19 May 2020 18:26:00 +0200 Subject: [PATCH 43/50] Cleanup test daml files --- .../daml/conditionals/.dlint.yaml | 12 - .../daml/conditionals/.gitignore | 1 - .../daml/conditionals/daml.yaml | 21 - .../daml/conditionals/daml/Main.daml | 7 - .../daml/conditionals/daml/Setup.daml | 6 - .../daml/conditionals/frontend-config.js | 385 ------------------ .../daml-lf-verify/daml/conditionals/pom.xml | 117 ------ .../digitalasset/quickstart/iou/IouMain.java | 143 ------- .../src/main/resources/logback.xml | 17 - .../daml/quickstart/.dlint.yaml | 12 - .../daml-lf-verify/daml/quickstart/.gitignore | 1 - .../daml-lf-verify/daml/quickstart/daml.yaml | 19 - .../daml/quickstart/daml/Main.daml | 40 -- .../daml/quickstart/daml/Tests/Iou.daml | 148 ------- .../daml/quickstart/daml/Tests/Trade.daml | 76 ---- .../daml/quickstart/frontend-config.js | 385 ------------------ .../daml-lf-verify/daml/quickstart/pom.xml | 117 ------ .../digitalasset/quickstart/iou/IouMain.java | 143 ------- .../quickstart/src/main/resources/logback.xml | 17 - 19 files changed, 1667 deletions(-) delete mode 100644 compiler/daml-lf-verify/daml/conditionals/.dlint.yaml delete mode 100644 compiler/daml-lf-verify/daml/conditionals/.gitignore delete mode 100644 compiler/daml-lf-verify/daml/conditionals/daml.yaml delete mode 100644 compiler/daml-lf-verify/daml/conditionals/daml/Main.daml delete mode 100644 compiler/daml-lf-verify/daml/conditionals/daml/Setup.daml delete mode 100644 compiler/daml-lf-verify/daml/conditionals/frontend-config.js delete mode 100644 compiler/daml-lf-verify/daml/conditionals/pom.xml delete mode 100644 compiler/daml-lf-verify/daml/conditionals/src/main/java/com/digitalasset/quickstart/iou/IouMain.java delete mode 100644 compiler/daml-lf-verify/daml/conditionals/src/main/resources/logback.xml delete mode 100644 compiler/daml-lf-verify/daml/quickstart/.dlint.yaml delete mode 100644 compiler/daml-lf-verify/daml/quickstart/.gitignore delete mode 100644 compiler/daml-lf-verify/daml/quickstart/daml.yaml delete mode 100644 compiler/daml-lf-verify/daml/quickstart/daml/Main.daml delete mode 100644 compiler/daml-lf-verify/daml/quickstart/daml/Tests/Iou.daml delete mode 100644 compiler/daml-lf-verify/daml/quickstart/daml/Tests/Trade.daml delete mode 100644 compiler/daml-lf-verify/daml/quickstart/frontend-config.js delete mode 100644 compiler/daml-lf-verify/daml/quickstart/pom.xml delete mode 100644 compiler/daml-lf-verify/daml/quickstart/src/main/java/com/digitalasset/quickstart/iou/IouMain.java delete mode 100644 compiler/daml-lf-verify/daml/quickstart/src/main/resources/logback.xml diff --git a/compiler/daml-lf-verify/daml/conditionals/.dlint.yaml b/compiler/daml-lf-verify/daml/conditionals/.dlint.yaml deleted file mode 100644 index af7bafc6d33e..000000000000 --- a/compiler/daml-lf-verify/daml/conditionals/.dlint.yaml +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -# This file controls the behaviour of the dlint linting tool. Below are two -# examples of how to enable or disable a rule. - -# This rule is enabled by default. Uncomment to disable. -#- ignore: {name: Use fewer imports} - -# This rule is disabled by default. Uncomment to enable. -#- suggest: {name: Use module export list} - diff --git a/compiler/daml-lf-verify/daml/conditionals/.gitignore b/compiler/daml-lf-verify/daml/conditionals/.gitignore deleted file mode 100644 index 2c9a6a50f077..000000000000 --- a/compiler/daml-lf-verify/daml/conditionals/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/.daml diff --git a/compiler/daml-lf-verify/daml/conditionals/daml.yaml b/compiler/daml-lf-verify/daml/conditionals/daml.yaml deleted file mode 100644 index b76748a081d9..000000000000 --- a/compiler/daml-lf-verify/daml/conditionals/daml.yaml +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -# sdk-version: 0.13.55 -sdk-version: 1.0.1 -name: quickstart -source: daml -init-script: Setup:initialize -parties: - - Alice - - Bob - - USD_Bank - - EUR_Bank -version: 0.0.1 -exposed-modules: - - Main -dependencies: - - daml-prim - - daml-stdlib - - daml-script - diff --git a/compiler/daml-lf-verify/daml/conditionals/daml/Main.daml b/compiler/daml-lf-verify/daml/conditionals/daml/Main.daml deleted file mode 100644 index 305db39c3cbd..000000000000 --- a/compiler/daml-lf-verify/daml/conditionals/daml/Main.daml +++ /dev/null @@ -1,7 +0,0 @@ --- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. --- SPDX-License-Identifier: Apache-2.0 - - -module Main where - -import Iou() \ No newline at end of file diff --git a/compiler/daml-lf-verify/daml/conditionals/daml/Setup.daml b/compiler/daml-lf-verify/daml/conditionals/daml/Setup.daml deleted file mode 100644 index ae107320dd34..000000000000 --- a/compiler/daml-lf-verify/daml/conditionals/daml/Setup.daml +++ /dev/null @@ -1,6 +0,0 @@ --- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. --- SPDX-License-Identifier: Apache-2.0 - -module Setup where - -import Iou() \ No newline at end of file diff --git a/compiler/daml-lf-verify/daml/conditionals/frontend-config.js b/compiler/daml-lf-verify/daml/conditionals/frontend-config.js deleted file mode 100644 index cee39e055a63..000000000000 --- a/compiler/daml-lf-verify/daml/conditionals/frontend-config.js +++ /dev/null @@ -1,385 +0,0 @@ -// Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -// SPDX-License-Identifier: Apache-2.0 - -import { DamlLfValue } from '@da/ui-core'; - -export const version = { - schema: 'navigator-config', - major: 2, - minor: 0, -}; - -export const customViews = (userId, party, role) => ({ - issued_ious: { - type: "table-view", - title: "Issued Ious", - source: { - type: "contracts", - filter: [ - { - field: "argument.issuer", - value: party, - }, - { - field: "template.id", - value: "Iou:Iou", - } - ], - search: "", - sort: [ - { - field: "id", - direction: "ASCENDING" - } - ] - }, - columns: [ - { - key: "id", - title: "Contract ID", - createCell: ({rowData}) => ({ - type: "text", - value: rowData.id - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.owner", - title: "Owner", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).owner - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.currency", - title: "Currency", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).currency - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.amount", - title: "Amount", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).amount - }), - sortable: true, - width: 80, - weight: 3, - alignment: "left" - } - ] - }, - owned_ious: { - type: "table-view", - title: "Owned Ious", - source: { - type: "contracts", - filter: [ - { - field: "argument.owner", - value: party, - }, - { - field: "template.id", - value: "Iou:Iou", - } - ], - search: "", - sort: [ - { - field: "id", - direction: "ASCENDING" - } - ] - }, - columns: [ - { - key: "id", - title: "Contract ID", - createCell: ({rowData}) => ({ - type: "text", - value: rowData.id - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.issuer", - title: "Issuer", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).issuer - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.currency", - title: "Currency", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).currency - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.amount", - title: "Amount", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).amount - }), - sortable: true, - width: 80, - weight: 3, - alignment: "left" - } - ] - }, - transfers: { - type: "table-view", - title: "Iou Transfers", - source: { - type: "contracts", - filter: [ - { - field: "template.id", - value: "Iou:IouTransfer", - } - ], - search: "", - sort: [ - { - field: "id", - direction: "ASCENDING" - } - ] - }, - columns: [ - { - key: "id", - title: "Contract ID", - createCell: ({rowData}) => ({ - type: "text", - value: rowData.id - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.iou.owner", - title: "Sender", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).iou.owner - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.iou.newOwner", - title: "Receiver", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).newOwner - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.iou.issuer", - title: "Issuer", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).iou.issuer - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.iou.currency", - title: "Currency", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).iou.currency - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.iou.amount", - title: "Amount", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).iou.amount - }), - sortable: true, - width: 80, - weight: 3, - alignment: "left" - } - ] - }, - trades: { - type: "table-view", - title: "Trades", - source: { - type: "contracts", - filter: [ - { - field: "template.id", - value: "IouTrade:IouTrade@", - } - ], - search: "", - sort: [ - { - field: "id", - direction: "ASCENDING" - } - ] - }, - columns: [ - { - key: "id", - title: "Contract ID", - createCell: ({rowData}) => ({ - type: "text", - value: rowData.id - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.buyer", - title: "Buyer", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).buyer - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.seller", - title: "Seller", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).seller - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.baseIssuer", - title: "Base Issuer", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).baseIssuer - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.baseCurrency", - title: "Base Currency", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).baseCurrency - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.baseAmount", - title: "Base Amount", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).baseAmount - }), - sortable: true, - width: 80, - weight: 3, - alignment: "left" - }, - { - key: "argument.quoteIssuer", - title: "Quote Issuer", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).quoteIssuer - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.quoteCurrency", - title: "Quote Currency", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).quoteCurrency - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.quoteAmount", - title: "Quote Amount", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).quoteAmount - }), - sortable: true, - width: 80, - weight: 3, - alignment: "left" - }, - ] - } -}) diff --git a/compiler/daml-lf-verify/daml/conditionals/pom.xml b/compiler/daml-lf-verify/daml/conditionals/pom.xml deleted file mode 100644 index d010cc3794e6..000000000000 --- a/compiler/daml-lf-verify/daml/conditionals/pom.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - 4.0.0 - - quickstart - daml-quickstart-java - jar - 1.0.0 - - - UTF-8 - 1.8 - 1.8 - ${project.build.directory}/generated-sources/iou - localhost - 6865 - Alice - 8080 - - - - - com.daml.ledger - bindings-rxjava - 100.13.55 - - - com.google.protobuf - protobuf-lite - - - - - ch.qos.logback - logback-classic - 1.2.3 - - - com.sparkjava - spark-core - 2.7.2 - - - - - - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - - com.daml.java - codegen - 100.13.55 - jar - - - - - daml-codegen-java - generate-sources - - java - - - false - true - com.digitalasset.daml.lf.codegen.Main - - -o - ${daml-codegen-java.output} - -d - com.digitalasset.quickstart.iou.TemplateDecoder - ${project.basedir}/.daml/dist/quickstart-0.0.1.dar=com.digitalasset.quickstart.model - - - - - run-quickstart - - java - - - com.digitalasset.quickstart.iou.IouMain - - ${ledgerhost} - ${ledgerport} - ${party} - ${restport} - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - 3.0.0 - - - add-source - generate-sources - - add-source - - - - ${daml-codegen-java.output} - - - - - - - - diff --git a/compiler/daml-lf-verify/daml/conditionals/src/main/java/com/digitalasset/quickstart/iou/IouMain.java b/compiler/daml-lf-verify/daml/conditionals/src/main/java/com/digitalasset/quickstart/iou/IouMain.java deleted file mode 100644 index d4171fb15bc3..000000000000 --- a/compiler/daml-lf-verify/daml/conditionals/src/main/java/com/digitalasset/quickstart/iou/IouMain.java +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.digitalasset.quickstart.iou; - -import com.daml.ledger.rxjava.DamlLedgerClient; -import com.daml.ledger.rxjava.LedgerClient; -import com.daml.ledger.javaapi.data.*; -import com.digitalasset.quickstart.model.iou.Iou; -import com.google.common.collect.BiMap; - -import com.google.common.collect.HashBiMap; -import com.google.common.collect.Maps; -import com.google.gson.Gson; -import com.google.protobuf.Empty; -import io.reactivex.disposables.Disposable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import spark.Spark; - -import java.time.Instant; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.atomic.AtomicReference; - - -public class IouMain { - - private final static Logger logger = LoggerFactory.getLogger(IouMain.class); - - // application id used for sending commands - public static final String APP_ID = "IouApp"; - - public static void main(String[] args) { - // Extract host and port from arguments - if (args.length < 4) { - System.err.println("Usage: LEDGER_HOST LEDGER_PORT PARTY REST_PORT"); - System.exit(-1); - } - String ledgerhost = args[0]; - int ledgerport = Integer.valueOf(args[1]); - String party = args[2]; - int restport = Integer.valueOf(args[3]); - - // Create a client object to access services on the ledger. - DamlLedgerClient client = DamlLedgerClient.forHostWithLedgerIdDiscovery(ledgerhost, ledgerport, Optional.empty()); - - // Connects to the ledger and runs initial validation. - client.connect(); - - String ledgerId = client.getLedgerId(); - - logger.info("ledger-id: {}", ledgerId); - - TransactionFilter iouFilter = filterFor(Iou.TEMPLATE_ID, party); - - AtomicLong idCounter = new AtomicLong(0); - ConcurrentHashMap contracts = new ConcurrentHashMap<>(); - BiMap idMap = Maps.synchronizedBiMap(HashBiMap.create()); - AtomicReference acsOffset = new AtomicReference<>(LedgerOffset.LedgerBegin.getInstance()); - - client.getActiveContractSetClient().getActiveContracts(iouFilter, true) - .blockingForEach(response -> { - response.getOffset().ifPresent(offset -> acsOffset.set(new LedgerOffset.Absolute(offset))); - response.getCreatedEvents().stream() - .map(Iou.Contract::fromCreatedEvent) - .forEach(contract -> { - long id = idCounter.getAndIncrement(); - contracts.put(id, contract.data); - idMap.put(id, contract.id); - }); - }); - - Disposable ignore = client.getTransactionsClient().getTransactions(acsOffset.get(), iouFilter, true) - .forEach(t -> { - for (Event event : t.getEvents()) { - if (event instanceof CreatedEvent) { - CreatedEvent createdEvent = (CreatedEvent) event; - long id = idCounter.getAndIncrement(); - Iou.Contract contract = Iou.Contract.fromCreatedEvent(createdEvent); - contracts.put(id, contract.data); - idMap.put(id, contract.id); - } else if (event instanceof ArchivedEvent) { - ArchivedEvent archivedEvent = (ArchivedEvent) event; - long id = idMap.inverse().get(new Iou.ContractId(archivedEvent.getContractId())); - contracts.remove(id); - idMap.remove(id); - } - } - }); - - Gson g = new Gson(); - Spark.port(restport); - Spark.get("/iou", "application/json", (req, res) -> g.toJson(contracts)); - Spark.get("/iou/:id", "application/json", (req, res) -> - g.toJson(contracts.getOrDefault(Long.parseLong(req.params("id")), null)) - ); - Spark.put("/iou", (req, res) -> { - Iou iou = g.fromJson(req.body(), Iou.class); - CreateCommand iouCreate = iou.create(); - submit(client, party, iouCreate); - return "Iou creation submitted."; - }, g::toJson); - Spark.post("/iou/:id/transfer", "application/json", (req, res) -> { - Map m = g.fromJson(req.body(), Map.class); - Iou.ContractId contractId = idMap.get(Long.parseLong(req.params("id"))); - ExerciseCommand exerciseCommand = contractId.exerciseIou_Transfer(m.get("newOwner").toString()); - submit( - client, - party, - exerciseCommand - ); - return "Iou transfer submitted."; - }, g::toJson); - - // Run until user terminates. - while (true) - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - private static Empty submit(LedgerClient client, String party, Command c) { - return client.getCommandSubmissionClient().submit( - UUID.randomUUID().toString(), - "IouApp", - UUID.randomUUID().toString(), - party, - Instant.EPOCH, - Instant.EPOCH.plusSeconds(10), - Collections.singletonList(c)) - .blockingGet(); - } - - private static TransactionFilter filterFor(Identifier templateId, String party) { - InclusiveFilter inclusiveFilter = new InclusiveFilter(Collections.singleton(templateId)); - Map filter = Collections.singletonMap(party, inclusiveFilter); - return new FiltersByParty(filter); - } -} diff --git a/compiler/daml-lf-verify/daml/conditionals/src/main/resources/logback.xml b/compiler/daml-lf-verify/daml/conditionals/src/main/resources/logback.xml deleted file mode 100644 index a21d0bc04c45..000000000000 --- a/compiler/daml-lf-verify/daml/conditionals/src/main/resources/logback.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} [ %X{packageIdShort} %X{moduleName}:%X{entityName} - %X{entityType} ] - %msg%n - - - - - - - - - - \ No newline at end of file diff --git a/compiler/daml-lf-verify/daml/quickstart/.dlint.yaml b/compiler/daml-lf-verify/daml/quickstart/.dlint.yaml deleted file mode 100644 index af7bafc6d33e..000000000000 --- a/compiler/daml-lf-verify/daml/quickstart/.dlint.yaml +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -# This file controls the behaviour of the dlint linting tool. Below are two -# examples of how to enable or disable a rule. - -# This rule is enabled by default. Uncomment to disable. -#- ignore: {name: Use fewer imports} - -# This rule is disabled by default. Uncomment to enable. -#- suggest: {name: Use module export list} - diff --git a/compiler/daml-lf-verify/daml/quickstart/.gitignore b/compiler/daml-lf-verify/daml/quickstart/.gitignore deleted file mode 100644 index 2c9a6a50f077..000000000000 --- a/compiler/daml-lf-verify/daml/quickstart/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/.daml diff --git a/compiler/daml-lf-verify/daml/quickstart/daml.yaml b/compiler/daml-lf-verify/daml/quickstart/daml.yaml deleted file mode 100644 index b8166910f0bc..000000000000 --- a/compiler/daml-lf-verify/daml/quickstart/daml.yaml +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -sdk-version: 1.0.1 -name: quickstart -source: daml -init-script: Setup:initialize -parties: - - Alice - - Bob - - USD_Bank - - EUR_Bank -version: 0.0.1 -exposed-modules: - - Main -dependencies: - - daml-prim - - daml-stdlib - diff --git a/compiler/daml-lf-verify/daml/quickstart/daml/Main.daml b/compiler/daml-lf-verify/daml/quickstart/daml/Main.daml deleted file mode 100644 index 086584107a9c..000000000000 --- a/compiler/daml-lf-verify/daml/quickstart/daml/Main.daml +++ /dev/null @@ -1,40 +0,0 @@ --- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. --- SPDX-License-Identifier: Apache-2.0 - - -module Main where - -import Iou -import IouTrade() - -setup : Scenario IouCid -setup = scenario do - alice <- getParty "Alice" - bob <- getParty "Bob" - usBank <- getParty "USD_Bank" - eurBank <- getParty "EUR_Bank" - - -- Banks issue IOU transfers. - iouTransferAliceCid <- submit eurBank do - iouCid <- create Iou with - issuer = eurBank - owner = eurBank - currency = "EUR" - amount = 100.0 - observers = [] - exercise iouCid Iou_Transfer with newOwner = alice - - iouTransferBobCid <- submit usBank do - iouCid <- create Iou with - issuer = usBank - owner = usBank - currency = "USD" - amount = 110.0 - observers = [] - exercise iouCid Iou_Transfer with newOwner = bob - - -- Bob and Alice accept. - submit alice do - exercise iouTransferAliceCid IouTransfer_Accept - submit bob do - exercise iouTransferBobCid IouTransfer_Accept diff --git a/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Iou.daml b/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Iou.daml deleted file mode 100644 index 0d5637fe466e..000000000000 --- a/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Iou.daml +++ /dev/null @@ -1,148 +0,0 @@ --- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. --- SPDX-License-Identifier: Apache-2.0 - - -module Tests.Iou where - -import Iou - -iou_test = scenario do - bank <- getParty "Acme Bank" - alice <- getParty "Alice" - bob <- getParty "Bob" - charlie <- getParty "Charlie" - - let - issuer = bank - currency = "USD" - - -- Bank creates IOU transfers for Alice and Bob. - iouTransferAliceCid <- submit bank do - iouCid <- create Iou with - issuer - owner = issuer - currency - amount = 100.0 - observers = [] - - exercise iouCid Iou_Transfer with newOwner = alice - - iouTransferBobCid <- submit bank do - iouCid <- create Iou with - issuer - owner = issuer - currency - amount = 30.0 - observers = [] - exercise iouCid Iou_Transfer with newOwner = bob - - iouAliceCid <- submit alice do - exercise iouTransferAliceCid IouTransfer_Accept - - iouBobCid <- submit bob do - exercise iouTransferBobCid IouTransfer_Accept - - -- Alice splits the IOU and transfers part of it to Bob. - split <- submit alice do - exercise iouAliceCid Iou_Split with splitAmount = 40.0 - iouTransferCid <- submit alice do - exercise (fst split) Iou_Transfer with newOwner = bob - - -- Bob accepts and merges it with the one he already has. - iouOtherCid <- submit bob do - exercise iouTransferCid IouTransfer_Accept - - iouTotalCid <- submit bob do - exercise iouBobCid Iou_Merge with otherCid = iouOtherCid - - -- Assert things are as they should be. - submit alice do - aliceIou <- fetch (snd split) - assert $ aliceIou == Iou with - issuer = bank - owner = alice - currency = "USD" - amount = 60.0 - observers = [] - - submit bob do - bobIou <- fetch iouTotalCid - assert $ bobIou == Iou with - issuer = bank - owner = bob - currency = "USD" - amount = 70.0 - observers = [] - - -- Issuers can archive IOUs they own. - iouBankCid <- submit bank do - create Iou with - issuer = bank - owner = bank - currency = "USD" - amount = 100.0 - observers = [] - - submit bank do exercise iouBankCid Archive - submitMustFail bank do fetch iouBankCid - - -- Alice can't create IOUs that are backed by Acme Bank. - submitMustFail alice do - create Iou with - issuer = bank - owner = alice - currency = "USD" - amount = 50.0 - observers = [] - - -- Acme Bank can't create IOUs with a negative amount. - submitMustFail bank do - create Iou with - issuer = bank - owner = alice - currency = "USD" - amount = -20.0 - observers = [] - - submitMustFail bank do - create Iou with - issuer = bank - owner = alice - currency = "USD" - amount = -20.0 - observers = [] - - -- SplitAmount needs to be between 0 and amount. - submitMustFail alice do exercise (snd split) Iou_Split with splitAmount = 80.0 - - -- Double spend gets prevented by archiving the contract. - submitMustFail alice do exercise (fst split) Iou_Transfer with newOwner = charlie - - -- Similarly, a merged contract gets archived as well. - submitMustFail bank do exercise iouOtherCid Iou_Transfer with newOwner = charlie - - -- Only the owner can exercise the transfer choice. - submitMustFail bank do exercise (snd split) Iou_Transfer with newOwner = charlie - - -- Issuer can't archive something Bob owns. - submitMustFail bank do exercise (fst split) Archive - - -- Issuer can't archive something Alice owns. - submitMustFail bank do exercise (snd split) Archive - - -- Alice didn't disclose her remaining IOUs to Bob. - submitMustFail bob do fetch (snd split) - - -- Only matching IOUs can be merged. - iouTransferEURCid <- submit bank do - iouCid <- create Iou with - issuer = bank - owner = bank - currency = "EUR" - amount = 60.0 - observers = [] - exercise iouCid Iou_Transfer with newOwner = alice - - submitMustFail alice do - iouEURCid <- exercise iouTransferEURCid IouTransfer_Accept - exercise (snd split) Iou_Merge with otherCid = iouEURCid diff --git a/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Trade.daml b/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Trade.daml deleted file mode 100644 index 53ee2f14ba88..000000000000 --- a/compiler/daml-lf-verify/daml/quickstart/daml/Tests/Trade.daml +++ /dev/null @@ -1,76 +0,0 @@ --- Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. --- SPDX-License-Identifier: Apache-2.0 - - -module Tests.Trade where - -import DA.Assert - -import Iou -import IouTrade - -trade_test = scenario do - alice <- getParty "Alice" - bob <- getParty "Bob" - usBank <- getParty "USD_Bank" - eurBank <- getParty "EUR_Bank" - - -- Banks issue IOU transfers. - iouTransferAliceCid <- submit eurBank do - iouCid <- create Iou with - issuer = eurBank - owner = eurBank - currency = "EUR" - amount = 100.0 - observers = [] - exercise iouCid Iou_Transfer with newOwner = alice - - iouTransferBobCid <- submit usBank do - iouCid <- create Iou with - issuer = usBank - owner = usBank - currency = "USD" - amount = 110.0 - observers = [] - exercise iouCid Iou_Transfer with newOwner = bob - - -- Bob and Alice accept. - iouAliceCid <- submit alice do - exercise iouTransferAliceCid IouTransfer_Accept - iouBobCid <- submit bob do - exercise iouTransferBobCid IouTransfer_Accept - - -- Alice makes her EUR IOU visible to Bob. - iouAliceCid <- submit alice do - exercise iouAliceCid Iou_AddObserver with newObserver = bob - - -- Alice makes a trade proposal to swap her EUR for Bob's USD. - tradePropCid <- submit alice do - create IouTrade with - buyer = alice - seller = bob - baseIouCid = iouAliceCid - baseIssuer = eurBank - baseCurrency = "EUR" - baseAmount = 100.0 - quoteIssuer = usBank - quoteCurrency = "USD" - quoteAmount = 110.0 - - -- Bob accepts. - newIous <- submit bob do - exercise tradePropCid IouTrade_Accept with quoteIouCid = iouBobCid - - submit alice do - iou <- fetch (fst newIous) - alice === iou.owner - usBank === iou.issuer - "USD" === iou.currency - 110.0 === iou.amount - - submit bob do - iou <- fetch (snd newIous) - bob === iou.owner - eurBank === iou.issuer - "EUR" === iou.currency - 100.0 === iou.amount diff --git a/compiler/daml-lf-verify/daml/quickstart/frontend-config.js b/compiler/daml-lf-verify/daml/quickstart/frontend-config.js deleted file mode 100644 index cee39e055a63..000000000000 --- a/compiler/daml-lf-verify/daml/quickstart/frontend-config.js +++ /dev/null @@ -1,385 +0,0 @@ -// Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -// SPDX-License-Identifier: Apache-2.0 - -import { DamlLfValue } from '@da/ui-core'; - -export const version = { - schema: 'navigator-config', - major: 2, - minor: 0, -}; - -export const customViews = (userId, party, role) => ({ - issued_ious: { - type: "table-view", - title: "Issued Ious", - source: { - type: "contracts", - filter: [ - { - field: "argument.issuer", - value: party, - }, - { - field: "template.id", - value: "Iou:Iou", - } - ], - search: "", - sort: [ - { - field: "id", - direction: "ASCENDING" - } - ] - }, - columns: [ - { - key: "id", - title: "Contract ID", - createCell: ({rowData}) => ({ - type: "text", - value: rowData.id - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.owner", - title: "Owner", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).owner - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.currency", - title: "Currency", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).currency - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.amount", - title: "Amount", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).amount - }), - sortable: true, - width: 80, - weight: 3, - alignment: "left" - } - ] - }, - owned_ious: { - type: "table-view", - title: "Owned Ious", - source: { - type: "contracts", - filter: [ - { - field: "argument.owner", - value: party, - }, - { - field: "template.id", - value: "Iou:Iou", - } - ], - search: "", - sort: [ - { - field: "id", - direction: "ASCENDING" - } - ] - }, - columns: [ - { - key: "id", - title: "Contract ID", - createCell: ({rowData}) => ({ - type: "text", - value: rowData.id - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.issuer", - title: "Issuer", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).issuer - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.currency", - title: "Currency", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).currency - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.amount", - title: "Amount", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).amount - }), - sortable: true, - width: 80, - weight: 3, - alignment: "left" - } - ] - }, - transfers: { - type: "table-view", - title: "Iou Transfers", - source: { - type: "contracts", - filter: [ - { - field: "template.id", - value: "Iou:IouTransfer", - } - ], - search: "", - sort: [ - { - field: "id", - direction: "ASCENDING" - } - ] - }, - columns: [ - { - key: "id", - title: "Contract ID", - createCell: ({rowData}) => ({ - type: "text", - value: rowData.id - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.iou.owner", - title: "Sender", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).iou.owner - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.iou.newOwner", - title: "Receiver", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).newOwner - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.iou.issuer", - title: "Issuer", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).iou.issuer - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.iou.currency", - title: "Currency", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).iou.currency - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.iou.amount", - title: "Amount", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).iou.amount - }), - sortable: true, - width: 80, - weight: 3, - alignment: "left" - } - ] - }, - trades: { - type: "table-view", - title: "Trades", - source: { - type: "contracts", - filter: [ - { - field: "template.id", - value: "IouTrade:IouTrade@", - } - ], - search: "", - sort: [ - { - field: "id", - direction: "ASCENDING" - } - ] - }, - columns: [ - { - key: "id", - title: "Contract ID", - createCell: ({rowData}) => ({ - type: "text", - value: rowData.id - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.buyer", - title: "Buyer", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).buyer - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.seller", - title: "Seller", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).seller - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.baseIssuer", - title: "Base Issuer", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).baseIssuer - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.baseCurrency", - title: "Base Currency", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).baseCurrency - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.baseAmount", - title: "Base Amount", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).baseAmount - }), - sortable: true, - width: 80, - weight: 3, - alignment: "left" - }, - { - key: "argument.quoteIssuer", - title: "Quote Issuer", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).quoteIssuer - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.quoteCurrency", - title: "Quote Currency", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).quoteCurrency - }), - sortable: true, - width: 80, - weight: 0, - alignment: "left" - }, - { - key: "argument.quoteAmount", - title: "Quote Amount", - createCell: ({rowData}) => ({ - type: "text", - value: DamlLfValue.toJSON(rowData.argument).quoteAmount - }), - sortable: true, - width: 80, - weight: 3, - alignment: "left" - }, - ] - } -}) diff --git a/compiler/daml-lf-verify/daml/quickstart/pom.xml b/compiler/daml-lf-verify/daml/quickstart/pom.xml deleted file mode 100644 index d010cc3794e6..000000000000 --- a/compiler/daml-lf-verify/daml/quickstart/pom.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - 4.0.0 - - quickstart - daml-quickstart-java - jar - 1.0.0 - - - UTF-8 - 1.8 - 1.8 - ${project.build.directory}/generated-sources/iou - localhost - 6865 - Alice - 8080 - - - - - com.daml.ledger - bindings-rxjava - 100.13.55 - - - com.google.protobuf - protobuf-lite - - - - - ch.qos.logback - logback-classic - 1.2.3 - - - com.sparkjava - spark-core - 2.7.2 - - - - - - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - - com.daml.java - codegen - 100.13.55 - jar - - - - - daml-codegen-java - generate-sources - - java - - - false - true - com.digitalasset.daml.lf.codegen.Main - - -o - ${daml-codegen-java.output} - -d - com.digitalasset.quickstart.iou.TemplateDecoder - ${project.basedir}/.daml/dist/quickstart-0.0.1.dar=com.digitalasset.quickstart.model - - - - - run-quickstart - - java - - - com.digitalasset.quickstart.iou.IouMain - - ${ledgerhost} - ${ledgerport} - ${party} - ${restport} - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - 3.0.0 - - - add-source - generate-sources - - add-source - - - - ${daml-codegen-java.output} - - - - - - - - diff --git a/compiler/daml-lf-verify/daml/quickstart/src/main/java/com/digitalasset/quickstart/iou/IouMain.java b/compiler/daml-lf-verify/daml/quickstart/src/main/java/com/digitalasset/quickstart/iou/IouMain.java deleted file mode 100644 index d4171fb15bc3..000000000000 --- a/compiler/daml-lf-verify/daml/quickstart/src/main/java/com/digitalasset/quickstart/iou/IouMain.java +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (c) 2020 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. -// SPDX-License-Identifier: Apache-2.0 - -package com.digitalasset.quickstart.iou; - -import com.daml.ledger.rxjava.DamlLedgerClient; -import com.daml.ledger.rxjava.LedgerClient; -import com.daml.ledger.javaapi.data.*; -import com.digitalasset.quickstart.model.iou.Iou; -import com.google.common.collect.BiMap; - -import com.google.common.collect.HashBiMap; -import com.google.common.collect.Maps; -import com.google.gson.Gson; -import com.google.protobuf.Empty; -import io.reactivex.disposables.Disposable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import spark.Spark; - -import java.time.Instant; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.atomic.AtomicReference; - - -public class IouMain { - - private final static Logger logger = LoggerFactory.getLogger(IouMain.class); - - // application id used for sending commands - public static final String APP_ID = "IouApp"; - - public static void main(String[] args) { - // Extract host and port from arguments - if (args.length < 4) { - System.err.println("Usage: LEDGER_HOST LEDGER_PORT PARTY REST_PORT"); - System.exit(-1); - } - String ledgerhost = args[0]; - int ledgerport = Integer.valueOf(args[1]); - String party = args[2]; - int restport = Integer.valueOf(args[3]); - - // Create a client object to access services on the ledger. - DamlLedgerClient client = DamlLedgerClient.forHostWithLedgerIdDiscovery(ledgerhost, ledgerport, Optional.empty()); - - // Connects to the ledger and runs initial validation. - client.connect(); - - String ledgerId = client.getLedgerId(); - - logger.info("ledger-id: {}", ledgerId); - - TransactionFilter iouFilter = filterFor(Iou.TEMPLATE_ID, party); - - AtomicLong idCounter = new AtomicLong(0); - ConcurrentHashMap contracts = new ConcurrentHashMap<>(); - BiMap idMap = Maps.synchronizedBiMap(HashBiMap.create()); - AtomicReference acsOffset = new AtomicReference<>(LedgerOffset.LedgerBegin.getInstance()); - - client.getActiveContractSetClient().getActiveContracts(iouFilter, true) - .blockingForEach(response -> { - response.getOffset().ifPresent(offset -> acsOffset.set(new LedgerOffset.Absolute(offset))); - response.getCreatedEvents().stream() - .map(Iou.Contract::fromCreatedEvent) - .forEach(contract -> { - long id = idCounter.getAndIncrement(); - contracts.put(id, contract.data); - idMap.put(id, contract.id); - }); - }); - - Disposable ignore = client.getTransactionsClient().getTransactions(acsOffset.get(), iouFilter, true) - .forEach(t -> { - for (Event event : t.getEvents()) { - if (event instanceof CreatedEvent) { - CreatedEvent createdEvent = (CreatedEvent) event; - long id = idCounter.getAndIncrement(); - Iou.Contract contract = Iou.Contract.fromCreatedEvent(createdEvent); - contracts.put(id, contract.data); - idMap.put(id, contract.id); - } else if (event instanceof ArchivedEvent) { - ArchivedEvent archivedEvent = (ArchivedEvent) event; - long id = idMap.inverse().get(new Iou.ContractId(archivedEvent.getContractId())); - contracts.remove(id); - idMap.remove(id); - } - } - }); - - Gson g = new Gson(); - Spark.port(restport); - Spark.get("/iou", "application/json", (req, res) -> g.toJson(contracts)); - Spark.get("/iou/:id", "application/json", (req, res) -> - g.toJson(contracts.getOrDefault(Long.parseLong(req.params("id")), null)) - ); - Spark.put("/iou", (req, res) -> { - Iou iou = g.fromJson(req.body(), Iou.class); - CreateCommand iouCreate = iou.create(); - submit(client, party, iouCreate); - return "Iou creation submitted."; - }, g::toJson); - Spark.post("/iou/:id/transfer", "application/json", (req, res) -> { - Map m = g.fromJson(req.body(), Map.class); - Iou.ContractId contractId = idMap.get(Long.parseLong(req.params("id"))); - ExerciseCommand exerciseCommand = contractId.exerciseIou_Transfer(m.get("newOwner").toString()); - submit( - client, - party, - exerciseCommand - ); - return "Iou transfer submitted."; - }, g::toJson); - - // Run until user terminates. - while (true) - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - private static Empty submit(LedgerClient client, String party, Command c) { - return client.getCommandSubmissionClient().submit( - UUID.randomUUID().toString(), - "IouApp", - UUID.randomUUID().toString(), - party, - Instant.EPOCH, - Instant.EPOCH.plusSeconds(10), - Collections.singletonList(c)) - .blockingGet(); - } - - private static TransactionFilter filterFor(Identifier templateId, String party) { - InclusiveFilter inclusiveFilter = new InclusiveFilter(Collections.singleton(templateId)); - Map filter = Collections.singletonMap(party, inclusiveFilter); - return new FiltersByParty(filter); - } -} diff --git a/compiler/daml-lf-verify/daml/quickstart/src/main/resources/logback.xml b/compiler/daml-lf-verify/daml/quickstart/src/main/resources/logback.xml deleted file mode 100644 index a21d0bc04c45..000000000000 --- a/compiler/daml-lf-verify/daml/quickstart/src/main/resources/logback.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} [ %X{packageIdShort} %X{moduleName}:%X{entityName} - %X{entityType} ] - %msg%n - - - - - - - - - - \ No newline at end of file From a3ee542252b6bd2f72693edee0cde99d536be4bd Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Tue, 19 May 2020 18:55:36 +0200 Subject: [PATCH 44/50] Small style fixes --- .../daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs | 10 ++++------ compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs index 39ff6210eb42..63ab306f825a 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Context.hs @@ -123,9 +123,7 @@ introCond (Conditional e updx updy) = case getPhase updx of buildCond updx updy get = let xs = concatCond updx get ys = concatCond updy get - in if null xs && null ys - then [] - else [Conditional e xs ys] + in [Conditional e xs ys | not (null xs && null ys)] -- TODO: Temporary solution. Make introCond a part of the GenPhase class instead. getPhase :: [Cond (UpdateSet ph)] -> UpdateSet ph @@ -706,10 +704,10 @@ solveChoiceReferences EnvCG{..} = updfunc (selfexp :: Expr) (thisexp :: Expr) (argsexp :: Expr) = introCond (createCond cond (foldl - (\upd dat -> upd `concatUpdateSet` (_cdUpds dat selfexp thisexp argsexp)) + (\upd dat -> upd `concatUpdateSet` _cdUpds dat selfexp thisexp argsexp) emptyUpdateSet datxs) (foldl - (\upd dat -> upd `concatUpdateSet` (_cdUpds dat selfexp thisexp argsexp)) + (\upd dat -> upd `concatUpdateSet` _cdUpds dat selfexp thisexp argsexp) emptyUpdateSet datys)) in (head datxs){_cdUpds = updfunc} @@ -766,7 +764,7 @@ solveReference lookup getRefs extUpds introCond emptyUpds vis hmap0 ref0 = -- reference should be flagged as recursive. in if ref0 `elem` vis -- TODO: Recursion! - then trace "Recursion!" $ (upd1, hmap0) -- TODO: At least remove the references? + then trace "Recursion!" (upd1, hmap0) -- TODO: At least remove the references? -- When no recursion has been detected, continue inlining the references. else let (upd2, hmap1) = foldl handle_ref (upd1, hmap0) refs in (upd1, HM.insert ref0 upd2 hmap1) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs index cdcaa462409d..f1b2b9ef3673 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Solve.hs @@ -66,7 +66,7 @@ instance Pretty ConstraintExpr where -- | Add a bunch of constraint expressions. addMany :: [ConstraintExpr] -> ConstraintExpr addMany [] = CReal 0.0 -addMany (x:[]) = x +addMany [x] = x addMany (x:xs) = CAdd x (addMany xs) -- | Class covering the types convertible to constraint expressions. From 91c989ce10f6eb3dd240b1985472456e2fc2292d Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Tue, 19 May 2020 19:27:44 +0200 Subject: [PATCH 45/50] Bugfix after merge --- compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs index 20dae5e20d99..003757c93937 100644 --- a/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs +++ b/compiler/daml-lf-verify/src/DA/Daml/LF/Verify/Generate.hs @@ -218,7 +218,8 @@ genUpdate = \case out <- genExpr True expr return (out, typ, Nothing) -- TODO: Extend additional cases - _ -> error "Update not implemented yet" + UGetTime -> return (emptyOut (EUpdate UGetTime), TBuiltin BTTimestamp, Nothing) + u -> error ("Update not implemented yet: " ++ show u) -- | Analyse a term application expression. genForTmApp :: (GenPhase ph, MonadEnv m ph) @@ -480,5 +481,7 @@ bindCids (TCon tc) cid (EVar this) fsExp = do creFs <- maybe (pure []) recExpFields fsExp extCtrRec this creFs bindCids (TBuiltin BTUnit) _ _ _ = return () +bindCids (TBuiltin BTTimestamp) _ _ _ = return () -- TODO: Extend additional cases, like tuples. -bindCids _ _ _ _ = error "Binding contract id's for this particular type has not been implemented yet" +bindCids typ _ _ _ = + error ("Binding contract id's for this particular type has not been implemented yet: " ++ show typ) From 337b0caf68a09649489db83be3d8f56497bb75bf Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Tue, 19 May 2020 20:44:29 +0200 Subject: [PATCH 46/50] Attempt to fix bazel windows error --- WORKSPACE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WORKSPACE b/WORKSPACE index 4742dcb4fd5d..53fa3d843623 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -903,7 +903,7 @@ nixpkgs_package( nix_file = "//nix:bazel.nix", nix_file_deps = common_nix_file_deps, repositories = dev_env_nix_repos, -) +) if not is_windows else None dev_env_tool( name = "postgresql_dev_env", From 49563b0a3ef8a24e5c5dbaa41175e49d76b27b0f Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Tue, 19 May 2020 20:58:13 +0200 Subject: [PATCH 47/50] Attempt #2 to fix bazel windows error --- compiler/daml-lf-verify/BUILD.bazel | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/compiler/daml-lf-verify/BUILD.bazel b/compiler/daml-lf-verify/BUILD.bazel index 5d7b87496356..72b8b8cce936 100644 --- a/compiler/daml-lf-verify/BUILD.bazel +++ b/compiler/daml-lf-verify/BUILD.bazel @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 load("//rules_daml:daml.bzl", "daml_compile") -load("//bazel_tools:haskell.bzl", "da_haskell_binary", "da_haskell_library", "da_haskell_test") +load("//bazel_tools:haskell.bzl", "da_haskell_binary", "da_haskell_library", "da_haskell_test")load("@os_info//:os_info.bzl", "is_windows") da_haskell_binary( name = "daml-lf-verify", @@ -46,7 +46,7 @@ da_haskell_binary( "//libs-haskell/bazel-runfiles", "//libs-haskell/da-hs-base", ], -) +) if not is_windows else None da_haskell_library( name = "daml-lf-verify-lib", @@ -89,7 +89,7 @@ da_haskell_library( "//libs-haskell/bazel-runfiles", "//libs-haskell/da-hs-base", ], -) +) if not is_windows else None daml_compile( name = "quickstart", @@ -127,4 +127,4 @@ da_haskell_test( "//libs-haskell/da-hs-base", "//libs-haskell/test-utils", ], -) +) if not is_windows else None From ae4a276742943364d0218e6c745144dccd58e93b Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Tue, 19 May 2020 21:18:46 +0200 Subject: [PATCH 48/50] Attempt #3 to fix bazel windows error --- compiler/daml-lf-verify/BUILD.bazel | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler/daml-lf-verify/BUILD.bazel b/compiler/daml-lf-verify/BUILD.bazel index 72b8b8cce936..19dde3566536 100644 --- a/compiler/daml-lf-verify/BUILD.bazel +++ b/compiler/daml-lf-verify/BUILD.bazel @@ -2,7 +2,8 @@ # SPDX-License-Identifier: Apache-2.0 load("//rules_daml:daml.bzl", "daml_compile") -load("//bazel_tools:haskell.bzl", "da_haskell_binary", "da_haskell_library", "da_haskell_test")load("@os_info//:os_info.bzl", "is_windows") +load("//bazel_tools:haskell.bzl", "da_haskell_binary", "da_haskell_library", "da_haskell_test") +load("@os_info//:os_info.bzl", "is_windows") da_haskell_binary( name = "daml-lf-verify", From 77ea06048ba563b2b5d1274f8ba134071a206ab9 Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Tue, 19 May 2020 22:03:33 +0200 Subject: [PATCH 49/50] Attempt #4 to fix bazel windows error --- compiler/daml-lf-verify/BUILD.bazel | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/compiler/daml-lf-verify/BUILD.bazel b/compiler/daml-lf-verify/BUILD.bazel index 19dde3566536..173195c1d88b 100644 --- a/compiler/daml-lf-verify/BUILD.bazel +++ b/compiler/daml-lf-verify/BUILD.bazel @@ -10,7 +10,7 @@ da_haskell_binary( srcs = glob(["src/**/*.hs"]), data = [ "@z3_nix//:bin/z3", - ], + ] if not is_windows else [], hackage_deps = [ "aeson", "base", @@ -47,14 +47,14 @@ da_haskell_binary( "//libs-haskell/bazel-runfiles", "//libs-haskell/da-hs-base", ], -) if not is_windows else None +) da_haskell_library( name = "daml-lf-verify-lib", srcs = glob(["src/**/*.hs"]), data = [ "@z3_nix//:bin/z3", - ], + ] if not is_windows else [], hackage_deps = [ "aeson", "base", @@ -90,7 +90,7 @@ da_haskell_library( "//libs-haskell/bazel-runfiles", "//libs-haskell/da-hs-base", ], -) if not is_windows else None +) daml_compile( name = "quickstart", @@ -110,7 +110,7 @@ da_haskell_test( data = [ ":conditionals.dar", ":quickstart.dar", - ], + ] if not is_windows else [], hackage_deps = [ "base", "containers", @@ -128,4 +128,4 @@ da_haskell_test( "//libs-haskell/da-hs-base", "//libs-haskell/test-utils", ], -) if not is_windows else None +) From 2d7c840ec94d841cd4a9d3f0bd85eabff75e5d3a Mon Sep 17 00:00:00 2001 From: Gert-Jan Bottu Date: Tue, 19 May 2020 22:39:21 +0200 Subject: [PATCH 50/50] Attempt #5 to fix bazel windows error --- compiler/daml-lf-verify/BUILD.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/daml-lf-verify/BUILD.bazel b/compiler/daml-lf-verify/BUILD.bazel index 173195c1d88b..f666e1a56627 100644 --- a/compiler/daml-lf-verify/BUILD.bazel +++ b/compiler/daml-lf-verify/BUILD.bazel @@ -128,4 +128,4 @@ da_haskell_test( "//libs-haskell/da-hs-base", "//libs-haskell/test-utils", ], -) +) if not is_windows else None