From 758b72f4c4bcdbca0969fad9308f45d9e6c10a61 Mon Sep 17 00:00:00 2001 From: ClaraCrazy Date: Wed, 1 Nov 2023 11:48:19 +0100 Subject: [PATCH] Add Files --- .gitignore | 4 + app.js | 74 +++ app.json | 30 + application/config.js | 48 ++ application/imap-service.js | 319 ++++++++++ application/mail-processing-service.js | 89 +++ domain/mail-repository.js | 42 ++ domain/mail.js | 15 + infrastructure/web/client-notification.js | 31 + .../web/public/dependencies/milligram.css | 602 ++++++++++++++++++ infrastructure/web/public/images/icon.ico | Bin 0 -> 46841 bytes infrastructure/web/public/images/logo.gif | Bin 0 -> 75181 bytes .../web/public/javascripts/notifications.js | 57 ++ .../web/public/stylesheets/custom.css | 134 ++++ infrastructure/web/routes/inbox.js | 51 ++ infrastructure/web/routes/login.js | 41 ++ infrastructure/web/views/error.twig | 9 + infrastructure/web/views/inbox.twig | 35 + infrastructure/web/views/layout.twig | 37 ++ infrastructure/web/views/log.txt | 1 + infrastructure/web/views/login.twig | 36 ++ infrastructure/web/views/mail.twig | 35 + infrastructure/web/views/mail.twig.save | 34 + infrastructure/web/views/twig-filters.js | 27 + infrastructure/web/web.js | 83 +++ package.json | 63 ++ 26 files changed, 1897 insertions(+) create mode 100644 .gitignore create mode 100644 app.js create mode 100644 app.json create mode 100644 application/config.js create mode 100644 application/imap-service.js create mode 100644 application/mail-processing-service.js create mode 100644 domain/mail-repository.js create mode 100644 domain/mail.js create mode 100644 infrastructure/web/client-notification.js create mode 100644 infrastructure/web/public/dependencies/milligram.css create mode 100644 infrastructure/web/public/images/icon.ico create mode 100644 infrastructure/web/public/images/logo.gif create mode 100644 infrastructure/web/public/javascripts/notifications.js create mode 100644 infrastructure/web/public/stylesheets/custom.css create mode 100644 infrastructure/web/routes/inbox.js create mode 100644 infrastructure/web/routes/login.js create mode 100644 infrastructure/web/views/error.twig create mode 100644 infrastructure/web/views/inbox.twig create mode 100644 infrastructure/web/views/layout.twig create mode 100644 infrastructure/web/views/log.txt create mode 100644 infrastructure/web/views/login.twig create mode 100644 infrastructure/web/views/mail.twig create mode 100644 infrastructure/web/views/mail.twig.save create mode 100644 infrastructure/web/views/twig-filters.js create mode 100644 infrastructure/web/web.js create mode 100644 package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..de45fd8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules +.idea +.DS_Store +.vscode diff --git a/app.js b/app.js new file mode 100644 index 0000000..31bb52e --- /dev/null +++ b/app.js @@ -0,0 +1,74 @@ +#!/usr/bin/env node +/* eslint unicorn/no-process-exit: 0 */ + +const config = require('./application/config') + +// Until node 11 adds flatmap, we use this: +require('array.prototype.flatmap').shim() + +const {app, io, server} = require('./infrastructure/web/web') +const ClientNotification = require('./infrastructure/web/client-notification') +const ImapService = require('./application/imap-service') +const MailProcessingService = require('./application/mail-processing-service') +const MailRepository = require('./domain/mail-repository') + +const clientNotification = new ClientNotification() +clientNotification.use(io) + +const imapService = new ImapService(config) +const mailProcessingService = new MailProcessingService( + new MailRepository(), + imapService, + clientNotification, + config +) + +// Put everything together: +imapService.on(ImapService.EVENT_NEW_MAIL, mail => + mailProcessingService.onNewMail(mail) +) +imapService.on(ImapService.EVENT_INITIAL_LOAD_DONE, () => + mailProcessingService.onInitialLoadDone() +) +imapService.on(ImapService.EVENT_DELETED_MAIL, mail => + mailProcessingService.onMailDeleted(mail) +) + +mailProcessingService.on('error', err => { + console.error('error from mailProcessingService, stopping.', err) + process.exit(1) +}) + +imapService.on(ImapService.EVENT_ERROR, error => { + console.error('fatal error from imap service', error) + process.exit(1) +}) + +app.set('mailProcessingService', mailProcessingService) + +imapService.connectAndLoadMessages().catch(error => { + console.error('fatal error from imap service', error) + process.exit(1) +}) + +server.on('error', error => { + if (error.syscall !== 'listen') { + console.error('fatal web server error', error) + return + } + + // Handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error( + 'Port ' + config.http.port + ' requires elevated privileges' + ) + process.exit(1) + case 'EADDRINUSE': + console.error('Port ' + config.http.port + ' is already in use') + process.exit(1) + default: + console.error('fatal web server error', error) + process.exit(1) + } +}) diff --git a/app.json b/app.json new file mode 100644 index 0000000..c92ea6d --- /dev/null +++ b/app.json @@ -0,0 +1,30 @@ +{ + "name": "48hr.email | disposable email", + "description": "a simple and fast disposable mail service that works directly with your imap server. No database required.", + "repository": "https://github.com/Crazyco-xyz/48hr.email", + "logo": "https://github.com/Crazyco-xyz/48hr.email/blobl/main/infrastructure/web/public/images/logo.gif", + "keywords": [ + "node", + "disposable-mail" + ], + "env": { + "DOMAINS": { + "description": "Email domains." + }, + "IMAP_SERVER": { + "description": "Hostname of the server (usually imap.example.com)" + }, + "IMAP_USER": { + "description": "Username to login to the imap server" + }, + "IMAP_PASSWORD": { + "description": "Password to login to the imap server" + }, + "IMAP_REFRESH_INTERVAL_SECONDS": { + "description": "How often to refresh the imap messages manually" + }, + "DELETE_MAILS_OLDER_THAN_DAYS": { + "description": "How many days to to wait before deleting messages. (default: `30`)" + } + } +} diff --git a/application/config.js b/application/config.js new file mode 100644 index 0000000..c061895 --- /dev/null +++ b/application/config.js @@ -0,0 +1,48 @@ +// Note: Also update app.json and README.md! + +const config = { + email: { + domains: process.env.DOMAINS, + deleteMailsOlderThanDays: process.env.DELETE_MAILS_OLDER_THAN_DAYS + }, + imap: { + user: process.env.IMAP_USER, + password: process.env.IMAP_PASSWORD, + host: process.env.IMAP_SERVER, + port: 993, + tls: true, + authTimeout: 3000, + refreshIntervalSeconds: process.env.IMAP_REFRESH_INTERVAL_SECONDS + }, + http: {port: normalizePort(process.env.PORT || '3000')} +} + +if (!config.imap.user || !config.imap.password || !config.imap.host) { + throw new Error('IMAP is not configured. Use IMAP_* ENV vars.') +} + +if (!config.email.domains) { + throw new Error('DOMAINS is not configured. Use ENV vars.') +} + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + const port = parseInt(val, 10) + + if (isNaN(port)) { + // Named pipe + return val + } + + if (port >= 0) { + // Port number + return port + } + + return false +} + +module.exports = config diff --git a/application/imap-service.js b/application/imap-service.js new file mode 100644 index 0000000..168d79f --- /dev/null +++ b/application/imap-service.js @@ -0,0 +1,319 @@ +const EventEmitter = require('events') +const imaps = require('imap-simple') +const {simpleParser} = require('mailparser') +const addressparser = require('nodemailer/lib/addressparser') +const pSeries = require('p-series') +const retry = require('async-retry') +const debug = require('debug')('48hr-email:imap') +const _ = require('lodash') +const Mail = require('../domain/mail') + + +// Just adding some missing functions to imap-simple... :-) + +/** + * Deletes the specified message(s). + * + * @param {string|Array} uid The uid or array of uids indicating the messages to be deleted + * @param {function} [callback] Optional callback, receiving signature (err) + * @returns {undefined|Promise} Returns a promise when no callback is specified, resolving when the action succeeds. + * @memberof ImapSimple + */ +imaps.ImapSimple.prototype.deleteMessage = function (uid, callback) { + var self = this; + + if (callback) { + return nodeify(self.deleteMessage(uid), callback); + } + + return new Promise(function (resolve, reject) { + self.imap.addFlags(uid, '\\Deleted', function (err) { + if (err) { + reject(err); + return; + } + self.imap.expunge( function (err) { + if (err) { + reject(err); + return; + } + resolve(); + }); + }); + }); +}; + + + +/** + * Close a mailbox + * + * @param {boolean} [autoExpunge=true] If autoExpunge is true, any messages marked as Deleted in the currently open mailbox will be remove + * @param {function} [callback] Optional callback, receiving signature (err) + * @returns {undefined|Promise} Returns a promise when no callback is specified, resolving to `boxName` + * @memberof ImapSimple + */ +imaps.ImapSimple.prototype.closeBox = function (autoExpunge=true, callback) { + var self = this; + + if (typeof(autoExpunge) == 'function'){ + callback = autoExpunge; + autoExpunge = true; + } + + if (callback) { + return nodeify(this.closeBox(autoExpunge), callback); + } + + return new Promise(function (resolve, reject) { + + self.imap.closeBox(autoExpunge, function (err, result) { + + if (err) { + reject(err); + return; + } + + resolve(result); + }); + }); +}; + + +/** + * Fetches emails from the imap server. It is a facade against the more complicated imap-simple api. It keeps the connection + * as a member field. + * + * With this abstraction it would be easy to replace this with any inbound mail service like mailgun.com. + */ +class ImapService extends EventEmitter { + constructor(config) { + super() + this.config = config + + /** + * Set of emitted UIDs. Listeners should get each email only once. + * @type {Set} + */ + this.loadedUids = new Set() + + this.connection = null + this.initialLoadDone = false + } + + async connectAndLoadMessages() { + const configWithListener = { + ...this.config, + // 'onmail' adds a callback when new mails arrive. With this we can keep the imap refresh interval very low (or even disable it). + onmail: () => this._doOnNewMail() + } + + this.once(ImapService.EVENT_INITIAL_LOAD_DONE, () => + this._doAfterInitialLoad() + ) + + await this._connectWithRetry(configWithListener) + + // Load all messages in the background. (ASYNC) + this._loadMailSummariesAndEmitAsEvents() + } + + async _connectWithRetry(configWithListener) { + try { + await retry( + async _bail => { + // If anything throws, we retry + this.connection = await imaps.connect(configWithListener) + + this.connection.on('error', err => { + // We assume that the app will be restarted after a crash. + console.error( + 'got fatal error during imap operation, stop app.', + err + ) + this.emit('error', err) + }) + + await this.connection.openBox('INBOX') + debug('connected to imap') + }, + { + retries: 5 + } + ) + } catch (error) { + console.error('can not connect, even with retry, stop app', error) + throw error + } + } + + _doOnNewMail() { + // Only react to new mails after the initial load, otherwise it might load the same mails twice. + if (this.initialLoadDone) { + this._loadMailSummariesAndEmitAsEvents() + } + } + + _doAfterInitialLoad() { + // During initial load we ignored new incoming emails. In order to catch up with those, we have to refresh + // the mails once after the initial load. (async) + this._loadMailSummariesAndEmitAsEvents() + + // If the above trigger on new mails does not work reliable, we have to regularly check + // for new mails on the server. This is done only after all the mails have been loaded for the + // first time. (Note: set the refresh higher than the time it takes to download the mails). + if (this.config.imap.refreshIntervalSeconds) { + setInterval( + () => this._loadMailSummariesAndEmitAsEvents(), + this.config.imap.refreshIntervalSeconds * 1000 + ) + } + } + + async _loadMailSummariesAndEmitAsEvents() { + // UID: Unique id of a message. + + const uids = await this._getAllUids() + const newUids = uids.filter(uid => !this.loadedUids.has(uid)) + + // Optimize by fetching several messages (but not all) with one 'search' call. + // fetching all at once might be more efficient, but then it takes long until we see any messages + // in the frontend. With a small chunk size we ensure that we see the newest emails after a few seconds after + // restart. + const uidChunks = _.chunk(newUids, 20) + + // Creates an array of functions. We do not start the search now, we just create the function. + const fetchFunctions = uidChunks.map(uidChunk => () => + this._getMailHeadersAndEmitAsEvents(uidChunk) + ) + + await pSeries(fetchFunctions) + + if (!this.initialLoadDone) { + this.initialLoadDone = true + this.emit(ImapService.EVENT_INITIAL_LOAD_DONE) + } + } + + /** + * + * @param {Date} deleteMailsBefore delete mails before this date instance + */ + async deleteOldMails(deleteMailsBefore) { + debug(`deleting mails before ${deleteMailsBefore}`) + const uids = await this._searchWithoutFetch([ + ['!DELETED'], + ['BEFORE', deleteMailsBefore] + ]) + if (uids.length === 0) { + return + } + + debug(`deleting mails ${uids}`) + await this.connection.deleteMessage(uids) + console.log(`deleted ${uids.length} old messages.`) + + uids.forEach(uid => this.emit(ImapService.EVENT_DELETED_MAIL, uid)) + } + + /** + * Helper method because ImapSimple#search also fetches each message. We just need the uids here. + * + * @param {Object} searchCriteria (see ImapSimple#search) + * @returns {Promise>} Array of UIDs + * @private + */ + async _searchWithoutFetch(searchCriteria) { + const imapUnderlying = this.connection.imap + + return new Promise((resolve, reject) => { + imapUnderlying.search(searchCriteria, (err, uids) => { + if (err) { + reject(err) + } else { + resolve(uids || []) + } + }) + }) + } + + _createMailSummary(message) { + const headerPart = message.parts[0].body + const to = headerPart.to + .flatMap(to => addressparser(to)) + // The address also contains the name, just keep the email + .map(addressObj => addressObj.address) + + const from = headerPart.from.flatMap(from => addressparser(from)) + + const subject = headerPart.subject[0] + const date = headerPart.date[0] + const {uid} = message.attributes + + return Mail.create(to, from, date, subject, uid) + } + + async fetchOneFullMail(to, uid) { + if (!this.connection) { + // Here we 'fail fast' instead of waiting for the connection. + throw new Error('imap connection not ready') + } + + debug(`fetching full message ${uid}`) + + // For security we also filter TO, so it is harder to just enumerate all messages. + const searchCriteria = [['UID', uid], ['TO', to]] + const fetchOptions = { + bodies: ['HEADER', ''], // Empty string means full body + markSeen: false + } + + const messages = await this.connection.search(searchCriteria, fetchOptions) + if (messages.length === 0) { + throw new Error('email not found') + } + + const fullBody = _.find(messages[0].parts, {which: ''}) + return simpleParser(fullBody.body) + } + + async _getAllUids() { + // We ignore mails that are flagged as DELETED, but have not been removed (expunged) yet. + const uids = await this._searchWithoutFetch([['!DELETED']]) + // Create copy to not mutate the original array. Sort with newest first (DESC). + return [...uids].sort().reverse() + } + + async _getMailHeadersAndEmitAsEvents(uids) { + try { + const mails = await this._getMailHeaders(uids) + mails.forEach(mail => { + this.loadedUids.add(mail.attributes.uid) + // Some broadcast messages have no TO field. We have to ignore those messages. + if (mail.parts[0].body.to) { + this.emit(ImapService.EVENT_NEW_MAIL, this._createMailSummary(mail)) + } + }) + } catch (error) { + debug('can not fetch', error) + throw error + } + } + + async _getMailHeaders(uids) { + const fetchOptions = { + bodies: ['HEADER.FIELDS (FROM TO SUBJECT DATE)'], + struct: false + } + const searchCriteria = [['UID', ...uids]] + return this.connection.search(searchCriteria, fetchOptions) + } +} + +// Consumers should use these constants: +ImapService.EVENT_NEW_MAIL = 'mail' +ImapService.EVENT_DELETED_MAIL = 'mailDeleted' +ImapService.EVENT_INITIAL_LOAD_DONE = 'initial load done' +ImapService.EVENT_ERROR = 'error' + +module.exports = ImapService diff --git a/application/mail-processing-service.js b/application/mail-processing-service.js new file mode 100644 index 0000000..67d9e53 --- /dev/null +++ b/application/mail-processing-service.js @@ -0,0 +1,89 @@ +const EventEmitter = require('events') +const debug = require('debug')('48hr-email:imap-manager') +const mem = require('mem') +const moment = require('moment') +const ImapService = require('./imap-service') + +class MailProcessingService extends EventEmitter { + constructor(mailRepository, imapService, clientNotification, config) { + super() + this.mailRepository = mailRepository + this.clientNotification = clientNotification + this.imapService = imapService + this.config = config + + // Cached methods: + this.cachedFetchFullMail = mem( + this.imapService.fetchOneFullMail.bind(this.imapService), + {maxAge: 10 * 60 * 1000} + ) + + this.initialLoadDone = false + + // Delete old messages now and every few hours + this.imapService.once(ImapService.EVENT_INITIAL_LOAD_DONE, () => + this._deleteOldMails() + ) + setInterval(() => this._deleteOldMails(), 1000 * 3600 * 6) + } + + getMailSummaries(address) { + return this.mailRepository.getForRecipient(address) + } + + getOneFullMail(address, uid) { + return this.cachedFetchFullMail(address, uid) + } + + getAllMailSummaries() { + return this.mailRepository.getAll() + } + + onInitialLoadDone() { + this.initialLoadDone = true + console.log( + `initial load done, got ${this.mailRepository.mailCount()} mails` + ) + } + + onNewMail(mail) { + if (this.initialLoadDone) { + // For now, only log messages if they arrive after the initial load + debug('new mail for', mail.to[0]) + } + + mail.to.forEach(to => { + this.mailRepository.add(to, mail) + return this.clientNotification.emit(to) + }) + } + + onMailDeleted(uid) { + debug('mail deleted with uid', uid) + this.mailRepository.removeUid(uid) + // No client notification required, as nobody can cold a connection for 30+ days. + } + + async _deleteOldMails() { + try { + await this.imapService.deleteOldMails( + moment() + .subtract(this.config.email.deleteMailsOlderThanDays, 'days') + .toDate() + ) + } catch (error) { + console.log('can not delete old messages', error) + } + } + + _saveToFile(mails, filename) { + const fs = require('fs') + fs.writeFile(filename, JSON.stringify(mails), err => { + if (err) { + console.error('can not save mails to file', err) + } + }) + } +} + +module.exports = MailProcessingService diff --git a/domain/mail-repository.js b/domain/mail-repository.js new file mode 100644 index 0000000..64802d7 --- /dev/null +++ b/domain/mail-repository.js @@ -0,0 +1,42 @@ +const debug = require('debug')('48hr-email:mail-summary-store') +const MultiMap = require('mnemonist/multi-map') +const _ = require('lodash') + +class MailRepository { + constructor() { + // MultiMap docs: https://yomguithereal.github.io/mnemonist/multi-map + this.mailSummaries = new MultiMap() + } + + getForRecipient(address) { + const mails = this.mailSummaries.get(address) || [] + return _.orderBy(mails, mail => Date.parse(mail.date), ['desc']) + } + + getAll() { + const mails = [...this.mailSummaries.values()] + return _.orderBy(mails, mail => Date.parse(mail.date), ['desc']) + } + + add(to, mailSummary) { + this.mailSummaries.set(to.toLowerCase(), mailSummary) + } + + removeUid(uid) { + // TODO: make this more efficient, looping through each email is not cool. + this.mailSummaries.forEachAssociation((mails, to) => { + mails + .filter(mail => mail.uid === uid) + .forEach(mail => { + this.mailSummaries.remove(to, mail) + debug('removed ', mail.date, to, mail.subject) + }) + }) + } + + mailCount() { + return this.mailSummaries.size + } +} + +module.exports = MailRepository diff --git a/domain/mail.js b/domain/mail.js new file mode 100644 index 0000000..d96da14 --- /dev/null +++ b/domain/mail.js @@ -0,0 +1,15 @@ +class Mail { + constructor(to, from, date, subject, uid) { + this.to = to + this.from = from + this.date = date + this.subject = subject + this.uid = uid + } + + static create(to, from, date, subject, uid) { + return new Mail(to, from, date, subject, uid) + } +} + +module.exports = Mail diff --git a/infrastructure/web/client-notification.js b/infrastructure/web/client-notification.js new file mode 100644 index 0000000..45b02a9 --- /dev/null +++ b/infrastructure/web/client-notification.js @@ -0,0 +1,31 @@ +const EventEmitter = require('events') +const debug = require('debug')('48hr-email:notification') + +/** + * Receives sign-ins from users and notifies them when new mails are available. + */ +class ClientNotification extends EventEmitter { + use(io) { + io.on('connection', socket => { + socket.on('sign in', address => this._signIn(socket, address)) + }) + } + + _signIn(socket, address) { + debug(`socketio signed in: ${address}`) + + const newMailListener = () => { + debug(`${address} has new messages, sending notification`) + socket.emit('new emails') + } + + this.on(address, newMailListener) + + socket.on('disconnect', reason => { + debug(`client disconnect: ${address} (${reason})`) + this.removeListener(address, newMailListener) + }) + } +} + +module.exports = ClientNotification diff --git a/infrastructure/web/public/dependencies/milligram.css b/infrastructure/web/public/dependencies/milligram.css new file mode 100644 index 0000000..d253355 --- /dev/null +++ b/infrastructure/web/public/dependencies/milligram.css @@ -0,0 +1,602 @@ +/*! + * Milligram v1.3.0 + * https://milligram.github.io + * + * Copyright (c) 2017 CJ Patoilo + * Licensed under the MIT license + */ + +*, +*:after, +*:before { + box-sizing: inherit; +} + +html { + box-sizing: border-box; + font-size: 62.5%; +} + +body { + color: #606c76; + font-family: 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; + font-size: 1.6em; + font-weight: 300; + letter-spacing: .01em; + line-height: 1.6; +} + +blockquote { + border-left: 0.3rem solid #d1d1d1; + margin-left: 0; + margin-right: 0; + padding: 1rem 1.5rem; +} + +blockquote *:last-child { + margin-bottom: 0; +} + +.button, +button, +input[type='button'], +input[type='reset'], +input[type='submit'] { + background-color: #9b4dca; + border: 0.1rem solid #9b4dca; + border-radius: .4rem; + color: #fff; + cursor: pointer; + display: inline-block; + font-size: 1.1rem; + font-weight: 700; + height: 3.8rem; + letter-spacing: .1rem; + line-height: 3.8rem; + padding: 0 3.0rem; + text-align: center; + text-decoration: none; + text-transform: uppercase; + white-space: nowrap; +} + +.button:focus, .button:hover, +button:focus, +button:hover, +input[type='button']:focus, +input[type='button']:hover, +input[type='reset']:focus, +input[type='reset']:hover, +input[type='submit']:focus, +input[type='submit']:hover { + background-color: #606c76; + border-color: #606c76; + color: #fff; + outline: 0; +} + +.button[disabled], +button[disabled], +input[type='button'][disabled], +input[type='reset'][disabled], +input[type='submit'][disabled] { + cursor: default; + opacity: .5; +} + +.button[disabled]:focus, .button[disabled]:hover, +button[disabled]:focus, +button[disabled]:hover, +input[type='button'][disabled]:focus, +input[type='button'][disabled]:hover, +input[type='reset'][disabled]:focus, +input[type='reset'][disabled]:hover, +input[type='submit'][disabled]:focus, +input[type='submit'][disabled]:hover { + background-color: #9b4dca; + border-color: #9b4dca; +} + +.button.button-outline, +button.button-outline, +input[type='button'].button-outline, +input[type='reset'].button-outline, +input[type='submit'].button-outline { + background-color: transparent; + color: #9b4dca; +} + +.button.button-outline:focus, .button.button-outline:hover, +button.button-outline:focus, +button.button-outline:hover, +input[type='button'].button-outline:focus, +input[type='button'].button-outline:hover, +input[type='reset'].button-outline:focus, +input[type='reset'].button-outline:hover, +input[type='submit'].button-outline:focus, +input[type='submit'].button-outline:hover { + background-color: transparent; + border-color: #606c76; + color: #606c76; +} + +.button.button-outline[disabled]:focus, .button.button-outline[disabled]:hover, +button.button-outline[disabled]:focus, +button.button-outline[disabled]:hover, +input[type='button'].button-outline[disabled]:focus, +input[type='button'].button-outline[disabled]:hover, +input[type='reset'].button-outline[disabled]:focus, +input[type='reset'].button-outline[disabled]:hover, +input[type='submit'].button-outline[disabled]:focus, +input[type='submit'].button-outline[disabled]:hover { + border-color: inherit; + color: #9b4dca; +} + +.button.button-clear, +button.button-clear, +input[type='button'].button-clear, +input[type='reset'].button-clear, +input[type='submit'].button-clear { + background-color: transparent; + border-color: transparent; + color: #9b4dca; +} + +.button.button-clear:focus, .button.button-clear:hover, +button.button-clear:focus, +button.button-clear:hover, +input[type='button'].button-clear:focus, +input[type='button'].button-clear:hover, +input[type='reset'].button-clear:focus, +input[type='reset'].button-clear:hover, +input[type='submit'].button-clear:focus, +input[type='submit'].button-clear:hover { + background-color: transparent; + border-color: transparent; + color: #606c76; +} + +.button.button-clear[disabled]:focus, .button.button-clear[disabled]:hover, +button.button-clear[disabled]:focus, +button.button-clear[disabled]:hover, +input[type='button'].button-clear[disabled]:focus, +input[type='button'].button-clear[disabled]:hover, +input[type='reset'].button-clear[disabled]:focus, +input[type='reset'].button-clear[disabled]:hover, +input[type='submit'].button-clear[disabled]:focus, +input[type='submit'].button-clear[disabled]:hover { + color: #9b4dca; +} + +code { + background: #f4f5f6; + border-radius: .4rem; + font-size: 86%; + margin: 0 .2rem; + padding: .2rem .5rem; + white-space: nowrap; +} + +pre { + background: #f4f5f6; + border-left: 0.3rem solid #9b4dca; + overflow-y: hidden; +} + +pre > code { + border-radius: 0; + display: block; + padding: 1rem 1.5rem; + white-space: pre; +} + +hr { + border: 0; + border-top: 0.1rem solid #f4f5f6; + margin: 3.0rem 0; +} + +input[type='email'], +input[type='number'], +input[type='password'], +input[type='search'], +input[type='tel'], +input[type='text'], +input[type='url'], +textarea, +select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: transparent; + border: 0.1rem solid #d1d1d1; + border-radius: .4rem; + box-shadow: none; + box-sizing: inherit; + height: 3.8rem; + padding: .6rem 1.0rem; + width: 100%; +} + +input[type='email']:focus, +input[type='number']:focus, +input[type='password']:focus, +input[type='search']:focus, +input[type='tel']:focus, +input[type='text']:focus, +input[type='url']:focus, +textarea:focus, +select:focus { + border-color: #9b4dca; + outline: 0; +} + +select { + background: url('data:image/svg+xml;utf8,') center right no-repeat; + padding-right: 3.0rem; +} + +select:focus { + background-image: url('data:image/svg+xml;utf8,'); +} + +textarea { + min-height: 6.5rem; +} + +label, +legend { + display: block; + font-size: 1.6rem; + font-weight: 700; + margin-bottom: .5rem; +} + +fieldset { + border-width: 0; + padding: 0; +} + +input[type='checkbox'], +input[type='radio'] { + display: inline; +} + +.label-inline { + display: inline-block; + font-weight: normal; + margin-left: .5rem; +} + +.container { + margin: 0 auto; + max-width: 112.0rem; + padding: 0 2.0rem; + position: relative; + width: 100%; +} + +.row { + display: flex; + flex-direction: column; + padding: 0; + width: 100%; +} + +.row.row-no-padding { + padding: 0; +} + +.row.row-no-padding > .column { + padding: 0; +} + +.row.row-wrap { + flex-wrap: wrap; +} + +.row.row-top { + align-items: flex-start; +} + +.row.row-bottom { + align-items: flex-end; +} + +.row.row-center { + align-items: center; +} + +.row.row-stretch { + align-items: stretch; +} + +.row.row-baseline { + align-items: baseline; +} + +.row .column { + display: block; + flex: 1 1 auto; + margin-left: 0; + max-width: 100%; + width: 100%; +} + +.row .column.column-offset-10 { + margin-left: 10%; +} + +.row .column.column-offset-20 { + margin-left: 20%; +} + +.row .column.column-offset-25 { + margin-left: 25%; +} + +.row .column.column-offset-33, .row .column.column-offset-34 { + margin-left: 33.3333%; +} + +.row .column.column-offset-50 { + margin-left: 50%; +} + +.row .column.column-offset-66, .row .column.column-offset-67 { + margin-left: 66.6666%; +} + +.row .column.column-offset-75 { + margin-left: 75%; +} + +.row .column.column-offset-80 { + margin-left: 80%; +} + +.row .column.column-offset-90 { + margin-left: 90%; +} + +.row .column.column-10 { + flex: 0 0 10%; + max-width: 10%; +} + +.row .column.column-20 { + flex: 0 0 20%; + max-width: 20%; +} + +.row .column.column-25 { + flex: 0 0 25%; + max-width: 25%; +} + +.row .column.column-33, .row .column.column-34 { + flex: 0 0 33.3333%; + max-width: 33.3333%; +} + +.row .column.column-40 { + flex: 0 0 40%; + max-width: 40%; +} + +.row .column.column-50 { + flex: 0 0 50%; + max-width: 50%; +} + +.row .column.column-60 { + flex: 0 0 60%; + max-width: 60%; +} + +.row .column.column-66, .row .column.column-67 { + flex: 0 0 66.6666%; + max-width: 66.6666%; +} + +.row .column.column-75 { + flex: 0 0 75%; + max-width: 75%; +} + +.row .column.column-80 { + flex: 0 0 80%; + max-width: 80%; +} + +.row .column.column-90 { + flex: 0 0 90%; + max-width: 90%; +} + +.row .column .column-top { + align-self: flex-start; +} + +.row .column .column-bottom { + align-self: flex-end; +} + +.row .column .column-center { + -ms-grid-row-align: center; + align-self: center; +} + +@media (min-width: 40rem) { + .row { + flex-direction: row; + margin-left: -1.0rem; + width: calc(100% + 2.0rem); + } + .row .column { + margin-bottom: inherit; + padding: 0 1.0rem; + } +} + +a { + color: #9b4dca; + text-decoration: none; +} + +a:focus, a:hover { + color: #606c76; +} + +dl, +ol, +ul { + list-style: none; + margin-top: 0; + padding-left: 0; +} + +dl dl, +dl ol, +dl ul, +ol dl, +ol ol, +ol ul, +ul dl, +ul ol, +ul ul { + font-size: 90%; + margin: 1.5rem 0 1.5rem 3.0rem; +} + +ol { + list-style: decimal inside; +} + +ul { + list-style: circle inside; +} + +.button, +button, +dd, +dt, +li { + margin-bottom: 1.0rem; +} + +fieldset, +input, +select, +textarea { + margin-bottom: 1.5rem; +} + +blockquote, +dl, +figure, +form, +ol, +p, +pre, +table, +ul { + margin-bottom: 2.5rem; +} + +table { + border-spacing: 0; + width: 100%; +} + +td, +th { + border-bottom: 0.1rem solid #e1e1e1; + padding: 1.2rem 1.5rem; + text-align: left; +} + +td:first-child, +th:first-child { + padding-left: 0; +} + +td:last-child, +th:last-child { + padding-right: 0; +} + +b, +strong { + font-weight: bold; +} + +p { + margin-top: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: 300; + letter-spacing: -.1rem; + margin-bottom: 2.0rem; + margin-top: 0; +} + +h1 { + font-size: 4.6rem; + line-height: 1.2; +} + +h2 { + font-size: 3.6rem; + line-height: 1.25; +} + +h3 { + font-size: 2.8rem; + line-height: 1.3; +} + +h4 { + font-size: 2.2rem; + letter-spacing: -.08rem; + line-height: 1.35; +} + +h5 { + font-size: 1.8rem; + letter-spacing: -.05rem; + line-height: 1.5; +} + +h6 { + font-size: 1.6rem; + letter-spacing: 0; + line-height: 1.4; +} + +img { + max-width: 100%; +} + +.clearfix:after { + clear: both; + content: ' '; + display: table; +} + +.float-left { + float: left; +} + +.float-right { + float: right; +} + +/*# sourceMappingURL=milligram.css.map */ \ No newline at end of file diff --git a/infrastructure/web/public/images/icon.ico b/infrastructure/web/public/images/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..31217dd501ac29d5342806adef0a5b27dc512477 GIT binary patch literal 46841 zcmV*GKxw}K00962000000096X0OPg*02TlM0EtjeM-2)Z3IG5A4M|8uQUCw}00001 z00;&E003NasAd2F00D1uPE-NUqIa4A0Du5VL_t(|+U#8ic%)U;zA4*xfu(m5L_h%x ziVabJ5d{$t5JglJ#X=JiMcT4G*_6%hruW`^@4ffld+%j3Gntm;{P*0MZ!(#DGnpil zY<9`F&v_=BI`hqa-_y?_WaqkUE+k zbtzooALS4L7n0zY!T#^>7w|wrc(Pr3Qf6aTdbT7lCm#y)i=ecm3@R(Cn3NQiLVixc zLPlEVY;s~sSxQ3c`w2nm_u2h6$UMO#n?#<-CQ+7IJ2!Xd+PSv#RaR0#GJH!&VQ~RT zaL>LjDJ;VxB{6j zyD&Q=2g*y!p}VUarl+PsBocvGEM|fqYYO-I+1Xhb86II|ftEsgLe_M0RQj3VfRLM# zW73G5i#zdj_u9GPJJ-&&9j@ZoTGHr0PU0gHNlHZK4QY|tKGdh5Eyyc?w$^r-o}T6f zyguQ+e_~<+T3TA6Ag>V8lGBUQcKGX*3r zGJ!;dM1M6kIXxyjGZ$*AYM2&Z3+VO9=;$ca*3>~(dbTt@s|$VicIw9q1cEhd{nac2bPalYdZDzq z3^G%*TVf*O{uFEzzdJiShvcOc@4O*9*Uq&SS6oaysVJ=^S!vlMDmrR+T3ptN%;cQ8 z;-V7h?;kK4=yeeR1`Hb;njkwPN0JtqaBF&E7KyXVBT3E$J8#g=wR3IOl@nP) z3c{;NT5ujo@z4E2T1=LIRz|k0sR}Q_4SERD1^Sgekd+10cv>^QWE;vr=;8@ z=0YZkjgDh+iJfcb+PRE)B{>$5WT!%MH2rTR(I@N4^rXzzL+KbX!_@4v7elWU0)ZYvn~Sp2;xZp?9x z-Mbj``#(;P&&tcn$cDPwdZtM?Vvgg_qG?}W*8tg>*~>t_8VRH(r?E$LKae;^Mn>25 z_p$r1y0RM5Q!+P(}j0gLe+V&h^>7vcQi-+ozN8-&gEPjmi9F zT5?7oYUuX1_6?`_xbod1YUb+$`f7qifPzHO)Y!acQex>s!7OVx&dthSOo`0MN{!6= zN?A@7iFL>#>HdW~2Vv*>Y+V=(%TFvN)b}P4_DNTz#$;J$BxQ*atOFY?>E(RzdTK#r zre~=&xjt~OCMij&Oz`8vf+E&pyq=ze;o)H@D=CN6r1Z9!@VGxG94p_O8kx^Q}iRWN3yuTyCEjdGw7@m42(INj9M_X6&;)^em z`@VE9dG5LAb`H*rbqIcK zRs^#%BAA(&h5pVVD9NgXsNh&Q{>jO<-@o+A$B#Y!*!4&N&ph+Y4iW5JmsX%J$)$iK zUML_bZ?~E!2B$wowR2NedNwpSwHRe;&)~oyo7cA%a2sEem?UZle!eKb7zX=?KsZeS zK2EKaVG&IC3t_TL1mn#j7^xA$P}wXD76_p)dltHqr=cZo6l$Wop*Eu(^0NxT`J6kv z_4jvTpLp_TUwQ3Mf8DVLcCJh3icg3q)TbqJRs~n3#b$kw8lNG?lG|P*l=R}yW8f__ zBWsz~Ha57IgF0#HZzZGvx-e-8nUEfz4OxkKke5&bg>jWo5?cr5aZOMi-3d*JgV38U zfZmi@=t-iIJPW<4v(T3=gn?`k3>ArBv~mu{>*rv!fquSz1lnplp{1%5x|{o;wyF+- z0)pYafB&cZ*Dw6$*?YfykNGpt?pOjl*EaX}Q~mP^4$Vx8Pq`&EIx{XUDPsW_aj=qJ z@y7gpv>dQJ7fo&BY3w95iKHZ?L25zw(O>@b+WE(R`RM0t zt}Y;6WQh2hj}b4^Vd7&pLj3ROA;CYbBc235H$?pQj*!4B$4S7Uv7JM?b8XF)8B$2n zg7OJ&(@FNr{R!3jd01|XQEp?D^iE7nLS=cS9&NuI*qk|z8ap{5m1*sagdE6B$YtQp zPb{OruB95g5h~+bpf;h40=plY<0!D>$DloK3OW;}8L-t_yHE^c6>~7rK!M#Z1!12Y z#3K~k(+ZG_7GPdV!L2}GQ)C->;rGg9GIo!!0upN&3erlUvj&%#j6q*tA1fa6bn}A$ z{mL@$oLTMT-elx^KBl9Oc#@$<=*N%v-PZG+z(*Rcb|*u7Jf`#LDSnUvyDfeK zIuoa%J7orX)2P5j22MfCsE-4hmyoQRG#r6V|RI(4c+ES`c3T#5Fa8Ue)~olA^0B{ zBmM_>EQOtG9aqGuOd^FKl3tWVl05RR%1p?yO-)E&z)reVr}XNHjtgh02t+VDErP+$ z5h%&5RGQ<7Sb|%%@xgr=Y7Q-lN?Rp7J zcSvBiPe!%20wj}4lU%K}7d8Re23`vb=mtoY%Sf7A7}=#o=0IEF08C6yF!unf4!e80 zATP8M;-2hUYm~(iJ|a64 zjz5zoec(G8B+IjcG{z2+mbg(;6VpX1Vp~Xi%rxnYnI!{>ax$E{K!}8pNT0YrB*mt* zWu#<6T~z~2j?92yR1DLD6xiJq*lj`>YZSpqwF=mIvn=)1n=#7(-JK+Wo|IW;jx%uQ zP;eL1@2{XgTSrauHYo^tr63xS!5lTor2^`2i|3cL_V&lO!6blI0D_#e0#bu>p*?RH zW@e^Yi~ubJ&Kl_G=zw_dOgQ=7KzPgC6W%0LOgQm?w@kd?-)2GZp-C(pGff8z^L#kJ zzY5$Aw}SsoeGql`1jOAdfQ0*m5PPR^G4gX$v%%Mml~MQMv=`7)xfcYc| z{z*NlhAVbv7+k6s=H;^^ibzp(H3M~MNGQpTDkUW`^`t#|nsiZ6x5bZ>wzvt>87m;d zav;$c()ZWK^c{HvK*3!ig3&6fwVRa@a%Pf`%0W7#1U5#=(ceb17(t=)-{RVW zZI=Q8C=?17GeIi=V*wc{Sy1BN0+T}mHogo=0LzCtA{ZJPgwnhUaC$Wo-o4VBl7JVy zW$FcQoBF_eW+CvQX$*X7k^(14HdvA(upt$2j?{rYX#r=_2_B~X;J<$q!f%*{_%8|} z`DOz2KD&nrJ_bKiwF9c{cI8HvlI*A= zQXSnzx}t@oJz|E?!$X>5M;XBT;w0pLdt#CiQeavTQDagVRlUD7rr|zH0AKEk5q_yL ze&DAR)E`oSf7l*1eY7roAd3=0MSI+2c}LuILtEUqq%&?t(G@R{cO}d$b|ndxeC-_S zt7H1BLd^2o%p~uYf^e8>?MXRED7a-}1t?_H=bm2$YfCFcoK1yKzU03Q{6|cZm%wjQ$-wVGni=@rNiTSk zLGU4?;72APfXqOMnGm9`l0ed3a!C8S43fS+3(SiL<0VVS=~^Ihs{Q zw_o2CCA^_6Z2HDR-=?27$Bev80sc~Z?9`v?(kecM;2^mOdm9IYs;aUIvJ>;6!ncQ&3kzli>}#4tz^s9ZaTpjJfV`w)uzx-pJ~=?a zPgLMHDWu@%G(UpB1Kd>L_tpS^5SfJ#B8E^RfiNP42va%49iE4jdnp+_EP;dvX6M3g z8_)6ka_fJ6e_D2%I}wwhCu&IWvsJ{~e0T?}8@ZqtsCiyPTB9cj)wrZSu9tMgO%V!C z0x3YsqMG)0MTqw{_>Jw$^{n{{HOs%>95?a^)zCkwjq5%|!F|3fcGivp+m`~og?`*l zP5F+tm`O1OI#8_*T?tfF;6`BgTfrSS(IGRPc`?b6vUHKkWg^T<|x3W z3JUId7O0wE;F0+y;RCrLvO@$*R>0ic94nl{xdAvNCC{?~Mrvn4Bo;Ckfg=HJw_t2+ z6q@RrA@q|hICDz|Sdc=nHYo=?QmX;}9u@dURN$XhfnP*{uLOTMkwXNThe)!(Bxd&_ zB;B$I>0g&a;zKhK_T_;l{|8$C>;L2GoBgjIB!2rxb}|QRxlo(OM#Ykb=mAm_-$5V& z2sO!XXpNry0yV=QsE+OU8wK?{6v%J4#ZR1QjT_6MALmn07qmo;jkd>4Nhz=;6xhDbdA z`+D~Kk~tD|XFmx%G`<6HeOF;*4JnSSXTi9-sJ^SJ;@X~UNa(-N5IYo9_l7$Z^L2mOhu{l|iXzC(Ep0dX=lHP0ZwE{2%_3hp5U_Z*04BrqqW0H2evl#x`nQe;eIdW8@C+mQ%9 zt8M`o3`A{?>AtF}Dku(Wgn?oKNThS>2q_x|J@&) z{_?F4?hiH*-s5XJ{^ihp!Y>8wnfXP4`P4_DW^*5fn2Hj^%p}#}rZPdK$^5)7@W<=| zh}{Dae+VGujzvhmUjpGbO%40(8Ghf(WazN}ot?y!Oz)H(FZ1)~fK-R}k`%kL2b-dY zgFE7<70fS>SNi1GB8m(znwf(+F%^kYBq&meQY6cTk$@iA3L?1Ftbt2`2=F=L{YOw^ zO0c260ZLPApebw&=0wW(9^(YsM4-zp7#$sj+L~JM@$`j%zWGk|v(G*AEIC0;kKFH1 zLe0g5S^^}@L`q!ucI*u}Fn(3Q-ihzh&p#cyOMEtbmoz5O5Q7=!)65Fdu&fbpx)Z;J=>AjR48F z0;Jx(2=QMKL*Uh;{XW-q|1Rv^yuCpWc9LN8+0Smu5MOw8L^ml9Z@sD|aw10U+f%=O ztZ5cRvtqShrzzWw2zKHF7sm}i4US{T>+9;FEVvB@@@H902j5ffedn_Vbh!mcC^c2J z;Nj#2um0)P>SvyP<^?>b&+^O~@ZCE?{C16#(7T36_?5H7?w&l;-~-clgdLjweblXj z%($x+Q;9cF7vL6Z0elW1?M{I7dnh4%K?cFsj>&!Y4_O7>G`!D;2+28Qn9t%B@b6Ue zP4c2im4C058vKa}ejJRk68MG^fi4pGtPp`-V8c?85uflC9Bo%O00E2>gqxe2p(?!z zTB9aeYL2s*Ui#p%#~-`qm%scaLD41xoGajS zbsq^hI8K5NOp!6PH1okl$oeWk_Cu5izPti;n~@UsK{yr?qL96LgqVuoL$+J7DipeIcL)5Ah_hn%4#u;UhJ1AhVL zWeYGjv;dQ(3((`c0QK)LK_swSKDIfuy|J_3ebO z3cNBNT$sxF7C`QI0dl^*2$46;f|toqF_n9L%}0qF=_Mii1)mK9fP5e=abp&o_8%-4 z@Xp0E1`%A=Zh;2q#e)>^9`jKCM+KyRMFG?og-A06gp>72{<81S`4$Z8$P4u8XCM6^eQFedXQf`!y7y(cjZ9xK<-7pD!W{3ck;FnG; zK!4Z*l)R*Xw6Dk^YM)#U;0Pm#CLu)aR$2=szn+J_5c;=AFK!$FL5ov?Iy*a|p`Zhr zLnc8gRH)0abrHc@tN|3XG_d^G!_@=c_{W>=&p!R^ujtbthFAl51s$9u{?`wXtowk3 z{IL1Pw4Y8{X8%wsDEuiv{^JV}amzILnvE6v?HRil+l-Sg_rPFLYz;|@O54*A-=E8+ z{U&;5VU`jAz5yr~g9x@m{lKb3uz=v72VwU-w4R-ZEUKMju22{i^o9^Z^nL|oKCFON z8~R*27B5OVknKDi8-t#nZfLGrNYV&v`@9|;&j1lrcX^z;-PxsC%#KK z)XTsAoi()vZltb(LHh~9|CdW59~>s35A>54zxfx_q@RrcH2a70nxbDULjKR@A?*4| z@G~Dz4c{+56tr)e`0pLNoLzu&f(+UmKWwWefL_5e0?eZi_xpeS{7bKsgT(Z?=bk56K(yM$N`a}BpK~pc|2=1Q zU(pLP_p;wCLh84~;Ja&NA^48LPu+0_;TJnD-*`Zc-vBB1==pAY%=8Re0V9n9bze7% zp+s<5#|KoMhZE%rDE-}%sc#7Akt9+ms0$vShuXInpwnRyh7%S+(6k8R9sqGSfNTOl zGNcqt4bIdo!g&57%N*2wpn#(1=b3hoK4_Sgz_|v6Pb*+7Z(+;g0GPJxrfxuMem``^ z3P3TpR1d*N1gp6Ph6D*w(ETVWECXu`ThSkW|BBmBfA;tdzkTs#^7TjWU)?46D2H_X z1W4SEhDh}11qaif)w23fOZa$R zSDXL_is+4ACy}pun+}OymKn3mp2SGY;E&1#HHf zrWLT7HLzJ}!;2jsm|s+|5#9Bl$|3F=-C*N@7<)BF<`vKvxCnEbr(o z(wF8T;YR&Lz*z&e@6EFUqs5Ui;h^Z{7343onqDUw(OYBB1U7{0&HuU+`6x|4=w5erz;p^i_X=Zzf7oaJ8Pr+q(ReJZ5a?hUcv`0_PpcOFM#7_Wgbqg-#_<&+w4l`|XDE$Kkl9@h$DaoPy z5A!gdL$#rB>jH4|a{yCiln7p?5+ayf*R0p1hzNMj&jL7_$SXEl9bk@4?~AuZfZY*l?-#~N5`NijzR_&j2wW8uWd7J0A!?zJzTcRWY_@BjX9 zRZHO8&ptrNVPYC)nes^Fclv7sO{b|6kk16|nt3eZ_DPcZN!{f|0Iq+JBD2Lnnj%Jy zbVkpxDL<2gGpiE7;lLpw@-u4ycnR{a{md=eUc-@AzSOaTy3pCH>*ytD(6%>Py zb3oJo-u>v;sNpXhaVIf8$$Bk;XMghx;&4YP@w;~52VN#a6A_q=*)vxg^4+$3LmzD; z;eRW=yjp@AqlQU+bU$?irUhsPj5JW6N}%+s)=LDJTA)y_kikTi95TP7C)j5qhuj}4 zV4`RNw(Esve#wjT)a=(o0^d-;RMo<=T>VA zU@P1LOcypcwO~KNq_2Cx%MI^J?@0Xr7pXOj?Z1=d3m_M4L6MFOpu=&2H6w-V2w)aIO9^do{gwcq|IQkOW~O0y zUF7Il8mk@IF(__TZ-f0;waKkiEjC&vKvxvES z21=d*DEQd|q&y`4Z`RL+ls+yaH=rV_4VQde(aO021?UD$tGltZNnoRH!FH)1=uePA z!mTS!f0jc(Acr#ABOIdQD}{wfJQ$mK2y-(F$oQx^wDz?YFsGLokyU`V-TtW zdZ99+11b|+pfaN#%5$rstgswP3QM85uowyp3fXef{Jea~&!v)A00mTVRar?<36z(X zv)zR_thBwYoq~UWDKeZ`-5y0rz-xj%pN578NKQzF$iSFbUvIxJCi~|QKbvskZxyvH zKIVJnAaw_Zz7>4a$V};P=b`G40Hv?UyE9+!dnotsqa^12vde=22BR0qK+HUK14cgW zh!U_M&cxsn0c;i#T&(zjOfCgMw-hoS=J)%t7QgBZ1)Jc*RkW@5!cM)!+n2O3K4LrX zf@G5kKt%!y=>jxcDj;evKMADVBd4y({JKd%*Y{~w2_g`CyZWKCp%2>2`k<|_A6oMJ zprxP}noByNxw;Kn>RVaBuBoXB8XFrKNE_rMZ=XysNW|^#u&{ z53nF4{yhvx;<>{!g03FkhmmqI)HqH+ci9O0KK!}doID5*jc5<^iT;DzdtrMqLl6@j zPvTBADiV+i=ArtZ%2H)M5-9t+NGCg4KRFJQOz&W55y5BAy}q8~9#xu^n|2 zmqx%+G$@BU*GXuNA7g>a;h|wh8fY=ZMI|Ug1H)}oBQtM|@<<}3kxj~Mz}^YsY}!UV zclCXm`r~P6`~aZwe*o40k&fm3yZ_7C@Ah3jQ-v#|+DUm-^C9X66m&$)KyMx;fXONK zoVJTW1jdXHsDpnBDGcXIsaEDU{c)?zRE>fK$BZ?txAO1v%l=mU^$M6OUECT1K#)>k z&yCJQ!7upZ0Wnv~p+DSkD_|{xF#+MMkdXia4#A8X8-dLpsr2^tvPiuq$WfDHi7}_m z@qBRaF$Z+~-I}DN?|nj7t}UFp0Y2j}&@s&Z4iW(h_7Y^KXF*h0Oi`q3;uGKm#NQ`? zxY~FT@0&Y_*XNs`i~7p2tm()iv>XR$KDj`xiShq}H;|D3Wn3NvkQG@-CY9NMBkhy` za7Vy+{}KUQszjg(eoP`?>Qx|G! zXm!o^U@g~RkqBy>CZMNcgk=Y?jTr@>3zAT2Ng2dPCQgTWMxSvx>v=f9H<0-59wi=R z;O2mv`!)CH zYH|e$@Dagwj1MgH`&9)$UH)@@`|{}9yxTmDT#t_5Xwfa1HAwE9&!abD4LpG7ubzCB7L?`26fKV z4M-kSgI`-38=D|GF$IDGf}^Pw@K8`Ht}Tru9tXODOI{N}haEt>4M6L8xwy)8=m*uV zLzhn+08@gc(T#_i!^ZPlL#Lr9X9_09C)JA`w}UlcC=skA04a#4WRU+9zxGf6h8(6_ zWXm+5u?Rrey#UEykS~h^6h1Z2N_e-F04RvXBlD2^7{3*e^)R&p`msPrNd#DoBb%Lv z*{*q*X;QHK{6;MS?OKe@1pJELiMa)637&=qf9eKw59uTUj6Gn6Av!#!H`*)dpXu4D z`&>xZ>lx2XLg#s4B+zl5x&z+AH#)3{&{2PXZ?1!EGm)wPfmm#l~kjEV64detA}9~l+3pIuZEz&U_sH(`A6*|tb$xJa_Bj0NnU;6if}4{FXl;7<*Vb-ylM3oH^Dp5K>GvW@qO>h)Z-w=yyBBSQy3#fJ(EIc%VG6 z6t)c1Czf}71BL~=2BPYB#e)Zvp@~XRuaK_tO4yQGR(h} z&cSH8gg5e!v-dl^rBpAjZ#=jm2OdG!?K8iu+!#OZa$VRo0?;M_v_b@}3ow*44=pzH zkn`v~M3}5?0BOcUGMF3LI00PDm1pSEH2F?JL%Z8p zb4dW}0Hzn9;%^F8^%%8peN%`rNLu+Cy*Dx=5aLB70GzDUojeQG7sjBcc1Y<4=pg`f z1z3u5upbIe_dxlZb4zi63k%Q|Abh>mN5}^4UYaujT-=C%fIo3`KTF~xlKv1C5<3s0h?K|tm$R{7%lpr%7?}hR zgt#>*?SbV5L3ux>cE_eS2Q9*Q;Q}-5H?p??OQQ!Oc(MeS7y;ll(I|n+v*S=6(aLH7 zG=a`1%0i@ms1EFdqSt1ZEC7rHxX;?u{vAj{KsvEM?{EnP{9{d z_l~iQj*Om4N=RZQmm?#i(49jGAaDx0vL|3{Y$X9~7b4KK2DEz(=A>d6%$;M6INFCg z{wC!R5S#(X2mrw^Q;~q&cqG6AaMbTEd~SIl5J!OvTQ~o}<0PPjTh>ni_;aZb$UxMm zV3~vsTSOO`03?$NsCS!!Y`aDX3ygq@vI^+y=~IK9d(;#pfX4J*$o}mlv|EExYyc|V z2kL!%e7=I1va+rnCpk0UD3avv|k)2tW>{f01lB4Y+OGfcZthLAb@%{orFC z2p;Ypke-^(0)E=y$N%^C^g>H>GvvkuG>CDy0|tAkZ(k$k)g3N}MyW z?I!>wmWPulhg9-D={HFXPyK#eL}F7+WDM)H!VND7eyq+K9UG;fA62>m!BdP3kQDIi zYbAosiVtW4p6~M_5hVwK2#Wt8;n9B7{6DIk37{T1B~gk@DqE4G-f-%Rn$Epp%9P{M zlpzJQ+A3Xy&CY>iPeRo{=6U-8R+A_+|6>#zHvbJR+ue$5tY!`>Y{nq+d>S}8I)SsJ z3xtJ)L3LI2GT>wL5!M7GB_=^kSUkl2t`(X;U4+(Cz=)vs+!RCxM-TgW``qv64#|M8A?OC6`H%hC_&7SMBmhoUBLQO& zfgzRvw=G8VXP6a031F&E1nJ*gnf{BuLJs{&%K89qHh^SK!Y0h%$C^V!Hxd|B#}}v? z#<62@H!KeXmj6jrV6!l>OLRCc-1Abg=9FxTOBuMyc3)}n9a)J^7l_on0 z#04ioU_ijHf&)TGn0M6nEb}c1Xdw~q@#yp467CZn932rYO-V|Drl#iQz#q{N`v1P# zF=z>*Za~x|4E2mIBLG8*U^C(ank%F=f5&nHn1$gAAtcdI9^J#e0V*U0N+4Mv^0dnGFEY@83)Mvu5t%~W)ae67RiWvl*=&JV*XeCO<^?i zUmpQ%B?&CZmCZqg*4^M`??=J!#0bFA-U(csTp>6x1j0kZ8SoS06QH!Dl=UuDo|#~s zmCZ*1nvYPiltW5rHiQO-ee4nJL}CMyw-@;73n2+1spNFhJ0!|A`I}VhCsXiKmdj>6 z(M#HXWQB}U8R{Nk;BO9`Vq}1>0e=5lNWhr!0ZriZ{jOyMAfAP;ND)Num-G1l5}2J- zW(iofK%|s8@tnHjOtV~dwKZaVz}Fr?A`wfW_+{BL0>E8?lhw+Rrn{1kO+<{0^msCtj$>_p6;G(yck-A7%Z-L zpMc6YWYF|6)&3tUI|Fm0OCi8NFv8*eknNQT@bmU3zFvN0xO0@mM#euC8x}th8x;%1 zMa8T?8?`(G`>-Av8iCHtacK6NVvmd%G%SXV62V#;jWmJJxfq(R2KTdS5)cWX!A8uR z|1bU992+31&K}H)*#9;A2(*WYuC`W8^K;r`tl96AOQ7NO@^oa>J~{M;(cirw<8?PS z%N>{~!bwH*tF9PJx>o|i&dq5RHl)LHGcO!XR%1T_DQ7Fd*}+9k0O!u02OBFJusLIc zz-DI(&&BxU7}WR=Liy`b27a6mfGxr$@wE^X7+C3W!SQ;>3r-gw_&CudBR_@2M8*d~fwAivzSqOu`_w2u4OnR>TX8O$6E`pbPkV z2|y@-nj_+shulOC4OU_h&8Y}LC}KV993g0vfWE<^+GL9ygrqz4Z$GMdT@DM11*3ys7a43N31DirC1@H7th&Hc z<&h|tWRl>Od0%8eOjtx%#C%#x8nm{wt_pbcbC$`-FbsB$Fz`1~D*(v=2|(>8=pg}P z#0U6*uPe}~Ngj*@W&}*rhx0W5wE2iZIJZ2Fs998G$goiku-c&42ELjAWD=ODmq5bp z%iVyYU&&x@cBQq!H`&J6*FeMqB;LkP0@xzl7c$S%l$%We7b`w6m@k5Is}Tq}9|sQh z4shP?JhcGMfwQACv^2M{_W{o~Q<{_j8WQ>-|M#=d@E$<@zmWtMp+2({Vxwc_{`O(N z3GxiPc;Jt6P9b5|DdZ-SL!$f=zC|s7QuOz8vvXOCBWLcf0J$z1T6*kA9fv0GDd&JUR+54nAYlw60sNoOBo7g)o}yuO2XBq4C&MO zOr%s~bJYBwV+0@=lt9MA%LyR;AsNgL(4Uv-Zj;^2&N*C1u3ag}ihu5xgQ#@AK+r3L>T?s2U|R$i&Rt*xV1M2o%FD{x{ht`0P)`m*0%*?agS?joQ1=e78G&{G zUWDeHUPw+#h5+Bd{|5O75l?rotp|T@bSX&<$tAHzO7?{Kh5aQgAYv>gDuzWb(TqW$ z8Vr0ME1;)h44QnVpe2;L0bR<^Z3PkN0>7^B=SYC9jvkwVyk}O{0K{A+gWj}R79-Hy zGOMrINVCkC&plv3mnyY9`uY<3C>G99z|X;0l?1xOBv5}`3WYDoAol9zK}k#vj+7{W zcG&U+erwAmD5i zBLD<{W=1Bf1wlo^fuGG0q-VaZs2_5FI|FrZ0o0=WYY|#<`XDuw z9$TB@`^!sjkVL;sQkYnII3^&;D?B7p5+9oYb+z?skgf^vL&NH^O`HsLjIgReB!Ql) z5j6p5lfXuaK+~*W4g9(YfFps)(J9Dza-{_jd$kPuvMBI{Gs{*?YgQKO5^eVYL5sBn zSVJJ1kicYM z*&n8={qGA|S{!mQ2*A+sYa5CKC>9_yE|2;CC~+}y>X?uw_&EaTC>vk|Q2RPS%^Q>e z{z(ZSw;xJMiXkK@q$E5nVt;5z=+=PW$0mgMT8EQ>bCD$4IrZyNA+b@BVNnnr8N*5& zvA_q%EO&KvvEFB1kPogd_`R*oZBQA~1&tol(4IQB#Q?at?`JZ4@FeFmrJ0{MGBQ~%OK~+GB!LT`k>wFGbmewXtCD1?jZD#fiP07I>Sjgmk! z_4BF528Rod6u_bEJmGu5@S%-^;UVa%9)zMl&qB>#0jjCgyuH9ioL5v-Kv-~iSA1yl zU5VkTTSEX|XM&0QCn0+xed3>w3W;fr2#sV6hJ_1Q;l~v*q$H=Xyg#P@>T2ttwWW=f zIS%v>DuJvLT?9~1Es5~3aESNFga(f(Xbzc#0Sz}`BSf$o2^cDTS%HbMNyz=BnAZj9 zP8GnkV0q9`Upcb2dmxsGp)YBU0$#aR%n-0g5UuYskwXk6i{jr)K`_J>B&`fS8nocl zh%tjjIp2-})tIow%}EJv)CyS7Yefae!>W84@A0nv! zGbMn(Py%>I0WF2SY>z=?c%(ceAnZqBLE&3N0RG+qD368)h6^LYBOxgv84?qc)ZoWQ zPPlSL{1`j_($mt}c9rt73TSL-Vx^B*|IA*j%IwEs2skN~`ZlZ}BG^3~syzl-Fi_hK zSd9oa8Xs5}A&gBx(Vs*svjFCDXm%68)Xap=N<{5C1Wl`e5rJ3)RsWH!s@<1Jfm#N8 z6p(bA9CE&gz4bDxZKW`nwi5jMG7$Pwl6*A;8_}XH{D;d$Bnu$yorlRv1xz>2gRpO& zRR*%+poQ&40EQC5EH&|?qheUz--Dj*rp6{vP!h$nsM`{z1W-2w#eWk)DEHL&SKFg6bPzvUr- z-7;u$n}*5h37x4&?UbUnH83j>LiK+oDEq%X;7vY`du{UxAjl^aA!v4{&#Lhd5Wm+<@&s1QS!^P<33u+X+}} zJ;T1PEAyb8R$OTf2w=E+7IJ-4j=ySLpbvB5jbOE#e5{}mcrr)U&kP*ayQ%!xR~*QiRp2`>Bdp} zWGhVbqF04F;|JPV2Ax)cU*EOtcAMc1i@|IT6gs#B3M|jw4$S*w;b= zIs=9ZRgb}f{yv6f6Om*J=yX#~4b}!d5@$G(Ygs*VD1K1^;=#=;7v3lVXc9qpcMtRX zQL!b&C8%pZ@NBLc6sKSBrUZa)W%;jxNu8w-I$Ar}WTA@k3fw2q8|W2sD=O#Bul08e zBq!gnGYJg}b4CKdcEysSQYbAhgUa$sR`!eLJQe}r3&5fVJhiqeqUi+Gr#K7Y8@Ub*)#s0m|UW+G`68u?99w0F&d;TQmuAH%V8{ z0{q?_jP&r2Iy1D`NJ#|KES<<|3WQpjf;H?gTq^D=FySqoXA}C$b5)u*$2%}R{8U&FNkOmPEMk7)x0;0e` z1XN;3=iWW) z2QqKh2WlU2YjSN~ip8lhVcVf}(Y+5qJSqa&+Qd3h2sR|Bh9@Cs^j53VZ_gT;JW3zR zLiF{N1|!RjJ56CyowCih8Or&+N!K1cYs7v1>6feN_>G4<`N);AJ)FK>8p>?%)qMlL z#ZB_+4tU_U;4}Q)k%=G?)m;k5I+=Ak6{112vFrZqgwe(Lx~MUYnMNPWjhILU>o-fc z6*cXa9IhTijqftelP-)I%K74cUfnb?aJ#zJ0BQKhbJ`d%@_!bKoi_r$#%7*WAPl46 zrspgu^BG7`h#(x;r(8~kq2JlPuKQ|U%-YBQqu^OO|;U81f?mjPpO{a(JM2 zp%pvWT1yAq7yK;*7BHs)(&awu0iIB&sWNYx=Y`Mj$;17mz&B!JE%GeLPe;{MM`Gee z)7fHaMsK3OSX)}$LVv$&y@RGsMzO=UyvXMGz_YlWeRD*xzZ-|d*|p+UQ$gIm!A}~D z%`rXWSJm>xK5>UuA5y7@k86b`iu&&Oc4=xqG(GotrG!nqBGvk4Ha9TwJs)NAB<;Fp zxyIC%$xU21O-Ui>B@ZU$$yQ-{dCI5hQL0v{wp@t83f0trogBi04v7ML8nd7;Yurpv z&C&m&#>(4XPiMd#IsGJ!ZwCHc@9r-~x<19!OJ{9LlqE>DG!^8yh0 zMtP$yqk(sHwX%q z5TV?>X#{7(+XrM$bzyAC2R2@8b&;i!_PxQ_c|AzO7eC$d?awdWqXM0!!ZT);`cH03 zf3M7d$i&7Ba%-8gD?uJ-2$$m|(SL5~%q)FvO9Q;>ywO6=8vdv)ORYB*ToT(?EJ!2` zO7m&}&xWKOI0sV5jDnCr9{3>y^OdyxtfCP-i%fgAcF+B9)fOk}Ge%Glc5cppv;TKa zO>W?t3>m^%miGFlFVae!dW#Dbi)qUK6df=Y=95ksl0JNIlaO;}0b_-kIzn^s!cVZmK*S^lVJwY(lL>VO)3yt(mW=f~$~tF@|u zTlKP2Z*Be0Y(zS zEMq=O8ZSfma}|z>w?0NYx6{_oFE~TTE5?Ejp;BBZaI=D2|Ioi@y!8wip#d>t^&9;+ zu-wrd2!NPK(*C7la-#IppAT}I@2n234|4-A5g;!-yzZ*Z{`2)G%kkNF0PZ1FJvZ9Z zOz)fI?yZKB*i+{GZu*uM_?M&twjorxv%_0WihgwmnWp8SxTV;5bxXACgg@TVQTmH+ zG7v>+9$1T@rYayFT~Sq)eZPJ6vklA$$B~cSQ($C^vpJC*3lGZb22y99OHILm*De!{ zoav?-&QGG7@>c@<)TusS(JjOnqeCI^{j?rc1&KZH>jDjrs4l2RXG2!J8z}dU2ua;`6 z1BNf!bdy0o&j2}E>CBWD;u^m%etM_<5RR=o8P5Dy#fz#jL*05~uyyjspS^mc)=}6x zB&r$G^;Lt|+(fEi=Osj{68*sO{9W%59qfbkeTiK)JClnh0VOjN^EJXULegMp**7j) z@q}k8`t*tL$KqqxHYpxv72H} zPezL1NI-2ZE?58D9lP=q-AB!ZxLsbHCo5#>_#}y632JZSovn=ds6j-3_HoOEE*!x69Q9 z65B~~bqGE`VjlEODri#T(L4x8jSfjY(ES01sN2*nAQD0QQeoEt-)WYmJ1QhH3A9{v z|23yTq&IP3FWmG@Eci_~NqN(oP$i)As-U;U{;)rY zgc84Q7TwbUs6a3bFgp|626lC{H0;qqKo*SNR$)YwX>E8l#8eWj9y9)ogF{>ES?)B%E5Xk;u zKl>|uDB)b@f;1Pb^CvKu^`EiZtaM z4Ljx_@r0l@L0l?+dprIWH)~@rdCyCgM?z|1E}7xIA$~-@7QZKg?tcNYxRW?1ZAp;? zDHnlL{y7Oc>7M@n#lzboGF~S>6P4dg6-yKY(u)=(iZ+5Yi_n<9QK3OY%Eb|$FzWK; z;rEJ94o`;6)nWCdk`hTeI;Tl<0KJP79+ax+gSjCwgtXEnra3fWyOB6xdHNcCYFjyz zt2S)Q*v<+^<-klY7_Qt6zSKO?BF$kv#C;r|VUl?xLTP$d6cij9gG}@{BhSTWqbh%Y zRvj?b6bcsnS62D&p`xpbh$Fqft8LtF)}R$g9p0b|{4IlgUm<>1srPe=Ve6d&1q%|B`5;q^&elHJ}jf__s`$GyA{#8EK~johT@93o>e5))&<<9 zYLz=&nbPhg{r;OPDyn^^cJxb6mcC-E8Jwxmd}V1b9q@*wXnM@4^*M5kwu8&PQbJiE z{slSHy1GtOAMtJ1s9Th6rQ`qZ?NkXyNCLgD^t@Y$an#e|LTc@i`CN;U0;pz*=!tkhPD%a% zqksx=pKA5OeDwm6Q$TKTJtEroudq(|&3LKI+5f_4V=?~Waow5saRV#OLA&UopLY#8 z1us~ujmXQ}$u*`hpt}=$rwqB}gZS(Q^&|!nbO=LSh_vLq`}k)hRkJ6SAv`I+=W8y8 zGp{GBn)p}v5|g_XS!uGCqfCb2ZoBADE!3W*CFqGJ z5zR^Xi!dijn@PqX!lq5)4SF3w-dC1U)^t=T{a^eH*$?y#3`tG@Ha|u^KO1nZblc(q zdTjtPgeN%|s|1miCVu2pFI3MlqnXNvxXr=N<@`OatWr{DM!dl?M@sbABn zo9&VOS5dKFOA>VRwU%xte|9dgwJGiNk*L!g;A6f=n)NOtzOOoOp#50~&)>!8m8k$Z zF9@Q(9Lf@!__gk7U6Oh)}2XM@X{zBRf2E?Dx5^XTXj>nRG=qtDuUao5ZEWW}V zA9s*|gJn%T!L)uV`I0CTYr8w(UbRT_%O6U7c4JBX#iWK7o))ipO>2c!YrS(2*{G+( z4U6&)S#+nLS%Tbd{_&x;nWR`iBFh(_glG=k2$_9+A#QlD-Al2Sdi{vLNXHbmrC6|y z=ywterWP9ZNdTQ(od&Enq^lCq~!1;F(+Dkiv4e+IiK+G%&YR6Qds*VoFlYvQ{Y z?lF5}`D7E!6{?}Z8CSI6SfedLM~@_qKOFI-0n{X)K$<_HIOO?FX)cREbUiIF;`HHt z5C4!CZ)&Jg;n+(0h#@Yn2EKJ8=EhuDP%!*B_on6_`HdjT&<8cGWlF(4%NdKmUl;{~fL6_x7F}pz<}$^|OXFpK1l%kJU}w zTmSX?3q;Wlgm?v^5hdUOO?0>#KeUsrL>Aik9OEtlO;IdpgFrKf^*L%Y)9Wkk9U z1LQbw`e|rl7NZr;70Dge(gr(hAmAef^ z`upVN8|Nye)rRTN!D)9%$g)g4@VU(12Zln$1A z{V%9EsvzvCde=&KHs_1vlOo^R?@ao6ov-y01}BfM;@bG_-WHgY{@`aGOJr0 zGp1i0nJ*WAcHo{4$=ki{xtCW(+0so$qEznWgQioWqiq!St+hr~8h{yTMIPIaje7=X zp)Mz-YL%48w0wo_!6w2^?|GbNSU?kBUs%e5tCHChif50{(>dChx2?!C+C!j~waQRNd@dPC7X}IDD?3 zp_6-DFXg9(^bh)%-*YXwfy=IUZN+DoTjPQ1_3wL42zEjisu>PI&Xn%~X`LGKleB85 za|&XlXSM@iHS+D(2Nc)`r$-&P{g?N@+h&sv3G>OY{lbH2)Lag#dDAG2cbz0*-2*5_~7j8r68K{r_f(jY6c zazzHhOfE^!cB5sBAXf;MX9!*M+-rvtX~uB*o8f|Kd0xZlf1qQqo26tJEnsVqqu4k8 zc$2744vm{}vR5P~+drXSr;{Me>nM%v!9~BG)$Z|>qhS&YE3o}6^3g*Jet7LB><3T$ zKm3HI-)dzxtooVy^d_aJIJ+z{H3zC?J1oTA;+5|weg=3U?n$4MCghuXmdLM@fOX5p zg0sW!HVVyxKh!N&8YA4uUlE{(iiEJUT{8)9j^7%F+EKJx1kYVHf6cc>i2dtNMMp#l z+j7{s($&4X#)f-2jkx8Cl_sXNb=!3>T1zyk5VV1b>GyMVOTe|%y>vh(H5#WPHz(h^ zked_R_B64Wzon&hi7?0|PjFaELP@lU2Bc=}bo~j<-t)JBK5(iz_xVQ89HvZdr^%a! zitR?@E;CUyqmu>~rq$!epA?#`ES6?rZ_)i|I!RF7r~S!BMQ$s}n|8$zi9e?4Jp(o0zbKgIvhprBWq>!2ootW49_i_eMQRNz8wuX>*}flIMwI26+xMC) z_muVCQK&2hnWEJV{hpbA55H%1mIm-1N$?fVOTZM?fW3uKxW?XVH7LITnzqexD7bzlYwPk#7|mO9S4{myOsc7Whf++WSJ6uRPy5>oj9yUPC zG>HUUCO_peTFy@z!r`3G=vd52DCV+*NW9zx{Ihw_+Pb|7M3jX4Q_l@qh z8YhS{xgLLkn}n?NE82b@+gs_VBI=v5D4CasrSaqMW52v?lb92UOK!AwpvhOp{+bMqgkfs zeMjkJ31)i#s^SUogdny_xvxX0hPl>Xv@kgFE%ZP(SPCjZ;zv$-JFL z*`AUI@tGZDtAz}~%D;Kjd!>`TST=*W`AujXyCC(uZAX;Oib`tXYSrOS-d1mXu8L-2 ztd{T)k11g{d-KZ=$@rR1YT(ngnn~a%28~TjQz_|J9q>82?o2kqasOmhakxz|OMoQj zPhjj}7ADLNwCix}I*IW=c%~#!TW<}UrW7*f0VZvLh~4pTaWAlc){j+)!Ee_8?f=tx zTWSM{GD=QQPRTwJBVcd!Q1CqS*(ha0N6~czc3wrHR#HNaAe7sc!Azi>HM#1!F@eSn z58w};#B5BkGQ!7>c@{Do0!zxcRY{%=8@hS0{plt7+ z$IG6^EDc-SMCPA&9{psnH0_q?Rs5dYB45D^r^+ z1iSjjz^?R1=vml>`@LP3@SIQL4o0FFuV_r_>#MU%yC9M-xa4W*zN|~xBOhZC+wkXE z&p{m>!C_w#&VPW&A@|CglwDG)$RtT0B?hlG#c9EJ`EPI)p;l%zEmZT8I{#uk-a6svr}-K7^~@aSo(Qb*M?dWX zUp@e$e9>aUz%+%UDB)Lz2mY{E^_nhKjry5)2f_uyN@xm24I*uf^M8vFuYIF#w&9p5 zSah^iem#6RpU*cq7(;U}3pNuqG#^9#jUa08)K$&3(P3m6mNzD_EZagQrbrMaa;NDz zny>7>z#{`lvSX%MTjU2R*a~`XGr@mkMJ#@5{gv#V*o=c~osk^r`B&ZQgJJUaGWJNS z<#3h!tw^rNF4Z1|$MO|)&2tSHFALx~1CO{G81qoKMPZfDqAZKPf(kpyDv5L7yD#wMA$@D4P{MjR??j@dJN5d;Vr@LG;97JYFphDBGG|IX#fZRD-t_up%@Zq(DS6C}&}PW25yTH$LB z;4U8rK^&xq9adCU+zSc(p-slYJe8H>TB5-26}Bt#s<17JgQ3U%38xsJg$Z!J0ro@! z2N|+N(ZmqESm*IPN#u?u&4U+^DW2MzJVfK2kNO`g=FHS)Ya>3%juM9ql`jDD8ccfu zZjb4hsT21|dd1J>IG6|N7DR*r$%;bKbpjKz-H;~YAL1`~(oWek@LlNd1o>k}Pg3d+2QN}j%9#JW`UtingZtFcmAeEY2=oIhh|tEv=D!Sw zk9-^Wd(ZNti4a_^S3b9dlXs}U=ghwDYE|SF@w@kQ*lP_&2r;BN1=E2*hj94I9z?0K zMkVN8&m&KzX)lXPJz1#B@ruTdwsgTcGe}f_;LT1Y6K>xwul<>HTnzh)OGFb6zp$F< zk;cr>xWw62+5l*6kgO>>y+Xb2=h$-pImabVs~~tO zV!6GM4UVB4t|Yc|NG4)u_nXs5#LByhp_LE|U)m-v<#|ruEEnOQdPb??m<<6!Hs2%% z$~W$-y?#M~EG9nVQBzmfSi(=DGL0|nD}E7sxc3igyeZ`@r<0wVCVy60UbzH5pN*X+^DzJsq;d^* z$blW0C-xRJ@O#Xh)b2;dSACOmS4Z%eGQxVrOZKJSjUNy8b`!Bh`^l_KM6-IMPG;`x zJ{cw_f36y_(pA1<1IIA(IFSpZzEhy8UZ^qv`|)`pKE^BxcK$(uAwhfuXi(RVD$>6| zVdp-l*u^4S$ii2J{%H2$lRUApNADRT?5;SJq*4mGB8E}jX3=&A%`GuewpCa2WRW{B zauw3zzN>uy`i+9lE!RhYcUh}bPvfg^tpQkh4r7RW7<{c?eV6X5&wCYyL)#ry$!bCn zh%hRj8BMAYE(SQ0ku0vM7}Z^+{#WaBZwrI3C@FH%lrgi*4WD*;4FA4dD3(VZH&t`~ z`xWNjv7gYKX&THilX-`u7k20|bF!3l)m`ku-#4$NF|AE|^^YZm186U+@mebo87b{<(Rrtban$QvS6}|_vvXTJ>zx{w(R0ao8 z14Zw=8!v6O{`e_-McHd(+{jI1W#v1XcZ?KjC{wK@99n6ZvFthNWt(R8Ka~7>K^*zr zbm%?#Ufp0()Pb2OkoWTPvvc#{}*csU6q zi@aTWc>mnK_$JGA_E;2yANl1}xb3TBKVGqSrWf+*jvN%|7zp->k@7S4!kC=UVGQ#S z&CSbMvL2Q93!O-oj`ub~1WHxnO|tuUi(>qDgNp;v4y+LAzA4qGi`WxnGVmc+)aGs# zg*byZYK0s;dE{BNCm5Nw2{XtR9-RwyB;-HXmQv4b5@Rn?12}u%0*}-PV(|W74SJ}v zsA`iQUrjk(VAnDz8#kzFPSVCVPgY62Z9qeFsqiZ~ASt{Gdj0kz^D>VE?vrH?X6aK7 z#h8`1C~)3Y0GDV#^>}w5KMC}0EO_Zc4%x-JxBl*UM2dA2Z=DcclQ@*iief!NbRXmPu0J$n4Zl-%lnclQ3~O z%m=A%J1t5*xK$KQlOe2JzD~huwUV#dzX$g#eAFK<|2X;!6BUe<+~yNK0TJ|X1Ia0$ z_vK+%h9#~nzdH>=N%!9dFcFc{JNMeQeK&oVwB?)~ErvO;4u}}kIm`|C>D}G{8yMe*`M8TNsv?{*w3=hDm}SZI&~X;G0NJPfuItoa`ThPE(?-3?z=c#dQu= z3Kmyp>_b?nv41@+-N>8Q>Goc^zj+bz$CRPv1~bl1gEDlweUJ6J?0fr1d6gjq64QoG zfgY@N$3!xGCtVPc2Ud*QFD($j@Qrl&(9olTmd^IG@$M7IDLczcdJJM;j=A^ShsxLK zMCvIy*39cF{E(W&gWN@SI50dx)^NQJVq;@#m|B`)1+frxMS}>imEU31%MJYS>~+Kd zl+=0z-Fv+;;;swP@3!*_?)VnhEhXwrz3Z``8F)dbfDU;1wuAp5kcleD7nfz*dtZRs zzbW5#Ir(J3bf?e00sXWK^r-KxF{bqn$1qd(3PAuy7Sg$S9TOWqcbA$m;0t*GhwqU0 zJf^S2c(FgLT`Hh_Ey_jR^(q9crock#S0q9WjDXVBcjLDQ^AemnW@ZRW)oCC4`-|C# z4E~MFdXy-3lN%hdE=8;l*`o0ZW&XoOq`jiUoN5ttw8DxL>N`ZjBd;j1M3^=$B=D`RhALDF2Bh^jR?OjUbc-VL*er?G-7PIYOS*P; zV;XAQ`~Rgs`?b+0M2U_@>5);v$YHK@(Fr2()x{XX+t-C*%_y#!VgZF!v&2&t2^aKU zbZbLbDQnRYGP)BRjz;~`^&%|Lhyi!eI?@VUs5cU%rdLvrejL^KBIQRyoRtJcmgY_RnGYCxUYuII)$n@h zrFSRLb3%bEyNY!Tl-(nYlrzr=NqU%{{eRqg`#P<9*Wqkz&k3rHjz8H5Uogr%SKK#P z@(OQcaPfDN5%!D_b`0^}H?5=fm411IY;=_aBN4cr`tdevMAu zAohfUKlyI75kQB%)s44K4?pidPL-~iM_l2($O4wW-&C1A$L~6ShKg0@Bump}yjRUU zu0`Cm%daI=Y)bz_Nh<$`!5%aL^M=49feyHn@D=`}#>HQ5@MIdO8@lK=T)!hf6h2hA zYzvC?<-*$3zAfMEYypdzu>kuO_T+I^gC}w#Jmg|lN=hXmXK@QY^o$ySiU*l!tj-!tguINoK#ojSAjxcnj6D-itU zYtAmTY}|#y_W9u;BxLf0W$L_S(47~Ds{#|2X;?y(o!185BG%Dz1PGV#cThvNAIoq} zkz&G!pWrRLuR9R^gtnsCp4L^L1&G}s^acuG%s1e8bEm#xdcn@a`^g--(^2Xci@K#@ z59RUmAn6^Dd@Ij$!W|liXxNlpDbZeGJSJ*FtFXs|O_P`L+T@pg8*s{y8?{GlEqYk{n^Iw2PA}xB8A|~khG_~b zY8VUKy{=DU#F`VUb6$GkqnyGG5J&7k28y>$0U*_-Wn_ z<g0 z`H-)d=gZ~~Hr5j0D8rRoigbk#_tA}VbtBj>_G#3JwD}AZpL-rg_XprI1nSCmB24$$ zPEjjBb4%-EW>Me=V`cdIeDCcw1LBrr{2p6n)Th!z5I-TQJ=6aUfy2wZHN?<|Hu5VW~pSAYHpIq-ntAWAvLu^84x zCi{DsSbe1{M2r4SV-17Wc=YoWe`iYK10B;~P2huiNlemrKF(F)w#=g>^7Ef=6I@*d z0YI>Uza#se6Jm(9bE8Z-TG)Ihs51rR8XU{L2Ro(ujxIgxRlkm1A(Qo){2Mz(>9HirVP{ zNUkS^{z(##J@$~lA<_9{IGp$8UNRx+nRM+woIF3}#Z(x*8C!8orZ*qQA&#~((g^Y^ z$_(|b2{a!04j7P3R-$h%e1PVRM)|zlWTs9RJY64hZEjP`-wWiyqW3;Asuo91CNy8{ z(NpDIi<#iw-G;xv2X@{qh8X2&DwzDk(&pGHeBdFund!qfYLJ)0B4Ds>ka*yC9+UWv zgbc!UO2G$wEx^5Q04^Jf@x}1#Nyv#;g>c~XvXR%K^b8q~gpDc*#c^Ba^}0-)ojfSA z`X?e}Nyhc+5oO)A8r2b=xHgRLzsy`QN5wDKw$w10IKb3;El6O;2JO}Ph>yx{+n%5G z=G!M7MF__XNPGbQPKioJxaEYbmacKtICXNZvLPziT>^!XxoXB!OO>)3r~6i2BW~ zn7-eTQ&TL-c46G9_@w5iRH@pld9K+$64ML0+&6&NaybUihnf&W%O(C=j8aAbmdJ)u zQf)HeuRr*bsDEVqc;}%4p)!SE>ApO0<5dGzvuah|KJ4sSZ zszzbK9Vut0b*GqhQ{uTwmZ{}ZC}pP@;s%QsE*p^!5DL4E5jqr%{!65uue_<;oPZ7& zCWwaq?gq{XKMDI#0;yKwnPC%%=~;nuoHyQwNt9JCvdLca#Mwzw2(BPBz6l4ChLK)| z=9bStyJWwOD+aqp`hu$8<$L3w(nFYD^K`w*&j%!E5NtQnAx=-`Hbe*)1g`B}oe;X* z!H=%B-&4s!{Lk+UJa`^AtLNU|-(E-oR-NVp%h#TO1*$CGa{DtW-icib9>zYJAdBdE z!brm;#XxXWSs+zZT5~`PTwu)Rh{>KL-`LX^{S@i%IJP!(*>9cbmrHAt$45PnUkLZ$ z@IRqFrLHic0YSe)@c`tI2mIhJ79#YI1DlNFWn+p5TdHoKE*|rqLf@Nh zr9VS`SkXa5;mIL8g~U+h5~cf+gHJOdrajLu@7TNhh4!KvQpQtZh~>?_>+SqMn_+{~+O+!jRj(m(1}m z^(VH{i)4<4vQ>sxUs1@|fO67UA<+MkS~?W`#rzA?Y49X;hHxT+Q5N5&zzZ?tm=Gd0 z%e8L%{?`Y~A6|WxYKowx950s-pd7#Ejf*3JB6>V@i4G01BzwitL*l6gQI03+pC_8a zZAoxCLE;Hm<-?;66Hy7e9M-pHkQ*;1+wmvfwmo*sL)=x+xK&~O@@<<7X zMl_1$q~{w1XH5n)c2bAhqU~(&l;;ZzZ0S|bl!-*AgbrsO26M)-AWX}JquI;BYHA6r z&!gM@l3ztNIeof3kGk#Or_q1eZRWMIP7?Li@!4-Rh?*CE{X0W>jXzR%RBwT4-6rQ~ z7}Qw=NFb8BKJfuTpk|(h!AYW8C{9_}NVxZ_ql=|!bN+oAH2!(O*wtGIxRC`!C517I z+4cJE;x;gDcF%r&209gbH|AvrGlT?Mze#jM6DS}ZLUD99G|H(*@ zi=wF7^`l>{X^>@$>IBMFjKt zRQiFAJgGeOV`*tn0ur#9C{hM@Idcrz2i+mJvRxPtREL-EE{v=s>X}7BrY& z1t84k^b*+vF?^n9fQkQKB;=}sZ>!3vyw4eq)3`BkrG8mwZBb)({!is#PqKCteU))n zI~5`^Uv>gRrJV)tI9{FT6j+MX7FTv@3if2wmiQMTLz>o^}l3Y5qStq@HGX-MnI`tCLIaK*b6bT@AM2N6M}d~`JWNLRBUa3# zYp}>bAQi+6^Fs^~@3mf&6HDHB|Snatgs2VN|e?4X8 zO#zl#unLkrJ)T=1%On?vWFM2c2Dk#08xcy=iSfC+Z{?uZJBp>$5nyi+){NbKY z^so>JD(&DW0On4d&&x8@OIn)4R{pjB`u7b`tLB!BfFMlZ9LL0haflYfXMSeQ^vZwv zVDvBO-d@Ulxr(`h3c7LB3N%^i0uc{ER+5=QbYmv)WlnSl!4k3SusT`{+NE!19O?*_|1)8#jL-p7UuChi947&aciwl7#RS2& z$1Op1*9}CM-kc!P>(30eg;7U_xR=M`QE(@R?lFtjzeK7l@h9xBEz-sxZZdh>bkVN4 z=Mr&)$_Lhspw29Ss6VrCv9_)EyQPo1agU4Bw8LM;J~l!ImohpNbX3puInoSkZ8l~r z&iIJE5!whn1YeBU8;>u2QP)4tC<*d8fiYoIBs#hSctrD7R7M%%q;UH7=z9cKo^(vs zO#}Xj_N^-$#Fuo7@|o7}dNcjrTcp(CJckkbGN>le@wV8EERs!*BMm`Xyy1)EX=+?< zludTs(`?|X^j9B9zxy8V>FqTtP+Fz`BKzEv50z3?7S(eip`DVRW7N?tZ~}y6L4&ps zLd?g1v-zG^*3t6r-;ZwxH>xnM0yfH%iO9#VVHHi!%y55cOacpRH7NVt+jwtgxJ69u zHrNjnROp${^QJI<0-$CT7K^0>F$$cXcMYQ1{TP3AYZDzxt*RJ*ozO~51*bSX(^}gU z+zK^d+OiZ%%jH3M@g*!U^JX5@#+)s|Od&0NTlpXAnK?iZyr1OzQL4z)f-af{( zkX6jxZSVevlXu?-wut&77X&~~bL0V)Ccv*My3FFzR4q+tr(7qMHw`K+=8)m%~31IE*c`eU;Gk zc#va06AHPk5aPPY&P#J3;h;cek{37@u1Opq|AFI&wxLEN?Jl_pH3rG#&x2@*qBPsh z)mr^R>b~KEY9a+)lTe(!q&7gu^sR*gf^YU?*?D&XjQ>EzZFJLbKCJ3sTf8Jl>~3O) zXDfHo(@%)FJ!N5dwc#CUy0QNX)b{q4h-JC6iXfr^V_rn~d)n6Cm*{^h zq5>Lt4_*mjhdFQ`wLy6T5;eS+Zx|7LA3sng784Qj$%$}V?cyt~p3z6dpXjhL!KX=$ zV$b)VjsOe(nNw3$tRPvV4xnn-4S{8Vh17^!m9@0mEz-wnsRz+udQyPHWIjcKys>_5 zK8o+ECq&ci4Ag%@Rl;_+6(#3*T(m!z-*K8Z<3p1{b}K<={TUd&1FF4fF`Rd7u_b*z zN}NFyWBd~w6fTDP#!ipi8LJ=WuSK&F({WT;-6N9_8y) zCF4nW32SRlE*f%O2gciX_fNOu)zH^CXe>9LcOe1kpacyrHrr7h-Eu5`cLQ$TQs4$gKH|)_vM%*4!??CPY1C3Qpom6?P3a zvqJlu7s@zIuT%Z#b=3E1@aZ##JIxYI(gdkg<12cCAaF}-2LY&`QlB#N_lNgCJ(9AL z0W$Dq%+~0Z5~ycqLE>fEq}H0~ELcXz=++D9E-y|z3zPk86c*DBX_+76_`CX8;NpnO zyH$gxZ;kg)BHo56Y0&ecIva4ObO4QYS*jD*Ee4fdSZiUtTNeH(rsUSCom2!>z*oiR z!D3z+T^PIz`-IIGv_R2ZJRd>BJp828!*?prx~xUj$2*unS_keJVD!POmT=Bv40w9d zW>%O5q+K9X6nkv4@+Z`TKNz%qy!dU=t@MpDm7sy(I7d0iNV98z^sqDphGxICOZi}m z<6ZzgBeCanfM^_m4~fktFEbvGopytro3KBWt3=xV$mkP%#o9YLTL0`x|BE>$Vkf%t zBLECl+btfLdBo)+K~GC^Eq?C_zQTcUmlD|wgVMC^(HjSU?{Tl+mMVHM_rsO9NQWWV z8t^e~UK6M#?=nVjqyvQ065iRSI`8{<{GWyJ16>Yi#D*bwD;DQXFrN;`EHjTzR~vG{ zb`4ukN6_i z(Y-N7sw%!!q7Rn6s>3*G6}Le{W_o%6)$e`+s+f2+tZT2}i#dSPF2AJ#0J$s!ZH+s6 z;G*)HIkq8t@x%td+rIc>9b(&F?NFQgjDLmKIR zBmfbjs?4xQLz;Kpa=W7`_sf?UYf=FMh(!RB8Gws`5|$FTyqakh-zOtB*3?_NVHNF` z(J$g0m5Bl@MMb{sdUM8@N(W?pzn*&1dy()7$}xL*s>}<*9qhZ@8pqlIULdT-D8v1< z$3VUk2ICSb?9gc>3>?Sh6KBIW3jH$BT8_*b4*wbqBMsnKMYm6rd0CjUT*v7Mf5p?_($xifV99}Od^s){ z{KGVpIm`lQ=bQl=fhru7`UX@lpwJJ4*&-ll?dVeinmMo%&D&4N5poI`|JOlqu#sgXy#b$Z)^%`N&1CErMElmzsHTrK8`K-m6|M z3~Catt+%}p=J;&)zn0E2uF3y>`zvBJBSlg=C8VSVNT(nTGU;Z3gi@nZ2?;3yr9m12 zsevdR(#=G=rJMi0zx(C^4|uQ_pY7VUbH{lc?*kYkK2%3OTe3%fL3A=wvO2rgg^ws# z#TcwT$sMd36><31v@NN$mwVm&Xh#d}*8QJ6wKpALPckBKMvKs95|to1FDWZ2l5o_2 zH~7#}9^fZHCO+o{O#DwsprgmdM#<$HCcknleUc4tN_Kk*!f*3|!Q4%B+b;XLI)qoM zt`AGxYoWKzGGoC?yU8_Q6&--O%{j?%Ib4v37dH*q_}zcuR$P$W0Bh&rDa%F6_ZGx! zmvBcuh)h~V?04!{TpmC=xtBJjd}%vN4JDxKxzI)plN|QZzt+1{$BF;YAWFHqUU(!> z8shhR#Ndb${%>5G?NEalHlyhar?@GKEB{sY@obrRbWO5~UdSg2Ug_Iat!`%r8C)sP zM+k89M67hdoF2STaP}&H8}l9;?09*BkFE24Doi(QoUPU{R#Aw+ntwHu$<9@x(PrX(tX_eUs9%&SJ-e=Tm6+13YYB z^Wf81PE^U_apFxgPVfEi&%##sQtWwz!I6?)wwyVc014Q|Pad}F2WhB~%;3vFW1Bfk zi3)m2y9uflZ1p7U<0tX_)IsD?Lk`db-H1J}r{d?K%6V^_8$!al>H*1kcUWZ@-$2=8>*2(F8Rs&us>F!~ah@n+ADW5G!VeuFF~#)i+Tdc^+jT z@~ZONlNxF9tpO6Bm&b=FT(sxf+ygUVsPp}NP7BSaKQmc7o}2snRu?kAx_-93w2OE* z%^i{Ngj22xvHI&ca`lqt24a+*V@km=BY+a6Bp8 zXkIM(Q|Qr_Qz)v;@TIiLfgRaG`6HV!HWYI-wsx+s zkzZknG=)P}T?hx+nE*IqDm()7$W1&#H6)@r%s@mp=Z7lSM&ox3`)|_%=*Sn!f#x(# z4Ow9)&|f`dCk{|-vw(2tu-U`~evq3m*&UNL{>K<8@0E#SESrKATe5wqRmrhHXs=8vBunYawMab`9hYt%c0ZYprYH3 zMu5mI<%t&!>3;`24mgHdp}YYkBsInlcz)N8d5S`9Y;8p3KQJ}O;sTmA;V!TFa6ux& zb2ALgo!1b&1x^K) zV}E&*`3}QFuepvP16-@VpVOHC4wqdH)VcK^e9!W7^xb;EwJ?E8z%vvL6{UzTHXCB^ z@!7_H9UkNc9KhoD0K6LInIhDN(-cyAIwd$rJ+D(5PTA>Gg`2>-{>i?w=3w=@*Lv2w z(&9#&|l-$d`U3~L#o2o`jj>ar(heCRT9`o-;9P5nw%s8B`qR)tP8@zAr%02kl zY6_ryH?B9vA|o0W7@ze$JI6eH%HD;MQ^1a)+uGpcfA6m6>`)g6f41P-PvhhCRN z1`71SgpjLnIdNsuBbrh^R)D#->RRAKUNbCg>^Jt({FzKf1w~8U-gi9;^%-uUJRJYZe&YTI|5RtVXC*ZE(#XEWE?eZ~7Hj%e5-0_T^+mO%{Z0s90 z1xUtTI&}Z-o|TY@UZ$9ySLy&G@1UW+R&V7jfbOGx`Y1H-uZgH+DeN<3Mc19j!i$gc z`cG`NHgh&h!tybX)g(a1t^!yg87*C$pMm;H1fko;C88V*oo?t)b*lXJ2>8Jy`nxjG z18li%pI6*qw+eDichp`sZ^0)lf&L;RVDAyumA?QqKniaaH5e2*IR|Ge3jWrTmuqRJ z%O+iL$}oPr3Rs>W?oG1mslMt1huFAPLwy8d7+y9D+tmUH001flm? zw+ZO;1mM){z;7+|o$d}oWJ?k*$xRx=_qjy9`j6wsv5nd5; z0bLna9zy>rHiu{Xa9m2d8l+t%ojv+%Lu8-+rwqoJ{yqP&@yY*vIJu;U?1EoTn2Fcq z8-j~9J<|PaDdxkuSKhIsCf*LIoqUzyelhf$@{EOemu^@8o%RyFl7d5xbISllk1tYS z@jyhTur6{GOC3lB&Tx#N6xT(ar-n)@4CQ--fRMk_4wq>Y>Fts01`icfHq89{y+ zGoANXQ?C6vyEwOsxuqf7A<@*Sb?QpjcXX8&NXVZ$zt5GLqv+Q(@evh@i53wHO{F%R z^*~KS8j3R7sfma2JheS*(`0|O%Hke>e)JhVKaRIMGXHm-saoO{w`}0p=dP;>6Y-W0 zB*E1+HO=G4k{ruMA+4WQ3v7~IdKLITbg<7OjU`(qg zq=Ut^lOBl4sy2WiG&fJM%~c-)V=GMK2E4( zd=V=BM?IC^(5<$!Fje!~GLj8dC3UM2=c4di8QsAamv~x26e&f%dV~7)_HAIOtn^ea zm;Y|o1B{Sx6@$&ZM3dJk0qB#+4)_Ly>=wT|L~eIG{_Ok9X|`#-kfCpQ@buG(-%a-3 zrSsC|A=B#2mW~HKlZW)S)`~0_=O3muvYhng+plaZm%n6&rzeUJO@L>1#AGMULCBd! zRcQYEpi1pi(ILN(WO~6cjNRCEWn7;+2r09tv7m!v?rM*{uYU*i$D&1HC_83k-3~Bb z2|#q?OKxkVqeQ75vNT!vpiUElv* zK}raR;bPB0n#^fag}+UYHC*{NlHLv7pSWZ&ZMOw!-gE^eBlwI7PCX^(*x zd$GsbtoEu>9#1C@Tf8{DkGu+~pZt6uyCJ%V3Dn1%N#>EzC^OJg>@fWDuZ>=4;y%ul zf(?V2sqLV+?;tp;z4wi7i1m8?^jMC@^QdNiD z1N;p{0h|CQ;W4}(D%itaQ~1_>;vLDF*x&~Ss10XK zDxh;Fh-WOpVjNU2crs=_>+0#Mi+=DbYA6oYa>2T8?{Y-a>;I`DyW!zHjU@zn&=hk zeVKXRb7a1qpom1^H#Il?xs#O$JUWpU-Qm<>YUKMScwW}?DB2R7#rFjp4e z?8`Yjig)vXjtNe%yBVQGA7))6dW=;w5I^Yk^U>gE`nA!aOqLX~a&4lU3fom;`1wcP zl5rQTXGhRUNi)>j=-Msnx| z(Z+nZN+%*`y@&Q|&*=gmXBELxj_fOW`C!kJiGSmcVm-rV`h^#?IJd;IFN4-6RyoD& zU3%X<^oRNJC0%3_aGLqtMs5(;MSajsd|rWb@y-$HirS$#`Ae|^o0NPb;HT0lP;3{7ty7_PqXfIpXK@n6IQl*k9l!3`55-)m+`^7Tr+)|*(ZTApzV$+XxkJj_4J7;EdMt2!Ix-v?beb!9qteL+wAn;g0&IbDY6_vk2@e)=Y@4!oy0 z{}9snD=jM1I9FQ3g>M*!=da>9JReJ6C#~>pXw7O$&AdZbOPZpQ%tgbG6rHus_(v*0f6lKzZ|`!cqkUPwR$b%A`O~u>0$$ zifIupsZ{8U+nJ%CIPV3I5=J~0wK&E<2nq?~>;WHrvreePZ9-$dJqkJ4WC>yV+@X_u zE*i^`>cifI!x(X-o0SB zy=cYWNIM#9YTJ5#{`Q{!&6*2S2Xx;)W3KU#_`zZ0y0g>vJ(p}=sy2GOa!TBFh-Zx! zGfw^R*b~{-Mp8kt@&BEi4a_XrqFWn@+HZ%Ir*DXj1*HQyE3Ry-4BB{_JOq?~Ic6MqW++JE@5YJCA1MfAuwDR}w;O;xjtGVvrgZViY zn{?!kH7J1XaEM+0gWQ>V#4oykLmWUXnsX~^;u*op>WiHJcVEB%UD1=>iUk5Ym&iM( zIQdF=pVXsd*Y!u|e~-wh1YVkD)0_J+$h}qgy7u@Dv3u{DFY+T~FNdW^Rm|hce62@p z-Ine$$dx!Ub!gqNjXI%#Kp32<;Nq z{2%lIp(YrrnNEe6K;$_zft{F@dOknS8fmvlo!bli0e!>&2C%!{%Q~9M|6t_`9mDFb z9zBI|bvsuBu8$`N243USL?>3asF2KMiO-p3qzIV8q)`JnYJhUEPUaf=evliwOMnxX zrGE=Rb>G+d*wUkHK`ucqZ~FDH76|&&FT6xAVb}!`yqVPXiyPYXzc-gDL&=`xIQj9d zi}?elCL?eY!K%YhiLLIXgtP)vR8(GDEsbY|DSGFRdi9(I5p~63?2;D+J2X3=N$R7R zV(+`r}YOGQ2W>+oj|9~epio3TUYNzd(y*z^pOyj3NkkN^-!?ARvE)) zr`akGz(`#vTX@K}65SKU+7Euo)y8oV5lc0T)kXWurl0fXJy^!_t@v<*_A~+57>xi0 zD(`QotMe9_c{vqInA0$%qvV;Zf>n*0kJCXanb1s9{zprHW~xYJ-H2Uxvx z8r3B${shprcdPqg7Wg~30xxR5f2M7M^ybmzIc4bHCt>`cY6>js(H<->UKbLrMQ6v_ zM{V@+#!Ly+6e;^BRZKNn2eny3i%+5_Hi0-K+1b%ykc$vKV=YcFvzw!rvX>9MWO_cj zOi4%YrY<+4`S!_PDKFBa{6L^^hq7;N6@b&+55v3#T@*NUPSw|<9gXHmsVu=1jq}@T zY0M}b9PAfPsOXPsq9Y<0s-x;Y6FXYrfu`xOu`>b;+R|9JJD?Y${vu;5W4GA@WeG$Q zCzgjSjj)D+`FuuAm%x%6nar4fJk@PwAAxfU2Z8)Af)j=+^$uH#i3wh2M11$9&fm0G zM?Uo9S{(7t(ib^!z)@@^KW45BVTJg;Ly=~QT{7Y}Dm zGI-xx?d>ro2CaBoaC*#6_fu)ygyDcJ7EP2ePCwxT_^8kXLadNQ#Y|nZ9GA(YrJ-qL zS72Mc@hc>Id}R*vYonJJ%oR8~xd2WT+9SJu%P+BLMv%6SgLF#0?u7>Bp6**=Csv%J zAaQWRy*Z-pn7muroq0tSOQfW#wQTKun#f*jc{;CE&Q3Eu{nbKfO zx`-}3YCIA%lgpNVVC5AzhnR0C=jTGB=dVu`EbQ-UDg+mgo1V601!M94;ijO9{*%w*lL3aRnBLTyRh{L)^Egh@q85Fa@snr% zCYh9KC1#0M?o$^7h}x!uii1)!K7Ky4-|;{4GFc#b8Bh!l=$#`D5~DJdfKG^u2}@a} zoT@J%T+K$*z|<`}^uEve=dl!1)VgLeZ*K8O`0A6#CD2yx9nYM9k})ReB=v^>$+gQr z`>OP9sW$cxf(00+Rz@;&4pPegMQ><4oFy)t1QSe{`B<6;9GN< zM({=4bFOFV(Zr>XiU;dRKM4+bN;{^tsainbk`1xC)ACl(4gT4hQBV3~Sq0WQ)nj10;{Dybm>Oo0VslfQ|z*co(JmmwbaWw;3{ z>ge^SWo=qsFZRYF7YQpHGM6ZjZ4K10U|9&2yITG>)}6xO74fCn;7pAGS$QFmGr*^g%ZUg2HAsH|6D2`_O%7nU5rVUAc{S`^66r zH)>}=hK0GEIvLqIMss)G~DtQj&> zkw5%f8@11P<$L{NY@RshtHr4C0+3yvKkC&^hqXnPue64nRps!C9z{KQAs&{|K z`!(_U=*dK@=*Zb$+l4QXqcZe#H5NMl@m~+*WSFAqxf;a7XjrkSIR)>6CLPi>RPavz zy4a0)PW&g`luxCrGKe!pfj@+=SOo8ghQUn$ucchW_*LTBDA^(+&#-gJyy-9kgzr~L zIi@|S@aDD1lhj6edw-ho@3guPX?LSK^W~KR)?cijLeXTrfX;-@?wgx{==gXW7{$XM zWfb#SQu(D7U>++o=AL#&tECd$<(>gdmqi3}9sY@6ch(uyTJ){4U~Xycn`!iQA3*eY zBk#&R&Lvd)NK0LdQE3Vg1XhC^Aq4+yD@8AGhUtE2Hb4iHtD>I?5HIpy@dgHlFMVJ@ zyY^@(0i1j>1#iT%J1U8?-Krp2ib^MF`_jlrn+MDp$oPKf2R;ce3B28oY|^`tH297G zWa7>!#6W0oRBwXVf;docLJmY>O(7^0qaVt3VbAgEEiUJdW}T23h$Yr@H4Wht*%uF2 zf{cS`w;x7SGzH*)CnLTqwnkrfc#s_`Q-|M`5=jTYAfnkH#^b%B*UsdZsru{GCwy^= zl=JWB!yC3V!)00CMlCGsD4sq%c46T#ocYNxI^*2Pc<9^$wtKn&B-Q{dhHeH9c0?i` zS-}*#=VKuXLmM!Kv!Q*$MP9Z}ykcMUw?+OCeYSKHkl!Z%IVEcRs{zJSMRew+K{x!X zqd@W*yt;0H=}vpdV6^2%M#ps zAJz~-{Vns+Pg|DZyVS`@{aKP;0R|0J5=sOF)UwG6`-$-};`duLBHgHZ9HBp8PF1y(0Rb508VOOH>`>jeF zEHu3L-k#69hXXV(_<;*qQIfZ06he?BlT;TS7``Y4=hg1Rxq}XS7d-QH0jN#s&8j&& z`NB)mcG4#yI~J1&Z!V_ySvFe%#wZ%iK>y!{&s1H3}XlFz4WD(3tT|e7o6oSsk)PO5Aelz6d z$#o~8o^I)s4Lntz>zT$Fy6@z{| ztxS1tT|?}M8acf8nMIxC$^DTDjK67Rzh~5*oTq?w5;6-qx7ubAzJcU^3;KBEa+{$i z8^7`|4A?OmpUlE{-5*W z|J)#KQ7Z!R2IqEGCW9xh2pbqZ&sj+A1I3F)9d}+16C7Te$~=>qQfj!SUA=z^D6CR9 z8F1~Sz&gVWaIl=;FR1h~0=ojuG)?1M+pk$#po=yKWjtqqrT#Zj?1FEZz4m%7-I6t^ z#W&!7AR6LHvh@h)_C1k`8^>9XM63WbyjKQH=gmT&A2X0$O}>o2yaTXFi-9~6NZ}I+ z{>&>;7GyU$hKE7bBK!jhu$d#&b=xG_VFNY( zy*ys`O#uxoSP0*wBclMG8_~5Km$%ud$K|JtYa*ATupK5G-C+SDH_`>{nt~Lgf8~?@ zl{}#dgQTF-MFjB@9XUd5>S~ zLyT5H0LnME%xOQuiyAEH3@%NAm&Dkx_%&jfPV8gOC)=dZ&GG!e>4roUL#eIj`-#ps zV*nae)>Mva&LNDdX=hBm{uY4dgEmrR50~^<_VCGpQ6IoBi!?OhQqV8!xlq1>a%p_& zsY#~A=QVKrNVn^LY$kuSI!hu_$+CAB)v(g#}_$q62odAD%I$H4mqI{cq(0Ij`b6z-qdfK0eSg%^4- zT^O1ToGb?A<3z=2fd~gQ1NSetSy8S!Adcjpi86J;gyQLmGhxS4h|BmUurhN9hdPLV z5N50mvPfruJ}ditbz%NQzKTEn5i~qAZY7jN>m}7|gcBZ{)IR#HTHd=T$lG@cpb(lQ z2$Gp26hAkN$=e_xV?bCtcYf7Y9+Y3?6^fS8mm`>yYO}ryR$c@)4te1TSZFYtuPtAX zcMOHRG!wvs;V-fi95t7@Hy*U-7%q>nL9-Qn(QF@*;p<&vHZ0cP!2v=covzMMu7);5 z#o= zPBJ?2x{x9pl;zV9>I(N~G*bhG(2r_~Wk599$ZP~8(%J~4(M39o<#vdTn z!ZLTixtFcwPOO}JbR3$%)LGjk=F%Dn=!yOSHsN8W4dMX3Nz7nobvUmVX9r%|VK0@8 zCSK(EgvE;)p6}QPdTSwJuOoYRVePrS%3ZD_CryynaR`o6oE=a_NPP!8H$Z0cIlYLa zvx_$F_Q#exjM?Br!TPv2yYSNd5+LG)*s;28G=2&%ZDuYf!1uB812=2kzf-O z)4#QeQ3;HaPs3W~2KxJ%M_NdB4+f(Cx>RBc|B^s{CxBlh`I8(n+Q5kew3q&Y5oq zf;c(nLm`@6z>nJExciwtL^GnN{0U$gJNb1HwpA4B!cw%AkBsK6Dm>H|S|TcVY43!? zM;ixG(2Q7;H+pxl$bB{2JVE2;;_dCT9C&om7p^0F1^N8w%S;gJ>`cs|)HSS$lm~sZ z%_pXTNpV`Eg`pql)#Ab&aElEVLxLFC1k1KrbVEnuf?k%+rXo}x{Z8A1gPfdy+Njeb z#0=<~oVVLBx8sc$6q1?e-8}&*7kal2LtDzF<|)J3M(4)5&Q4};2f%#oFk%Vsi-JgYvSs}(;JWm zo9>r!I=JvCWjqC!6ydx<_h_?by_!`^G63hcK6mR`S;u8}ONc+`L1VLcx-KE=;vfU- zihrr!&cJ!38=M0*0o@+B%si&%gh^^y~EP^T&O&eY%&)4Z@9%s)x4X9}igiBW4veR1CPJ{e`V>?#jOHO;(w`*E&K@BN z4Lz-Vz}r>*i`Bmge|m!xe#E3RM18&MXmgH>`4Zo?k(<$`Na-2_bN-;5>oA7UOxX+* z6Pt{38l%z5{Am1}=A<A95w9PAoX!=#yFM8Fa*bPWL&LBCXI~lUOb*m!(e5ka z250^2spjG7ub4QqhEzN7HPx`Gbc-3R;%FDudbAlWjVaLT&CgaQeDfl?c}r zj^U0qg9e%5^oi3=rpo@+m6FB|Mm zy(1yM@v7;cxt#dF%mgN#^b`G7(n`Q5qvI?1HXj!^>3PJ1C$*|8D&$tdF(5-qpnwqh zsETF5lI5844DoQa@MzX}ESgUvhFxJCu)Vk?3x80Vj-RWO5XX*F_)pKvvG}LCTTPb5 z_0O{H__~}9GHKE&0^S#aE4b5@O!@fV^F4fNHdb&OrwIb_b_33zOHCht$T=~uU}+=d z0>zP9K=26w53YX{Ll+OXm7`kOZtBtrjjk_a6l;Ar9`b(~mVmdCfhYlR78J$JYVaqi z@goGCN1iPYRyUY5wEFxuI4L&LQoQr~Ev;dcUj?0$%X`kzEYbxI>4vTw>_8b8>#s}O zI(5_^Rw=wZz*xh5I$Hcj*TfuW^0U^W9CGUWi!X^w_l!0J)1zs^qyhr?q5+RrLy3G8 z)BAqni5ya|SSrAg^+46E%e{A&=F_QScM2W@&u`mTxL%i7zq@QRi)sfwqbyNieTa&P znHDE!6&J|-W|}(iW{X-Y)b&QFg1DX$?xy#I3!p_irJ^xdXphW^dfsU!_PgEt;FAoh zBdmOoaF~EpV#j&%zCtu1Rga^yNQP7(NS6viJ`9FsuK&)?V(LTUw~hEc`SSSB(;hW} z^?**xevdAUyzkqN$uCTo-$LTOpCGLn7zJKe<@`I!f68_jMZB;^&-Rui@{lQCC3xgV z!XA9g-IcbD){;;(Q*sSWFEn>H>qO9jLTljqt`V!YzJfLIM5|e zHhxj>#niaH&T?s&yf{PT3_e|2`R!CvZ7fp8^V8x~pb?AJd$u}$vyj%WwO-qKK! zEQVKF2YPQ1OPYPMBad)@T;Dp6^Um>))T>L+4@Bg7S+DQ$7D`Dbe%4V5`0TkqLjR=L zytORWAucf%6clt39xW#0cdRQyaZI%b)at^cCwUWe9I04$j_naMDY}|<@cC#e*VmRJ zF?T*A$fQ>pxr;1>Tx5~7ExJTRS>&%34W_ihDsqK+0_tz4P)P-!W2hUuh#dm>1_fZ? zA4SwaQ<}U&Vil3=%;rr65xMiQg50<2W7_2#w6wHhl57?bI`0qMo0n3c?+)5<8vPyY cUj^`_C7>|~iT#!fMagc)HF5=Hhb3E8)@ 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

;0+xxSM861Du-kl; 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 literal 0 HcmV?d00001 diff --git a/infrastructure/web/public/javascripts/notifications.js b/infrastructure/web/public/javascripts/notifications.js new file mode 100644 index 0000000..444f374 --- /dev/null +++ b/infrastructure/web/public/javascripts/notifications.js @@ -0,0 +1,57 @@ +/* eslint no-unused-vars: 0 */ +/* eslint no-undef: 0 */ + +function showNewMailsNotification(address, reloadPage) { + // We want the page to be reloaded. But then when clicking the notification, it can not find the tab and will open a new one. + + const notification = new Notification(address, { + body: 'You have new messages', + icon: '/images/logo.gif', + tag: 'voidmail-replace-notification', + renotify: true + }) + notification.addEventListener('click', event => { + // TODO: does not work after reloading the page, see #1 + event.preventDefault() + }) + + if (reloadPage) { + location.reload() + } +} + +function enableNewMessageNotifications(address, reloadPage) { + enableNotifications() + const socket = io() + socket.emit('sign in', address) + + socket.on('reconnect', () => { + socket.emit('sign in', address) + }) + socket.on('new emails', () => { + showNewMailsNotification(address, reloadPage) + }) +} + +function enableNotifications() { + // Let's check if the browser supports notifications + if (!('Notification' in window)) { + return false + } + + // Let's check whether notification permissions have already been granted + if (Notification.permission === 'granted') { + return true + } + + // Otherwise, we need to ask the user for permission + if (Notification.permission !== 'denied') { + Notification.requestPermission(permission => { + // If the user accepts, let's create a notification + return permission === 'granted' + }) + } + + // Finally, if the user has denied notifications and you + // want to be respectful there is no need to bother them any more. +} diff --git a/infrastructure/web/public/stylesheets/custom.css b/infrastructure/web/public/stylesheets/custom.css new file mode 100644 index 0000000..3915f59 --- /dev/null +++ b/infrastructure/web/public/stylesheets/custom.css @@ -0,0 +1,134 @@ + + +body { + margin: 0; + padding: 10px 10px 10px; + display: flex; + flex-direction: column; + min-height: 100vh; + background-color: #131516; + color: #cccccc; +} +main { + flex: 1; /* keep footer at the bottom */ +} +a { + color: #cccccc; +} + +h1 { + font-size: 3rem; +} + +h3 { + font-size: 2rem; +} + +a.no-link-color { + color: #cccccc; +} + +.email:hover { + color: black; + background-color: #9b4cda; +} + + +iframe { + width: 80%; + height: 60vh; + border: 1px dotted black; + margin-left: 10%; +} + +blockquote { + border-left: .3rem solid #9b4dca; +} + +blockquote.warning { + border-left: .3rem solid #ca5414; +} + +text-muted { + color: gray; +} + +.footer { + text-align: center +} + +/* Reset apple form styles */ +input, textarea, select, select:active, select:focus, select:hover { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; border-radius: 0; + background-image: none; +} + +#login { + padding-top: 15vh; + display: flex; + flex-direction: column; + max-width: 600px; + margin: auto; +} + +#login h1, #login h4 { + text-align: center; +} + +#login fieldset { + display: flex; + flex-direction: column; +} + +#login fieldset label { + position: relative; + top: 12px; + left: 12px; + width: fit-content; + line-height: 1; + padding: 0 6px; + font-size: 1.4rem; + background-color: #131516; + z-index: 999; +} + +#login input[type="text"], #login select { + border-radius: 0.4rem; + color: #cccccc; + font-size: 1.6rem; + height: 4.2rem; + padding: 0 1.4rem; + margin-bottom: 1rem; +} + +#login select option { + background-color: #131516; + color: #cccccc; +} + +#login .dropdown { + position: relative; + border-radius: 0.4rem; +} + +#login .dropdown::before { + position: absolute; + content: "\2193"; + top: 15%; + right: 12px; +} + +#login .buttons { + margin-top: 1.5rem; + display: flex; + gap: 20px; + flex-wrap: wrap; +} + +#login .buttons > * { + width: 100%; + flex: 1; + font-size: 1.3rem; +} diff --git a/infrastructure/web/routes/inbox.js b/infrastructure/web/routes/inbox.js new file mode 100644 index 0000000..ebbab7e --- /dev/null +++ b/infrastructure/web/routes/inbox.js @@ -0,0 +1,51 @@ +const express = require('express') + +const router = new express.Router() +const {sanitizeParam} = require('express-validator/filter') + +const sanitizeAddress = sanitizeParam('address').customSanitizer( + (value, {req}) => { + return req.params.address + .replace(/[^A-Za-z0-9_.+@-]/g, '') // Remove special characters + .toLowerCase() + } +) + +router.get('^/:address([^@/]+@[^@/]+)', sanitizeAddress, (req, res, _next) => { + const mailProcessingService = req.app.get('mailProcessingService') + res.render('inbox', { + title: "48hr.email | " + req.params.address, + address: req.params.address, + mailSummaries: mailProcessingService.getMailSummaries(req.params.address) + }) +}) + +router.get( + '^/:address/:uid([0-9]+$)', + sanitizeAddress, + async (req, res, next) => { + try { + const mailProcessingService = req.app.get('mailProcessingService') + const mail = await mailProcessingService.getOneFullMail( + req.params.address, + req.params.uid + ) + if (mail) { + // Emails are immutable, cache if found + res.set('Cache-Control', 'private, max-age=600') + res.render('mail', { + title: req.params.address, + address: req.params.address, + mail + }) + } else { + next({message: 'email not found', status: 404}) + } + } catch (error) { + console.error('error while fetching one email', error) + next(error) + } + } +) + +module.exports = router diff --git a/infrastructure/web/routes/login.js b/infrastructure/web/routes/login.js new file mode 100644 index 0000000..03464b8 --- /dev/null +++ b/infrastructure/web/routes/login.js @@ -0,0 +1,41 @@ +const express = require('express') + +const router = new express.Router() +const randomWord = require('random-word') +const {check, validationResult} = require('express-validator/check') +const config = require('../../../application/config') + +router.get('/', (req, res, _next) => { + res.render('login', { + title: '48hr.email | Your temporary Inbox', + username: randomWord(), + domains: config.email.domains + }) +}) + +router.get('/random', (req, res, _next) => { + res.redirect(`/${randomWord()}@${config.email.domains[Math.floor(Math.random() * config.email.domains.length)]}`) +}) + +router.post( + '/', + [ + check('username').isLength({min: 1}), + check('domain').isIn(config.email.domains) + ], + (req, res) => { + const errors = validationResult(req) + if (!errors.isEmpty()) { + return res.render('login', { + title: 'Login', + username: req.body.username, + domain: req.body.domain, + userInputError: true + }) + } + + res.redirect(`/${req.body.username}@${req.body.domain}`) + } +) + +module.exports = router diff --git a/infrastructure/web/views/error.twig b/infrastructure/web/views/error.twig new file mode 100644 index 0000000..095cef5 --- /dev/null +++ b/infrastructure/web/views/error.twig @@ -0,0 +1,9 @@ +{% extends 'layout.twig' %} + +{% block body %} +

+ +

{{message}}

+

{{error.status}}

+
{{error.stack}}
+{% endblock %} diff --git a/infrastructure/web/views/inbox.twig b/infrastructure/web/views/inbox.twig new file mode 100644 index 0000000..126a53f --- /dev/null +++ b/infrastructure/web/views/inbox.twig @@ -0,0 +1,35 @@ +{% extends 'layout.twig' %} + +{% block body %} + + + +

{{ address }}

+ {% for mail in mailSummaries %} + + + + {% endfor %} + + {% if not mailSummaries %} +
+ There are no mails yet. +
+ {% endif %} + + +{% endblock %} diff --git a/infrastructure/web/views/layout.twig b/infrastructure/web/views/layout.twig new file mode 100644 index 0000000..7032fdb --- /dev/null +++ b/infrastructure/web/views/layout.twig @@ -0,0 +1,37 @@ + + + + {{ title }} + + + + + + + + + + + + + + + + +
+ + + + {% block body %}{% endblock %} +
+ + {% block footer %} + + {% endblock %} + + + + diff --git a/infrastructure/web/views/log.txt b/infrastructure/web/views/log.txt new file mode 100644 index 0000000..c63eb23 --- /dev/null +++ b/infrastructure/web/views/log.txt @@ -0,0 +1 @@ +2023/11/01 09:58:03 Micro started diff --git a/infrastructure/web/views/login.twig b/infrastructure/web/views/login.twig new file mode 100644 index 0000000..511ef78 --- /dev/null +++ b/infrastructure/web/views/login.twig @@ -0,0 +1,36 @@ +{% extends 'layout.twig' %} + +{% block body %} + +
+

Welcome!

+

Here you can either create a new Inbox, or access your old one

+
+
+ + {% if userInputError %} +
+ Your input was invalid. Please try other values. +
+ {% endif %} +
+
+ + + + + +
+
+
+ +{% endblock %} diff --git a/infrastructure/web/views/mail.twig b/infrastructure/web/views/mail.twig new file mode 100644 index 0000000..3722bfd --- /dev/null +++ b/infrastructure/web/views/mail.twig @@ -0,0 +1,35 @@ + + +{% extends 'layout.twig' %} + +{% block body %} + + + +
+
+

{{ mail.subject }}

+
+ {% if mail.html %} +
+ +
+ {% elseif mail.textAsHtml %} +
+ {{ mail.textAsHtml|raw }} +
+ {% else %} +
+ {% endif %} +

{{ mail.from.text }} | {{ mail.date| date }}

+ + +{% endblock %} diff --git a/infrastructure/web/views/mail.twig.save b/infrastructure/web/views/mail.twig.save new file mode 100644 index 0000000..c3025b2 --- /dev/null +++ b/infrastructure/web/views/mail.twig.save @@ -0,0 +1,34 @@ + +{% extends 'layout.twig' %} + +{% block body %} + + + + ← Return to inbox + +

{{ mail.subject }}

+

{{ mail.from.text }}

+

{{ mail.date| date }}

+
+ {% if mail.html %} + + {% elseif mail.textAsHtml %} +
+ {{ mail.textAsHtml|raw }} +
+ {% else %} +
+ {% endif %} + + +{% endblock %} diff --git a/infrastructure/web/views/twig-filters.js b/infrastructure/web/views/twig-filters.js new file mode 100644 index 0000000..23bef84 --- /dev/null +++ b/infrastructure/web/views/twig-filters.js @@ -0,0 +1,27 @@ +const sanitizeHtml = require('sanitize-html') + +/** + * Transformes tags to always use "noreferrer noopener" and open in a new window. + * @param {Object} value the dom before transformation + * @returns {*} dom after transformation + */ +exports.sanitizeHtmlTwigFilter = function(value) { + return sanitizeHtml(value, { + allowedAttributes: { + a: ['href', 'target', 'rel'] + }, + + transformTags: { + a(tagName, attribs) { + return { + tagName, + attribs: { + rel: 'noreferrer noopener', + href: attribs.href, + target: '_blank' + } + } + } + } + }) +} diff --git a/infrastructure/web/web.js b/infrastructure/web/web.js new file mode 100644 index 0000000..0ba32bf --- /dev/null +++ b/infrastructure/web/web.js @@ -0,0 +1,83 @@ +const path = require('path') +const http = require('http') +const debug = require('debug')('voidmail:server') +const express = require('express') +const logger = require('morgan') +const Twig = require('twig') +const compression = require('compression') +const helmet = require('helmet') +const socketio = require('socket.io') + +const config = require('../../application/config') +const inboxRouter = require('./routes/inbox') +const loginRouter = require('./routes/login') +const {sanitizeHtmlTwigFilter} = require('./views/twig-filters') + +// Init express middleware +const app = express() +app.use(helmet()) +app.use(compression()) +app.set('config', config) +const server = http.createServer(app) +const io = socketio(server) + +app.set('socketio', io) +app.use(logger('dev')) +app.use(express.json()) +app.use(express.urlencoded({extended: false})) +// View engine setup +app.set('views', path.join(__dirname, 'views')) +app.set('view engine', 'twig') +app.set('twig options', { + autoescape: true +}) + +// Application code: +app.use( + express.static(path.join(__dirname, 'public'), { + immutable: true, + maxAge: '1h' + }) +) +Twig.extendFilter('sanitizeHtml', sanitizeHtmlTwigFilter) + +app.get('/', (req, res, _next) => { + res.redirect('/login') +}) + +app.use('/login', loginRouter) +app.use('/', inboxRouter) + +// Catch 404 and forward to error handler +app.use((req, res, next) => { + next({message: 'page not found', status: 404}) +}) + +// Error handler +app.use((err, req, res, _next) => { + // Set locals, only providing error in development + res.locals.message = err.message + res.locals.error = req.app.get('env') === 'development' ? err : {} + + // Render the error page + res.status(err.status || 500) + res.render('error') +}) + +/** + * Get port from environment and store in Express. + */ + +app.set('port', config.http.port) + +/** + * Listen on provided port, on all network interfaces. + */ +server.listen(config.http.port) +server.on('listening', () => { + const addr = server.address() + const bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port + debug('Listening on ' + bind) +}) + +module.exports = {app, io, server} diff --git a/package.json b/package.json new file mode 100644 index 0000000..83be7c7 --- /dev/null +++ b/package.json @@ -0,0 +1,63 @@ +{ + "name": "48hr.email", + "version": "1.0", + "private": false, + "scripts": { + "start": "node ./app.js", + "test": "xo", + "debug": "node --nolazy --inspect-brk=9229 ./app.js" + }, + "dependencies": { + "array.prototype.flatmap": "^1.2.1", + "async-retry": "^1.2.3", + "compression": "^1.7.3", + "debug": "^2.6.9", + "express": "~4.16.0", + "express-validator": "^5.3.1", + "helmet": "^3.16.0", + "http-errors": "~1.6.2", + "imap-simple": "^4.3.0", + "lodash": "^4.17.13", + "mailparser": "^2.4.3", + "mem": "^4.2.0", + "mnemonist": "^0.27.2", + "moment": "^2.24.0", + "morgan": "~1.9.0", + "nodemailer": "^5.1.1", + "p-series": "^2.0.0", + "random-word": "^2.0.0", + "sanitize-html": "^1.20.0", + "socket.io": "^2.2.0", + "twig": "~0.10.3" + }, + "devDependencies": { + "xo": "^0.24.0" + }, + "xo": { + "semicolon": false, + "prettier": true, + "rules": { + "no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_" + } + ] + }, + "overrides": [ + { + "files": "public/javascripts/*.js", + "esnext": false, + "env": [ + "browser" + ], + "globals": [ + "io" + ] + } + ] + }, + "engines": { + "node": "10.x" + } +}