NEDDHXUK3GNFMOFO3KLU7NRIHCTYNWBT3D6HTKZAOXFDE6HMDZ6AC 6L5BK5EHPAOQX3JCKUJ273UDNAC23LPQL4HIJGM4AV3P3QK5OKIQC MGOF7IUFGXYQKZOKMM2GGULFFVAULEHLZDSHMUW6B5DBKVXXR74AC KEP5WUFJXTMKRRNZLYTGYYWA4VLFCMHTKTJYF5EA5IWBYFMU6WYQC EKY7U7SKPF45OOUAHJBEQKXSUXWOHFBQFFVJWPBN5ARFJUFM2BPAC LAROLAYUGJ4Q5AEFV5EJMIA2ZKBNCBWHHHPCJ3CKCNIUIYUKRFVQC 75N3UJ4JK56KXF56GASGPAWLFYGJDETVJNYTF4KXFCQM767JUU5AC WO2MINIF4TXOHWSE7JWXRZYN64XRVLYIRFMF4SMPSOXKA2V77KMQC RPAJLHMTUJU4AYNBOHVGHGGB4NY2NLY3BVPYN5FMWB3ZIMAUQHCQC 2XQD6KKKD6QVHFHAEMVE3XXY7X2T7BLTLL7XIILZAXNJJH2YONUQC IZEVQF627FA7VV25KJAWYWGGC35LZUUBBQRPN5ZAINTQLPEDRTEAC 4U7F3CPIDTK6JSEDMNMHVKSR7HOQDLZQD2PPVMDLHO5SFSIMUXZAC ZP62WC472OTQETO2HTHIQIPO57XZIWVKPA4KL62GYU4OZDMB6NSAC TLQ72DSJD7GGPWN6HGBHAVPBRQFKEQ6KSK43U7JWWID4ZWAF47JAC 7HPY3QPFPN35PSPUBVNW2GTFB3CBQZBST4J2BAVJ7QMXLIUN52JAC 4IQVQL4TS35GL2GYZJG254TKJLL5EHMRSFT77Z4VTRZIG2TMBM3QC O5FVTOM6YFBLEPF3S576K6IMT6ZZ5VQCSB3YVXNS4CKBITKCRZ7AC HE3JTXO37O4MOMWPZ4BRBHP53KBPZDG3PCSUCVNOKIS7IY26OCIAC QMRKFEPGFBCEWAIXPEIG5ILKAJ2JH5L3TOITHR4HNJXK5FN3KXBQC GCVQD44VRPQVKPZEPIC4AOIXLJIG2ZMV3QI2Y7KALUT6NVUBSGSAC 7KZP4RHZ3QSYTPPQ257A65Z5UPX44TF2LAI2U5EMULQCLDCEUK2AC A6HKMINBNGQLLX4QJMYWKQ4JAEHVJ4HIRVDKPPDI3FJUO2AAB7OQC FD7SV5I6VCW27HZ3T3K4MMGB2OYGJTPKFFA263TNTAMRJGQJWVNAC KNSI575VAW6HRCZYXOEPQ4DTSML4EORML5MV4DJBRKE7TXCPS4EAC Z7KS5XHHC6PAMTVBHXY7KUSS3BWAOU6FSYIITUCFOOJZU4OUJHBAC LD4GLVSF6YTA7OZWIGJ45H6TUXGM4WKUIYXKWQFNUP36WDMYSMXAC TNR3TEHKVADAEZSTOD2XLSUTSW5AWST2YUW4CWK5KE7DSC6XHZNAC ZITLSTYXUOESFELOW3DLBKWKMSS5ZJYCTKMK4Z44WGIYAKYSMMVAC EMVTF2IWNQGRL44FC4JNG5FYYQTZSFPNM6SOM7IAEH6T7PPK2NVAC EQXRXRZDYCM7BDAVBOXQYPG6C7IJT3OFGNIXCDAHJJBRKAXNGL7AC 4SCFOJGNDAN4XZEAPWQQCBJ3CGZCJP3HUADRQLYZ2ITAKA7EJJTQC SCXG6TJWYIPRUMT27KGKIIF6FYKTUTY74UNZ2FQTT63XZ6HIF3AAC NVOCQVASZWTKQJG7GPH7KHKZZR7NUG4WLV5YY4KAIRPCJRWCZPIAC EZQG2APB36DDMIAYDPPDGOIXOD7K2RZZSGC2NKGZIHB2HZBTW7EQC 5DRIWGLUKMQZU2ZPBXSTLAWJKAMOD5YXAHM5LEDQHDFGYYLHWCDQC 7DBNV3GV773FH5ZLQWFX4RBOS4Q3CIK2RYZNNABY3ZOETYZCXRNQC RSEB2NFGUBTFESE5BJKDUVQL5Y5ZVGY5O4CJX2LNP63MS3NRHHZQC GKGVYBZGPJXO7N7GLHLRNYQPXFHBQSNQN53OKRFCXLQEYDTC5I4QC Y35QCWYW2OTZ27ZVTH2BA3XJTUCJ2WMLKU32ZCOCDY3AW7TIZXRAC 4QX5E5ACVN57KJLCWOM4JEI6JSV4XZNCWVYPOTKSOMUW3SOMCNJAC N4NDAZYTLSI2W22KT3SYXL257DBMSH3UT2BXOYM7LH7FSZAY4RLAC SLL7262CJUE7TZDDZZXFROHCVVDA527WA4PHXCKEGZUJF2EN5MQAC PBD7LZYQHXAA3KLH2ZUX5GW4UFML6BQ32KXZF4KZ6OYFASUYFJ5QC V2VDN77HCSRYYWXDJJ2XOVHV4P6PVWNJZLXZ7JUYPQEZQIH5BZ3QC I2KHGVD44KT4MQJXGCTVSQKMBO6TVCY72F26TLXGWRL6PHGF6RNQC BROSTG5KP3NUNLSYPVQID254TE47E5RKQAKLPIY7PGWETE6JNMTAC BXGLKYRXO2O4NRM3BLNWQ7AWVPQXAMFS57MFYHJNOZZEZZW5BH6AC MB5SHULBN3WP7TGUWZDP6BRGP423FTYKF67T5IF5YHHLNXKQ5REAC XTBSG4C7SCZUFOU2BTNFR6B6TCGYI35BWUV4PVTS3N7KNH5VEARQC TCOAKCGGHOIRJCTZYEZQ3K6KCGL2LGAYGYFRGSPCHBTJJY2V6AXAC ADMKQQGCGVSHHIMVQ4XFRDCG544SBJCYALSKZV45CQQBZ4ACUH2AC 2Y2QZFVFSKXEFEGYJB5A7GI735ONWPCF7DVTIY5T73AUEVTZTBBQC 4ZLEDBK7VGLKFUPENAFLUJYNFLKFYJ3TREPQ7P6PKMYGJUXB55HQC W35DDBFYF6Z4ZPCFEO5RPAONZLYCSNTXUSTS6FIUUVZHCI6Q7GHAC WZUHEZSBRKHQMNWDKVG4X6DDIQEAXTGI6IGAJ5ERPRQ3W2KUMX4QC 64C6AWH66FDKU6UE6Z6JPX2J2GBM2JOPTH2GL6LHKAIUBGNGDZ5AC Z3M53KTLZMPOISMHE25SZJSWX5TA37IV33IRE7KNRAD3PKEAEJXQC VJPT6HDRMJAJD5PT3VOYJYW43ISKLICEHLSDWSROX2XZWO2OFZPQC 2G3GNDDUOVPF45PELJ65ZB2IXEHJJXJILFRVHZXGPXUL4BVNZJFQC NMWWP4ZNOKHZKSJ6F5KYEREWXXR5F4UD35WOKI3EH42AZWVCTCJAC P6NR2CGXCWAW6GXXSIXCGOBIRAS2BM4LEM6D5ADPN4IL7TMW6UVAC OV5AKJHA773ETIJPTMQ7K64U7BRQE34OXJ6FJNH6TZG22WS5QTIAC import ClassyPreludeimport Control.Lensimport Data.Hourglassimport Data.UUIDimport Data.Thyme.Clock as C
import ClassyPreludeimport Control.Lensimport Data.Hourglassimport Data.Thyme.Clock as Cimport Data.UUID
import ClassyPreludeimport Control.Lensimport Data.Aeson(toJSON)import qualified Data.ByteString.Char8 as Bimport Control.Monad.Trans.Eitherimport Data.List as Limport Data.Hourglassimport Data.Thyme.Clock as Cimport Data.Thyme.Timeimport Data.UUID(UUID)import Database.PostgreSQL.Simpleimport Database.PostgreSQL.Simple.FromFieldimport Database.PostgreSQL.Simple.FromRow
import ClassyPreludeimport Control.Lensimport Control.Monad.Trans.Eitherimport Data.Aeson (toJSON)import qualified Data.ByteString.Char8 as Bimport Data.Hourglassimport Data.List as Limport Data.Thyme.Clock as Cimport Data.Thyme.Timeimport Data.UUID (UUID)import Database.PostgreSQL.Simpleimport Database.PostgreSQL.Simple.FromFieldimport Database.PostgreSQL.Simple.FromRow
import Aftokimport Aftok.Auctionimport Aftok.Databaseimport Aftok.Intervalimport Aftok.TimeLogimport Aftok.Types
import Aftokimport Aftok.Auctionimport Aftok.Databaseimport Aftok.Intervalimport Aftok.TimeLogimport Aftok.Types
import Control.Lens(makeLenses, (^.))import Data.Aesonimport Data.AffineSpaceimport Data.Aeson.Typesimport Data.Thyme.Clock as Cimport Data.Thyme.LocalTime()import Data.Thyme.Format.Aeson()
import Control.Lens (makeLenses, (^.))import Data.Aesonimport Data.Aeson.Typesimport Data.AffineSpaceimport Data.Thyme.Clock as Cimport Data.Thyme.Format.Aeson ()import Data.Thyme.LocalTime ()
import Control.Lensimport Data.AdditiveGroupimport Data.Aeson as Aimport Data.AffineSpaceimport Data.Foldable as Fimport Data.Heap as Himport Data.List.NonEmpty as Limport Data.Map.Strict as MSimport Data.Ratio()import Data.Thyme.Clock as Cimport Data.UUIDimport Data.VectorSpace
import Control.Lensimport Data.AdditiveGroupimport Data.Aeson as Aimport Data.AffineSpaceimport Data.Foldable as Fimport Data.Heap as Himport Data.List.NonEmpty as Limport Data.Map.Strict as MSimport Data.Ratio ()import Data.Thyme.Clock as Cimport Data.UUIDimport Data.VectorSpace
import Control.Lens(makePrisms, makeLenses)import Data.Aesonimport Data.Aeson.Typesimport Data.ByteString.Base64.URL as B64import Data.Dataimport Data.Thyme.Clock as Cimport Data.UUIDimport OpenSSL.Random
import Control.Lens (makeLenses, makePrisms)import Data.Aesonimport Data.Aeson.Typesimport Data.ByteString.Base64.URL as B64import Data.Dataimport Data.Thyme.Clock as Cimport Data.UUIDimport OpenSSL.Random
import qualified Data.ByteString.Char8 as Cimport qualified Data.Configurator as Cimport qualified Data.Configurator.Types as CTimport qualified Network.Socket as NSimport qualified Network.Mail.SMTP as SMTPimport System.Environmentimport System.IO (FilePath)
import qualified Data.ByteString.Char8 as Cimport qualified Data.Configurator as Cimport qualified Data.Configurator.Types as CTimport qualified Network.Mail.SMTP as SMTPimport qualified Network.Socket as NSimport System.Environmentimport System.IO (FilePath)
, pgsConfig :: PGSConfig, smtpConfig :: SmtpConfig, templatePath :: System.IO.FilePath}
, pgsConfig :: PGSConfig, smtpConfig :: SmtpConfig, templatePath :: System.IO.FilePath}
requireProjectId = domaybePid <- parseParam "projectId" pidParsermaybe (snapError 400 "Value of parameter \"projectId\" cannot be parsed as a valid UUID")
requireProjectId = domaybePid <- parseParam "projectId" pidParsermaybe (snapError 400 "Value of parameter \"projectId\" cannot be parsed as a valid UUID")
import Control.Lensimport Data.Aeson as Aimport Data.Text as Timport Data.Thyme.Clock as C
import Control.Lensimport Data.Aeson as Aimport Data.Text as Timport Data.Thyme.Clock as C
import Control.Monad.Trans.Maybeimport Data.ByteString.Char8 as Bimport Data.Time.ISO8601import Data.Thyme.Timeimport Data.Thyme.Clock as C
import Control.Monad.Trans.Maybeimport Data.ByteString.Char8 as Bimport Data.Thyme.Clock as Cimport Data.Thyme.Timeimport Data.Time.ISO8601
import Control.Lensimport qualified Data.Aeson as Aimport Data.Aeson.Typesimport Data.UUID as Uimport Data.Thyme.Clock as C
import Control.Lensimport qualified Data.Aeson as Aimport Data.Aeson.Typesimport Data.Thyme.Clock as Cimport Data.UUID as U
import Control.Lensimport Control.Monad.Readerimport Control.Monad.Stateimport Control.Monad.Trans.Eitherimport qualified Data.Aeson as Aimport Data.Attoparsec.ByteString(Parser, parseOnly)
import Control.Lensimport Control.Monad.Readerimport Control.Monad.Stateimport Control.Monad.Trans.Eitherimport qualified Data.Aeson as Aimport Data.Attoparsec.ByteString (Parser, parseOnly)
import Aftokimport Aftok.Databaseimport Aftok.Database.PostgreSQLimport Aftok.Util
import Aftokimport Aftok.Databaseimport Aftok.Database.PostgreSQLimport Aftok.Util
import Snap.Coreimport Snap.Snapletimport Snap.Snaplet.PostgresqlSimpleimport qualified Snap.Snaplet.Auth as AUimport Snap.Snaplet.Session
import Snap.Coreimport Snap.Snapletimport qualified Snap.Snaplet.Auth as AUimport Snap.Snaplet.PostgresqlSimpleimport Snap.Snaplet.Session
import Aftok.QConfigimport Aftok.Snapletimport Aftok.Snaplet.Authimport Aftok.Snaplet.Usersimport Aftok.Snaplet.WorkLogimport Aftok.Snaplet.Projects
import Aftok.QConfigimport Aftok.Snapletimport Aftok.Snaplet.Authimport Aftok.Snaplet.Projectsimport Aftok.Snaplet.Usersimport Aftok.Snaplet.WorkLog
import Snap.Coreimport Snap.Snapletimport Snap.Snaplet.PostgresqlSimpleimport Snap.Snaplet.Auth.Backends.PostgresqlSimpleimport Snap.Snaplet.Session.Backends.CookieSession
import Snap.Coreimport Snap.Snapletimport Snap.Snaplet.Auth.Backends.PostgresqlSimpleimport Snap.Snaplet.PostgresqlSimpleimport Snap.Snaplet.Session.Backends.CookieSession
]
]
import Control.Lens ((^.))import Data.AffineSpaceimport qualified Data.List.NonEmpty as Limport qualified Data.Map.Strict as Mimport Data.Time.ISO8601import Data.Thyme.Time as T
import Control.Lens ((^.))import Data.AffineSpaceimport qualified Data.List.NonEmpty as Limport qualified Data.Map.Strict as Mimport Data.Thyme.Time as Timport Data.Time.ISO8601