text:
(function() {
  var LRU, Media, Message, Senter, Telegram, TelegramFile, TelegramRouter, TelegramText, TextRouter, UTF8LengthSplit, User, co, createBotMessage, createMediaFromPhotoList, createSenderFromMessage, createSenderFromUser, currentTimeStampOffset, lastKnownTimeStamp,
    extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    hasProp = {}.hasOwnProperty,
    slice = [].slice;

  TextRouter = require('./textrouter');

  Telegram = require('../tgapi');

  Senter = require('../senter.js');

  UTF8LengthSplit = require('../util.js').UTF8LengthSplit;

  Message = require('../models/message');

  Media = require('../models/media');

  TelegramFile = require('../models/telegram_file');

  User = require('../models/user');

  LRU = require('lru-cache');

  co = require('co');

  TelegramRouter = (function(superClass) {
    extend(TelegramRouter, superClass);

    function TelegramRouter(token, channelPostFix, userPostFix, requireTag) {
      this.token = token;
      this.channelPostFix = channelPostFix != null ? channelPostFix : 'tg';
      this.userPostFix = userPostFix != null ? userPostFix : 'tg';
      this.requireTag = requireTag != null ? requireTag : false;
      TelegramRouter.__super__.constructor.apply(this, arguments);
      this.nameMap = {};
      this._selfName = null;
      this._init();
      this.messageBuffer = {};
      this.bufferTimeout = 1000;
      this.bufferTimeoutId = null;
      this.userAvatarCache = LRU({
        max: 400,
        maxAge: 1000 * 60 * 60 * 2
      });
      this.once('manager_register', (function(_this) {
        return function(manager) {
          _this.manager = manager;
          return _this.userInfoCache = manager.userInfoCache;
        };
      })(this));
    }

    TelegramRouter.prototype._init = function() {
      var meHandle;
      console.log("initing telegram with token " + this.token);
      this.api = new Telegram(this.token);
      this.api.getMe(meHandle = (function(_this) {
        return function(err, res) {
          if (err) {
            console.error('[telegram] fail to get self info, retry after 1 minute: ');
            console.error(err);
            setTimeout(function() {
              return _this.api.getMe(meHandle);
            }, 60 * 1000);
            return;
          }
          _this.api.startPolling(40);
          if (_this.userPostFix) {
            _this.setSelfName(res.username + '@' + _this.userPostFix);
          } else {
            _this.setSelfName(res.username);
          }
          _this._botInfo = res;
          _this.api.on('error', function(err) {
            return console.error(err.stack || err.toString());
          });
          _this.api.on('message', function(message) {
            var botMessage, channelId, clonedRouter, key, message_, message_id, userName, value;
            channelId = "#" + message.chat.id.toString();
            if (message.from.username) {
              _this.nameMap[message.from.username] = message.from.id;
            }
            if (_this.channelPostFix) {
              channelId += "@" + _this.channelPostFix;
            }
            userName = message.from.username;
            userName = userName || ("undefined_" + message.from.id);
            if (_this.userPostFix) {
              userName += "@" + _this.userPostFix;
            }
            clonedRouter = {};
            for (key in _this) {
              value = _this[key];
              clonedRouter[key] = value;
              if ('function' === typeof value) {
                if (!value.toString().match(/\[native code\]/)) {
                  clonedRouter.key = value.bind(_this);
                }
              }
            }
            message_id = message.message_id;
            message_ = message;
            clonedRouter.output = function(message, to, _message_id, originalChannel, nobuffer, textFormat) {
              var channelName;
              channelName = "#" + message_.chat.id.toString();
              if (_this.channelPostFix) {
                channelName += "@" + _this.channelPostFix;
              }
              _message_id = _message_id || message_id;
              channelName = originalChannel || channelName;
              return _this.output(message, to, _message_id, channelName, nobuffer, textFormat);
            };
            botMessage = createBotMessage(message, _this);
            if (botMessage) {
              return co(function*() {
                var sender, targetMessage;
                if (message.text) {
                  console.log((new Date(botMessage.meta.time)).toISOString().replace(/T/, ' ').replace(/\..+/, '') + ' ' + userName + ' => ' + channelId + ': ' + message.text.replace(/\r?\n/g, '\r\n   | '));
                }
                if (message.reply_to_message) {
                  targetMessage = createBotMessage(message.reply_to_message, _this);
                  if (targetMessage) {
                    botMessage.replyTo = {};
                    botMessage.replyTo.message = targetMessage;
                    botMessage.replyTo.sender = (yield createSenderFromMessage(message.reply_to_message, _this));
                  }
                }
                if (message.forward_from) {
                  botMessage.forwardFrom = (yield createSenderFromUser(message.forward_from, _this));
                }
                sender = (yield createSenderFromMessage(message, _this));
                return _this.emit("message", botMessage, sender, clonedRouter);
              })["catch"](function(e) {
                return console.log(e);
              });
            }
          });
          return _this.on('output', function(m, target, replyId, textFormat) {
            var sendOptions;
            console.log((new Date).toISOString().replace(/T/, ' ').replace(/\..+/, '') + ' ' + _this.getSelfName() + ' => ' + target + ': ' + m.replace(/\r?\n/g, '\r\n   | '));
            target = target.replace(/@.*$/, '');
            if (target.match(/^#/)) {
              target = target.replace(/^#/, '');
              target = parseInt(target, 10);
            } else if (_this.nameMap[target]) {
              target = _this.nameMap[target];
            } else {
              return console.error("unknown username " + target);
            }
            sendOptions = {};
            if (textFormat === 'html') {
              sendOptions.parse_mode = 'HTML';
            }
            if (replyId) {
              sendOptions.reply_to_message_id = replyId;
            }
            return _this.api.sendMessage(target, m, null, sendOptions);
          });
        };
      })(this));
      return this.on('whois', function(nick, cb) {
        return process.nextTick(function() {
          return cb({
            account: nick
          });
        });
      });
    };

    TelegramRouter.prototype.disconnect = function(msg, cb) {
      return this.client.disconnect(msg, cb);
    };

    TelegramRouter.prototype.getRouterIdentifier = function() {
      return this._routerIndetifier || "tg";
    };

    TelegramRouter.prototype.parseArgs = function(cmd) {
      var temp;
      temp = cmd.replace(/^\//, '').split(/\u0020/g);
      temp[0] = temp[0].replace(/@.*/, '');
      return temp;
    };

    TelegramRouter.prototype.getIdentifier = function() {
      return '/';
    };

    TelegramRouter.prototype.input = function(message, from, to, channal, router) {
      var sender;
      sender = new Senter(from, to, message, channal);
      return this.emit("input", message, sender, router);
    };

    TelegramRouter.prototype.inputMessage = function(message, from, to, channal, router) {
      var sender;
      sender = new Senter(from, to, message, channal);
      return this.emit("message", message, sender, router);
    };

    TelegramRouter.prototype.output = function(message, to, message_id, originalChannel, nobuffer, textFormat) {
      var j, len, message_id_temp, person, results;
      if (textFormat == null) {
        textFormat = 'raw';
      }
      message_id_temp = message_id;
      if (originalChannel && to !== originalChannel) {
        message_id_temp = void 0;
      }
      if (Array.isArray(message)) {
        message = message.join("\r\n");
      }
      if ((!nobuffer) && this.bufferTimeout > 0) {
        if (Array.isArray(to)) {
          to.forEach((function(_this) {
            return function(to) {
              _this.messageBuffer[to + '\u0000' + message_id_temp] = _this.messageBuffer[to + '\u0000' + message_id_temp] || [];
              _this.messageBuffer[to + '\u0000' + message_id_temp].push(message);
              if (!_this.bufferTimeoutId) {
                return _this.bufferTimeoutId = setTimeout(_this.flushOutput.bind(_this), _this.bufferTimeout);
              }
            };
          })(this));
        } else {
          this.messageBuffer[to + '\u0000' + message_id_temp] = this.messageBuffer[to + '\u0000' + message_id_temp] || [];
          this.messageBuffer[to + '\u0000' + message_id_temp].push(message);
          if (!this.bufferTimeoutId) {
            this.bufferTimeoutId = setTimeout(this.flushOutput.bind(this), this.bufferTimeout);
          }
        }
        return;
      }
      if (('string' === typeof to) || (to == null)) {
        return this.emit("output", message, to, message_id_temp, textFormat);
      } else {
        results = [];
        for (j = 0, len = to.length; j < len; j++) {
          person = to[j];
          results.push(this.emit("output", message, person, message_id_temp, textFormat));
        }
        return results;
      }
    };

    TelegramRouter.prototype.outputMessage = function(message, to, message_id, originalChannel) {
      var originalInfo, promise, ref, ref1, toTargetId;
      if (message.medias.length > 0) {
        if (!message.meta["_" + (this.getRouterIdentifier())]) {
          return (ref = TextRouter.prototype.outputMessage).call.apply(ref, [this].concat(slice.call(arguments)));
        } else {
          originalInfo = message.meta["_" + (this.getRouterIdentifier())];
          toTargetId = function(i) {
            return (i.slice(1)).replace(/@.+$/, '');
          };
          if (originalInfo.sticker) {
            promise = this.api.sendSticker(toTargetId(to), originalInfo.sticker.file_id);
          } else if (originalInfo.photo) {
            promise = this.api.sendPhoto(toTargetId(to), originalInfo.photo[originalInfo.photo.length - 1].file_id);
          } else if (originalInfo.audio) {
            promise = this.api.sendAudio(toTargetId(to), originalInfo.audio.file_id);
          } else if (originalInfo.video) {
            promise = this.api.sendVideo(toTargetId(to), originalInfo.video.file_id);
          }
          if (promise) {
            return promise.then((function(_this) {
              return function(res) {
                var new_message, new_target;
                new_message = createBotMessage(res, _this);
                new_target = "#" + res.chat.id;
                if (_this.channelPostFix) {
                  new_target = new_target + "@" + _this.channelPostFix;
                }
                return {
                  message: new_message,
                  target: new_target
                };
              };
            })(this));
          } else {
            return (ref1 = TextRouter.prototype.outputMessage).call.apply(ref1, [this].concat(slice.call(arguments)));
          }
        }
      }
      return this.output(message.text, to, message_id, originalChannel, message.textFormat === 'html', message.textFormat);
    };

    TelegramRouter.prototype.flushOutput = function() {
      var channel, channelTemp, id, key, ref, value;
      this.bufferTimeoutId = null;
      ref = this.messageBuffer;
      for (key in ref) {
        value = ref[key];
        channel = (key.split('\u0000'))[0];
        id = (key.split('\u0000'))[1];
        channelTemp = parseInt(channel, 10);
        channel = channelTemp || channel;
        id = parseInt(id, 10);
        if (isNaN(id)) {
          id = null;
        }
        value = value.join("\r\n");
        this.output(value, channel, id, null, true);
      }
      return this.messageBuffer = {};
    };

    TelegramRouter.prototype.toDisplayName = function(str) {
      if (str.match(/^@/)) {
        return str;
      } else {
        return "@" + (str.replace(/@.*/, ''));
      }
    };

    TelegramRouter.prototype.fromDisplayName = function(str) {
      if (!str.match(/^@/)) {
        return str;
      }
      str = str.replace(/^@/, '');
      if (this.userPostFix) {
        return str + '@' + this.userPostFix;
      } else {
        return str;
      }
    };

    TelegramRouter.prototype.isCommand = function(str, sender, manager) {
      var args, temp;
      if (!str.match(/^\//)) {
        return false;
      }
      temp = str.replace(/^\//, '').split(/\u0020/g);
      if ((temp[0].match(/@/)) && !(temp[0].match(new RegExp("@" + this._botInfo.username + "($|[\\r\\n\\s])")))) {
        return false;
      }
      args = this.parseArgs(str);
      if (!manager.hasCommand(args[0])) {
        return false;
      }
      if (this.requireTag) {
        if (sender.target.match(/#[^-]/)) {
          return true;
        }
        if (!temp[0].match(/@/)) {
          return false;
        } else {
          return true;
        }
      } else {
        return true;
      }
    };

    TelegramRouter.prototype.getSelfInfo = function() {
      return co((function(_this) {
        return function*() {
          var botUser, cachedBotUser, error, userInfo, userPhoto, userPhotoMedias;
          cachedBotUser = _this.userInfoCache.get(_this._botInfo.id);
          if (cachedBotUser) {
            return cachedBotUser;
          }
          _this._botInfo = botUser = (yield _this.api.getMe());
          userPhotoMedias = _this.userAvatarCache.get(botUser.id);
          if (!userPhotoMedias) {
            try {
              userPhoto = (yield _this.api.getUserProfilePhotos(botUser.id, null));
              if (userPhoto.total_count > 0) {
                userPhotoMedias = userPhoto.photos.map(function(list) {
                  return createMediaFromPhotoList(list, _this.api);
                }).map(function(media, index) {
                  media.role = 'avatar';
                  media.id = userPhoto.photos[index][0].file_id + "@telegram-avatar";
                  return media;
                });
              } else {
                userPhotoMedias = [];
              }
            } catch (error) {
              console.log('skiping failed avatar...');
              userPhotoMedias = [];
            }
            _this.userAvatarCache.set(botUser.id, userPhotoMedias);
          }
          userInfo = new User("undefined_" + botUser.id, {
            images: userPhotoMedias,
            aliases: botUser.username ? [botUser.username] : [],
            nicknames: botUser.username ? ['@' + botUser.username] : [],
            lastName: botUser.last_name || null,
            firstName: botUser.first_name || null,
            profileUrl: botUser.username ? "https://t.me/" + botUser.username : null,
            type: 'user'
          });
          if (_this.userPostFix) {
            userInfo.id += '@' + _this.userPostFix;
            if (userInfo.aliases[0]) {
              userInfo.aliases[0] += '@' + _this.userPostFix;
            }
          }
          _this.userInfoCache.set(userInfo.id, userInfo);
          return userInfo;
        };
      })(this));
    };

    return TelegramRouter;

  })(TextRouter);

  lastKnownTimeStamp = 0;

  currentTimeStampOffset = 0;

  createBotMessage = function(message, telegramRouter) {
    var audio, botMessage, file, fileThumb, files, media, video, videoThumb, voice;
    if (message.text) {
      botMessage = new Message(message.text, [], true, true);
      botMessage.textFormat = 'html';
      botMessage.textFormated = TelegramText.toHTML(message.text, message.entities);
    }
    if (message.sticker) {
      file = new TelegramFile(message.sticker.file_id, telegramRouter.api, {
        MIME: 'image/webp',
        length: message.sticker.file_size,
        photoSize: [message.sticker.width, message.sticker.height]
      });
      file.meta = {
        overrides: {
          MIME: 'image/webp'
        }
      };
      if (message.sticker.thumb) {
        fileThumb = new TelegramFile(message.sticker.thumb.file_id, telegramRouter.api, {
          MIME: 'image/webp',
          length: message.sticker.thumb.file_size,
          photoSize: [message.sticker.thumb.width, message.sticker.thumb.height],
          isThumb: true
        });
        fileThumb.meta = {
          overrides: {
            MIME: 'image/webp'
          }
        };
      } else {
        fileThumb = new TelegramFile(message.sticker.file_id, telegramRouter.api, {
          MIME: 'image/webp',
          length: message.sticker.file_size,
          photoSize: [message.sticker.width, message.sticker.height],
          isThumb: true
        });
        fileThumb.meta = {
          overrides: {
            MIME: 'image/webp'
          }
        };
      }
      media = new Media({
        id: message.sticker.file_id + "@telegram-sticker",
        role: 'sticker',
        placeHolderText: '((sticker))',
        files: [file, fileThumb]
      });
      botMessage = new Message(message.text || ("((tg-sticker:" + message.sticker.file_id + "))"), [media], true, false);
    }
    if (message.photo) {
      files = message.photo.map((function(_this) {
        return function(data) {
          var photo;
          photo = new TelegramFile(data.file_id, telegramRouter.api, {
            length: data.file_size,
            photoSize: [data.width, data.height]
          });
          photo.meta = {
            overrides: {
              MIME: 'image/webp'
            }
          };
          return photo;
        };
      })(this));
      files[0].isThumb = true;
      media = new Media({
        id: message.photo[0].file_id + "@telegram-photo",
        role: 'photo',
        placeHolderText: '((photo))',
        files: files
      });
      botMessage = new Message(message.caption || ("((tg-photo:" + message.photo[0].file_id + "))"), [media], true, false, !!message.caption);
    }
    if (message.video) {
      if (message.video.thumb) {
        videoThumb = new TelegramFile(message.video.thumb.file_id, telegramRouter.api, {
          length: message.video.thumb.file_size,
          photoSize: [message.video.thumb.width, message.video.thumb.height],
          isThumb: true
        });
      }
      video = new TelegramFile(message.video.file_id, telegramRouter.api, {
        length: message.video.file_size,
        photoSize: [message.video.width, message.video.height],
        duration: message.video.duration
      });
      media = new Media({
        id: message.video.file_id + "@telegram-video",
        role: 'video',
        placeHolderText: '((video))',
        files: [video]
      });
      if (videoThumb) {
        media.files.push(videoThumb);
      }
      botMessage = new Message(message.caption || ("((tg-video:" + message.video.file_id + "))"), [media], true, false, !!message.caption);
    }
    if (message.audio) {
      audio = new TelegramFile(message.audio.file_id, telegramRouter.api, {
        length: message.audio.file_size,
        duration: message.audio.duration,
        MIME: message.audio.mime_type
      });
      audio.meta = {
        overrides: {
          MIME: message.audio.mime_type
        }
      };
      media = new Media({
        id: message.audio.file_id + "@telegram-audio",
        role: 'audio',
        placeHolderText: '((audio))',
        files: [audio],
        meta: {
          performer: message.audio.performer,
          title: message.audio.title
        }
      });
      botMessage = new Message(message.text || ("((tg-audio:" + message.audio.file_id + "))"), [media], true, false);
    }
    if (message.voice) {
      voice = new TelegramFile(message.voice.file_id, telegramRouter.api, {
        length: message.voice.file_size,
        duration: message.voice.duration,
        MIME: message.voice.mime_type
      });
      voice.meta = {
        overrides: {
          MIME: message.voice.mime_type
        }
      };
      media = new Media({
        id: message.voice.file_id + "@telegram-voice",
        role: 'audio',
        placeHolderText: '((voice))',
        files: [voice]
      });
      botMessage = new Message(message.text || ("((tg-voice:" + message.voice.file_id + "))"), [media], true, false);
    }
    if (botMessage) {
      if (message.date === lastKnownTimeStamp) {
        currentTimeStampOffset++;
      } else {
        lastKnownTimeStamp = message.date;
        currentTimeStampOffset = 0;
      }
      botMessage.meta.time = new Date(message.date * 1000 + currentTimeStampOffset);
      botMessage.meta['_' + telegramRouter.getRouterIdentifier()] = message;
      if (telegramRouter.channelPostFix) {
        botMessage.meta.message_id = message.message_id + '@' + telegramRouter.channelPostFix;
      } else {
        botMessage.meta.message_id = message.message_id;
      }
    }
    return botMessage;
  };

  createSenderFromMessage = function(message, telegramRouter) {
    return co(function*() {
      var api, cachedChannel, cachedUser, channelId, channelInfo, channelPhoto, channelPhotoMedia, channelPhotoMedias, compareStr, compareStr1, e, error, error1, error2, sender, userInfo, userName, userPhoto, userPhotoMedias;
      api = telegramRouter.api;
      try {
        channelPhotoMedias = [];
        try {
          channelPhotoMedias = telegramRouter.userAvatarCache.get(message.chat.id);
          if (!channelPhotoMedias) {
            channelPhoto = ((yield telegramRouter.api.getChat(message.chat.id, null))).photo;
            if (channelPhoto) {
              channelPhotoMedia = new Media({
                id: channelPhoto.big_file_id + "@telegram-avatar",
                role: 'avatar',
                placeHolderText: '((avatar))',
                files: [
                  new TelegramFile(channelPhoto.small_file_id, api, {
                    isThumb: true,
                    length: 0,
                    photoSize: [160, 160],
                    meta: {
                      overrides: {
                        MIME: 'image/webp'
                      }
                    }
                  }), new TelegramFile(channelPhoto.big_file_id, api, {
                    isThumb: false,
                    length: 0,
                    photoSize: [640, 640],
                    meta: {
                      overrides: {
                        MIME: 'image/webp'
                      }
                    }
                  })
                ]
              });
              channelPhotoMedias = [channelPhotoMedia];
            } else {
              channelPhotoMedias = [];
            }
            telegramRouter.userAvatarCache.set(message.chat.id, channelPhotoMedias);
          }
        } catch (undefined) {}
        channelInfo = new User("#" + message.chat.id, {
          images: channelPhotoMedias,
          aliases: message.chat.username ? [message.chat.username] : [],
          nicknames: message.chat.username ? ['@' + message.chat.username] : [],
          lastName: message.chat.last_name || null,
          firstName: message.chat.first_name || message.chat.title || null,
          profileUrl: message.chat.username ? "https://t.me/" + message.chat.username : null,
          type: message.chat.id < 0 ? 'channel' : 'user'
        });
        if (telegramRouter.channelPostFix) {
          channelInfo.id += '@' + telegramRouter.channelPostFix;
          if (channelInfo.aliases[0]) {
            channelInfo.aliases[0] += '@' + telegramRouter.channelPostFix;
          }
        }
        cachedChannel = telegramRouter.userInfoCache.get(channelInfo.id);
        if (!cachedChannel) {
          telegramRouter.userInfoCache.set(channelInfo.id, channelInfo);
        } else {
          compareStr = JSON.stringify(channelInfo);
          compareStr1 = JSON.stringify(cachedChannel);
          if (compareStr !== compareStr1) {
            telegramRouter.userInfoCache.set(channelInfo.id, channelInfo);
          }
        }
      } catch (error) {
        e = error;
        console.error(e.stack);
      }
      channelId = "#" + message.chat.id.toString();
      if (telegramRouter.channelPostFix) {
        channelId += "@" + telegramRouter.channelPostFix;
      }
      try {
        userPhotoMedias = telegramRouter.userAvatarCache.get(message.from.id);
        if (!userPhotoMedias) {
          try {
            userPhoto = (yield telegramRouter.api.getUserProfilePhotos(message.from.id, null));
            if (userPhoto.total_count > 0) {
              userPhotoMedias = userPhoto.photos.map(function(list) {
                return createMediaFromPhotoList(list, telegramRouter.api);
              }).map(function(media, index) {
                media.role = 'avatar';
                media.id = userPhoto.photos[index][0].file_id + "@telegram-avatar";
                return media;
              });
            } else {
              userPhotoMedias = [];
            }
          } catch (error1) {
            console.log('skiping failed avatar...');
            userPhotoMedias = [];
          }
          telegramRouter.userAvatarCache.set(message.from.id, userPhotoMedias);
        }
        userInfo = new User("undefined_" + message.from.id, {
          images: userPhotoMedias,
          aliases: message.from.username ? [message.from.username] : [],
          nicknames: message.from.username ? ['@' + message.from.username] : [],
          lastName: message.from.last_name || null,
          firstName: message.from.first_name || null,
          profileUrl: message.from.username ? "https://t.me/" + message.from.username : null,
          type: 'user'
        });
        if (telegramRouter.userPostFix) {
          userInfo.id += '@' + telegramRouter.userPostFix;
          if (userInfo.aliases[0]) {
            userInfo.aliases[0] += '@' + telegramRouter.userPostFix;
          }
        }
        cachedUser = telegramRouter.userInfoCache.get(userInfo.id);
        if (!cachedUser) {
          telegramRouter.userInfoCache.set(userInfo.id, userInfo);
        } else {
          compareStr = JSON.stringify(userInfo);
          compareStr1 = JSON.stringify(cachedUser);
          if (compareStr !== compareStr1) {
            telegramRouter.userInfoCache.set(userInfo.id, userInfo);
          }
        }
      } catch (error2) {
        e = error2;
        console.error(e.stack);
      }
      userName = message.from.username;
      userName = userName || ("undefined_" + message.from.id);
      if (telegramRouter.userPostFix) {
        userName += "@" + telegramRouter.userPostFix;
      }
      sender = new Senter(userName, channelId, message, []);
      sender.senderInfo = userInfo;
      sender.targetInfo = channelInfo;
      return sender;
    });
  };

  createSenderFromUser = function(user, telegramRouter) {
    return co(function*() {
      var cachedUser, channelId, compareStr, compareStr1, e, error, error1, sender, userInfo, userName, userPhoto, userPhotoMedias;
      try {
        userPhotoMedias = telegramRouter.userAvatarCache.get(user.id);
        if (!userPhotoMedias) {
          try {
            userPhoto = (yield telegramRouter.api.getUserProfilePhotos(user.id, null));
            if (userPhoto.total_count > 0) {
              userPhotoMedias = userPhoto.photos.map(function(list) {
                return createMediaFromPhotoList(list, telegramRouter.api);
              }).map(function(media) {
                media.role = 'avatar';
                media.id = userPhoto.photos[0].file_id + "@telegram-avatar";
                return media;
              });
            } else {
              userPhotoMedias = [];
            }
          } catch (error) {
            console.log('skiping failed avatar...');
            userPhotoMedias = [];
          }
          telegramRouter.userAvatarCache.set(user.id, userPhotoMedias);
        }
        userInfo = new User("undefined_" + user.id, {
          images: userPhotoMedias,
          aliases: user.username ? [user.username] : [],
          nicknames: user.username ? ['@' + user.username] : [],
          lastName: user.last_name || null,
          firstName: user.first_name || null,
          profileUrl: user.username ? "https://t.me/" + user.username : null,
          type: 'user'
        });
        if (telegramRouter.userPostFix) {
          userInfo.id += '@' + telegramRouter.userPostFix;
          if (userInfo.aliases[0]) {
            userInfo.aliases[0] += '@' + telegramRouter.userPostFix;
          }
        }
        cachedUser = telegramRouter.userInfoCache.get(userInfo.id);
        if (!cachedUser) {
          telegramRouter.userInfoCache.set(userInfo.id, userInfo);
        } else {
          compareStr = JSON.stringify(userInfo);
          compareStr1 = JSON.stringify(cachedUser);
          if (compareStr !== compareStr1) {
            telegramRouter.userInfoCache.set(userInfo.id, userInfo);
          }
        }
      } catch (error1) {
        e = error1;
        console.error(e.stack);
      }
      channelId = "#__unknown__";
      if (telegramRouter.channelPostFix) {
        channelId += "@" + telegramRouter.channelPostFix;
      }
      userName = user.username;
      userName = userName || ("undefined_" + user.id);
      if (telegramRouter.channelPostFix) {
        userName += "@" + telegramRouter.channelPostFix;
      }
      sender = new Senter(userName, channelId, null, []);
      sender.senderInfo = userInfo;
      return sender;
    });
  };

  TelegramText = (function() {
    function TelegramText() {}

    TelegramText.toHTML = function(text, entities) {
      var chars, entity, i, j, k, len, name, offset, realOffset, ref, ref1, ref2, ref3, url;
      chars = text.split('');
      chars = chars.map(function(i) {
        switch (i) {
          case '&':
            return '&';
          case '<':
            return '<';
          case '>':
            return '>';
          case '"':
            return '"';
          case '\n':
            return '<br/>';
          default:
            return i;
        }
      });
      offset = 0;
      if (!entities) {
        return chars.join('');
      }
      for (j = 0, len = entities.length; j < len; j++) {
        entity = entities[j];
        switch (entity.type) {
          case 'code':
            realOffset = offset + entity.offset;
            chars.splice(realOffset, 0, '<code>');
            chars.splice(realOffset + entity.length + 1, 0, '</code>');
            offset += 2;
            break;
          case 'bold':
            realOffset = offset + entity.offset;
            chars.splice(realOffset, 0, '<b>');
            chars.splice(realOffset + entity.length + 1, 0, '</b>');
            offset += 2;
            break;
          case 'italic':
            realOffset = offset + entity.offset;
            chars.splice(realOffset, 0, '<i>');
            chars.splice(realOffset + entity.length + 1, 0, '</i>');
            offset += 2;
            break;
          case 'pre':
            realOffset = offset + entity.offset;
            for (i = k = ref = realOffset, ref1 = realOffset + entity.length - 1; ref <= ref1 ? k <= ref1 : k >= ref1; i = ref <= ref1 ? ++k : --k) {
              if (chars[i] === '<br/>') {
                chars[i] = '\n';
              }
            }
            chars.splice(realOffset, 0, '<pre>');
            chars.splice(realOffset + entity.length + 1, 0, '</pre>');
            offset += 2;
            break;
          case 'mention':
            realOffset = offset + entity.offset;
            name = chars.slice(realOffset + 1, realOffset + entity.length).join('');
            url = "https://telegram.me/" + (encodeURIComponent(name));
            chars.splice(realOffset, 0, "<a href=\"" + url + "\" data-tg-type=\"mention\" >");
            chars.splice(realOffset + entity.length + 1, 0, '</a>');
            offset += 2;
            break;
          case 'text_mention':
            realOffset = offset + entity.offset;
            name = chars.slice(realOffset, realOffset + entity.length).join('');
            if (entity.user.username) {
              url = "https://telegram.me/" + (encodeURIComponent(entity.user.username));
            } else {
              url = "#";
            }
            chars.splice(realOffset, 0, "<a href=\"" + url + "\" data-tg-type=\"text_mention\" data-tg-id=\"" + entity.user.id + "\" data-tg-first_name=\"" + (entity.user.first_name || '') + "\" data-tg-last_name=\"" + (entity.user.last_name || '') + "\" >");
            chars.splice(realOffset + entity.length + 1, 0, '</a>');
            offset += 2;
            break;
          case 'url':
          case 'email':
          case 'text_link':
          case 'hashtag':
          case 'bot_command':
            realOffset = offset + entity.offset;
            if ((ref2 = entity.type) === 'url' || ref2 === 'text_link' || ref2 === 'email') {
              url = chars.slice(realOffset, realOffset + entity.length).join('');
              if ((!(url.match(/^https?:\/\//))) && ((ref3 = entity.type) === 'url' || ref3 === 'text_link')) {
                url = 'http://' + url;
              }
            } else {
              url = '#';
            }
            if (entity.type === 'email') {
              url = 'mailto://' + url;
            }
            url = entity.url || url;
            chars.splice(realOffset, 0, "<a href=\"" + url + "\" data-tg-type=\"" + entity.type + "\" >");
            chars.splice(realOffset + entity.length + 1, 0, '</a>');
            offset += 2;
        }
      }
      return chars.join('');
    };

    return TelegramText;

  })();

  createMediaFromPhotoList = function(list, api) {
    var files, media;
    files = list.map((function(_this) {
      return function(data) {
        var photo;
        photo = new TelegramFile(data.file_id, api, {
          length: data.file_size,
          photoSize: [data.width, data.height]
        });
        photo.meta = {
          overrides: {
            MIME: 'image/webp'
          }
        };
        return photo;
      };
    })(this));
    files[0].isThumb = true;
    return media = new Media({
      id: list[0].file_id + "@telegram-photo",
      role: 'photo',
      placeHolderText: '((photo))',
      files: files
    });
  };

  module.exports = TelegramRouter;

}).call(this);


A clean, bright and spacious cardio room filled with lots natural light highlighted by expansive views of Middlebury south.
You'll find this room very well equipped with cardio machines from quality manufacturers like Precor, Cybex, Octane, Matrix, Hoist, Tuff Stuff, Quinton, Life Fitness, Stair Master, Star Trac, Woodway, NuStep, Concept II and more!
Let one of our trained staff members give you an orientation on the cardio machines. This service is included at no additional charge with membership. We're always here to help!


Custom made-to-order exclusively for Post Ranch in Los Angeles, this 600 thread count sateen sheeting collection is woven with 100% organic extra-long staple cotton. While most linens contain harsh chemicals and dyes, these are completely chemical and dye free, using 50% less water during the production process. Enjoy a pure, sweet night's sleep. Sheet sets include a fitted sheet, flat sheet and a pair of pillow shams. Please allow time for production, and please note that this is a made-to-order item.
Fitted Sheet 72" x 84" x 16"
Flat Sheet 118" x 111"
Sham Pair 20" x 36"
Fitted Sheet 78" x 80" x 16"
Fitted Sheet 60" x 80" x 16"
Flat Sheet 100" x 111"
Sham Pair 20" x 30"


How do I install the Bitnami Multicraft Stack?
Download the executable file for the Bitnami Multicraft Stack from the Bitnami website.
Download the OS X VM file for the Bitnami Multicraft Stack from the Bitnami website.


The phileo love refers to an affectionate, warm and tender platonic love. It makes you desire friendship with someone.
i. Phileō is a companionable love.
INFJs: Does my drive for authenticity have an affect on my relationships?


I hate going shopping, especially at my neighborhood mall. I always end up seeing people I have no desire to see and consequently forcing myself to talk to them.
Because of my prior experiences, I should have paid my pathetic friend absolutely no attention when she begged me to accompany her to the mall the other day. I should have been strong. I should have held my ground.
"But, Manda! I really need new shoes!" she begged.
How could I have possibly declined such an invitation?
After about an hour of preparation (even though you don't care whom you may see, you still want them to think you look good) and a hellish drive, we were finally there. It was my intention to simply go through each store at warp speed, but my friend had something else in mind.
"Manda, let's go to Coney Island! Remember how we would come here and get chili cheese dogs all the time?" she reminisced.
The girl didn't need new shoes. She wanted a walk down memory lane.
There was no turning back. We were already there. Plus, she had confiscated my keys and wallet upon entering the vicinity.
For those of you old enough to be familiar with the expression, I was stuck like chuck.
But Coney Island? Did we really have to go there? Could she already have forgotten who might still work there?
"Hey," she said, dragging me by the arm, "I wonder if Bad Breath Frankie still works there."
As if on cue, he stood before us.
"Hello, ladies," he greeted us with a smarmy grin.
That was all it took. I felt faint and my palms began to sweat. Panic. A very common emotion around Bad Breath Frankie.
Here's a little inside information: Frankie was always a nice boy, a really good kid. He made decent grades and played sports.
Sounds like your average guy, right?
Wrong! You see, Frankie had this problem, as you may have noticed from his nickname, "Bad Breath Frankie." Of course, the boys also maintained their distance and called him "Frankfarter," respectively.
During high school, he could never hold down a job because his boss would always complain about the stench. Just when he thought he was never going to get a job, this opportunity at James Coney Island turned up. The boss was never there, so Frankie ran the shop alone. No one could complain. He was ecstatic.
Frankly, I was ecstatic too. In those days, I would always get so involved in other people's problems. You know how it is. I was so relieved when Frankie got the job because I wouldn't have to support him myself after his parents died.
That was always as far as I thought he'd go, for he never really had the ambition to "make it" like everyone else. That's what was so refreshing about Frankie's personality.
I was stuck in my own stroll down memory lane when my friend nudged me. "Did you hear that? Frankie owns two franchises now!"
"That's not all, ladies." He took out his wallet and showed us a picture of himself, a nice-looking girl, and an adorable baby boy.
That was when the whole thing started to get too much for me. All the time I had made myself so miserable because I thought Frankie would end up alone and penniless - it was all such a waste. I felt embarrassed and angry at myself for not having more faith in him.
The chatting soon ended and with it the stroll down memory lane.
After that I made my friend promise me that we would never go to the mall again.
It is really difficult to convey what I feel. Of course, there was melancholy, but there was something lighter there as well. Maybe there was a little bit of hope mixed in, too.
After all, if Frankie can find his piece of happiness, maybe I can.
Mahmoudi, a sophomore French and German major, recommends Breath Assure instead of hardship. Direct responses via e-mail to amahmoud@bayou.uh.edu.


text:
There are currently no regulatory requirements for a non-Instrument Flight Rules (IFR) equipped helicopter, involved in flight under the Night Visual Flight Rules (NVFR), to be equipped with a standby attitude indicator (artificial horizon) flight instrument. Helicopters engaged in single-pilot commercial or aerial work NVFR operations do not have the same level of system redundancy as IFR equipped helicopters, to safely cope with equipment failures and emergency situations.
Attitude Indicators
Loss of the functionality of a normally electrically operated primary attitude indicator, on a helicopter not equipped with a standby attitude indicator during flight under the NVFR would result in limited or partial panel flying by the pilot. Limited or partial panel flying is defined as flight with key instruments obliterated or inoperative and external cues absent. Partial panel flying is very demanding and previous accident investigations indicate that even highly experienced IFR rated pilots may have difficulty safely operating a helicopter or aircraft under such circumstances.
Australian Civil Aviation Safety Authority Civil Aviation Order (CAO) Part 95.7.3 currently provides specific requirements for helicopters engaged in charter marine pilot transfers. These requirements include meeting the requirements of Appendix VIII of CAO Part 20, section 20.18, 'Instruments Required for Night VFR Flight in Helicopters Except While Engaged in Agricultural Operations'. This Appendix includes a requirement for '(1) a primary attitude indicator and (2) a standby attitude indicator or turn indicator.'
CAO Part 20, section 20.18, Appendix VII 'Instruments Required for Instrument Flight Rules Operation in Helicopters (Except Night VFR)' includes a requirement for a standby attitude indicator for both one and two pilot operations.
The Helicopter Association of Australia recently drafted a paper called 'Night Operations Risk Reduction Checklist'. This checklist is being developed to allow operators to evaluate the risk related to night operations. The checklist provides an allocation of points to each item that contributes to the safety of operations (out of a maximum of ten points per item). The checklist allocates four points to an operator whose helicopter was fitted with a standby attitude indicator with an independent power source.
Under certain conditions, external visual reference may not be available while flying a helicopter under the NVFR. These conditions include operating over remote areas, in moonless or near moonless conditions, over water, and at times when the celestial horizon is obscured by cloud.
Spatial disorientation refers to a failure by a pilot to sense correctly the position, motion, or attitude of the aircraft or of themselves within the fixed coordinate system provided by the surface of the earth and its gravitational force. For example, a pilot's inaccurate perception of their position, attitude, or motion with respect to the aircraft or their own aircraft relative to another aircraft, terrain, or other obstacle is considered spatial disorientation in flight.
When spatial disorientation occurs, pilots are unable to process, believe, see, or interpret the information on the flight instruments and they rely upon the erroneous information provided by their senses. In addition, the risk of spatial disorientation is high during instrument meteorological conditions (IMC) and night flying in either visual meteorological conditions (VMC) or IMC.
Partial panel flying by a pilot inexperienced in IFR flight and operating in low celestial or artificial lighting conditions, during flight under the NVFR, may impose a significant safety risk. The inclusion of a requirement for a standby attitude indicator, with an independent power source, in the event of the failure of the primary instrument during flights under the NVFR would mitigate the risk of the pilot incurring spatial disorientation by providing him a backup instrument in the case of a primary instrument failure.
The Australian Transport Safety Bureau recommends that the Australian Civil Aviation Safety Authority assess the safety benefits of requiring a standby attitude indicator, with an independent power source, in all helicopters operating flights under the NVFR in the Charter and Aerial Work category, excluding dual pilot training.
Issues raised in the recommendations relate to Civil Aviation Safety Regulation (CASR) Part 133, which is currently under review. Therefore, until the review is complete, CASA is unable to provide the ATSB with any substantial comment.
Further correspondence
Response status:
Closed - Accepted
As part of the consultation process associated with the development of Civil Aviation Safety Regulation (CASR) Part 133, CASA consulted with the Helicopter Association of Australia (HAA) and the general helicopter industry regarding the benefits of a standby attitude indicator.
On the basis of these consultations, CASA has assessed the safety benefits of requiring a standby attitude indicator with an independent power source, and determined that greater emphasis should be placed on training pilots carrying out NVFR flight. CASA considers this to be a more effective approach than introducing a mandatory requirement for the fitment of a secondary attitude reference instrument. Therefore, CASA has taken steps in CASR Part 133 to strengthen recurrent training and checking and operator proficiency checks for pilots undertaking NVFR flights in helicopters engaged in air transport operations. It will also apply to those engaged in Emergency Medical Service (EMS), Search and Rescue (SAR) and Marine Pilot Transfer operations as well as any other aerial work operations that CASA deems appropriate.
ATSB response:
The Australian Transport Safety Bureau notes that the Civil Aviation Safety Authority issued Civil Aviation Advisory Publication (CAAP) 5.13-2(0) Night Visual Flight Ratings in December 2006. The CAAP was developed following a number of accidents involving flight at night under the VFR. The CAAP addresses typical threats and errors applicable to night flight and presents possible countermeasures or defences for pilots and operators conducting NVFR operations. Users are encouraged to incorporate these into both training and operations.

redpajama_set_name: RedPajamaCommonCrawl


text:
Ryan Day (American football)
Ryan Day
Day during the 2019 Fiesta Bowl.
$4.5 million[1]
Biographical details
(1979-03-12) March 12, 1979 (age 41)
Quarterback, linebacker
Coaching career (HC unless noted)
New Hampshire (TE)
Boston College (GA)
Florida (GA)
Temple (WR)
Boston College (WR)
Temple (OC/WR)
Boston College (OC/QB)
Philadelphia Eagles (QB)
San Francisco 49ers (QB)
Ohio State (co-OC/QB)
Ohio State (acting HC/OC/QB)
1–2 (CFP)
Accomplishments and honors
2 Big Ten (2019–2020)
2 Big Ten East Division (2019–2020)
Big Ten Coach of the Year (2019)
Ryan Patrick Day (born March 12, 1979) is an American football coach and former college player. He is the 24th and current head football coach at Ohio State University. He played quarterback and linebacker for the New Hampshire Wildcats from 1998 to 2001 before he began his coaching career in 2002.
1 Playing career
Playing career[edit]
Day attended Manchester Central High School in Manchester, New Hampshire.[2] A quarterback and defensive back, he was the state's Gatorade Player of the Year for his senior season.[2] Day attended the University of New Hampshire. Playing for then-offensive coordinator Chip Kelly, Day set four career records at UNH, including completion percentage and touchdowns.[3]
Day was the offensive coordinator for Temple in 2012, as well as the offensive coordinator for Boston College from 2013 to 2014. He was hired as the Philadelphia Eagles' quarterbacks coach on January 22, 2015.[4] Then, in 2016, after his mentor Chip Kelly was relieved of his duties in Philadelphia, Day was hired in the same role by Kelly, who became the head coach of the San Francisco 49ers. On January 3, 2017, Day was hired to replace co-offensive coordinator Tim Beck of the Ohio State Buckeyes. After being linked to the Tennessee Titans offensive coordinator position in January 2018, Day was promoted to offensive coordinator and primary playcaller at Ohio State.
On August 1, 2018, he was named acting head coach at Ohio State when head coach Urban Meyer was placed on administrative leave[5] when news came to light of Meyer's knowledge of events surrounding then-fired Zach Smith's domestic violence accusations made by Smith's estranged wife. Day would go on to win all three games during Meyer's absence. On December 4, 2018, Ohio State announced that Meyer would retire as head coach after the 2019 Rose Bowl and be replaced by Day on a full-time basis.[6][7]
In 2019, Day's first season as a full-time head coach, he led the Buckeyes to a perfect 12-0 regular season record, the Buckeyes's first undefeated regular season since 2013. Despite being predicted to finish second in the Big Ten East Division according to the 2019 Cleveland.com preseason poll,[8] the Buckeyes clinched the division following their November 23 victory over rival Penn State, and secured a spot in the Big Ten Championship,[9] which they would go on to win, beating Wisconsin 34-21.[10] The Buckeyes would go on to be the number two seed in the College Football Playoff and would lose to the Clemson Tigers in the Fiesta Bowl. On December 3, 2019, Coach Day was named the Dave McClain Coach of the Year by the media.[11] Day tested positive for COVID-19 on November 27, 2020,[12] and missed the team's December 5 win over Michigan State.[13]
In the 2020 season, Day led the Buckeyes to a perfect regular season record and defeated the Northwestern Wildcats in the Big Ten Championship game, winning the second Big Ten Conference championship of his career as a head coach. On January 1, 2021, The Buckeyes defeated the Clemson Tigers in the Sugar Bowl, advancing to the National Championship game against Alabama. On January 11, the Buckeyes were defeated by Alabama 52-24.
Ohio State Buckeyes (Big Ten Conference) (2018)
2018 Ohio State 3–0[n 1] 1–0[n 1]
Ohio State Buckeyes (Big Ten Conference) (2019–present)
2019 Ohio State 13–1 9–0 1st (East) L Fiesta† 3 3
2020 Ohio State 7–1[n 2] 5–0[n 2] 1st (East) W Sugar†, L CFP NCG† 2 2
†Indicates CFP / New Years' Six bowl.
^ a b Ohio State head coach Urban Meyer was placed on administrative leave for the first three games of the 2018 season. Day served as acting head coach in his absence. Ohio State credits the first three games of the season to Day and the remaining 11 games, including the Rose Bowl, to Meyer.
^ a b Day tested positive for COVID-19 and missed one game in 2020, but was credited as the head coach of record for all games.
^ Sutelan, Edward (December 4, 2018). "Football: Ryan Day to make $4.5 million per year over next five years as Ohio State head coach". www.thelantern.com. The Lantern. Retrieved January 1, 2019.
^ a b Coppola, Frank (August 26, 2001). "There is little doubt about Ryan Day's role at UNH". Seacoastonline.com. Retrieved February 1, 2015.
^ Shorr-Parks, Eliot (January 23, 2015). "Here is what you need to know about Eagles' new quarterbacks coach Ryan Day". NJ.com. Retrieved February 1, 2015.
^ Shorr-Parks, Eliot (January 22, 2015). "Eagles hire Boston College offensive coordinator Ryan Day as quarterback coach". nj.com. Retrieved January 26, 2015.
^ Harrish, Kevin (August 1, 2018). "Ryan Day Tabbed Interim Head Coach During Urban Meyer's Paid Administrative Leave". Eleven Warriors. Retrieved August 1, 2018.
^ Sallee, Barrett (December 4, 2018). "Ohio State coach Urban Meyer set to announce retirement, Ryan Day to replace him with Buckeyes". cbssports.com. CBS Sports. Retrieved December 4, 2018.
^ "Ohio State's Urban Meyer retiring; Ryan Day promoted to head coach". The Advocate. Associated Press. December 4, 2018. Retrieved December 4, 2018.
^ https://www.cleveland.com/osu/2019/07/michigan-named-big-ten-football-favorite-in-clevelandcom-2019-preseason-poll.html
^ West, Jenna (November 23, 2019). "Ohio State Beats Penn State to Advance to Big Ten Championship Game". Sports Illustrated.
^ https://www.10tv.com/article/buckeyes-comeback-beat-wisconsin-34-21-claim-3rd-consecutive-big-ten-title-2019-dec
^ "Ryan Day named Big Ten Coach of the Year by conference media". 10tv.com. December 3, 2019. Retrieved December 3, 2019.
^ Dinich, Heather (November 27, 2020). "Ohio State coach Ryan Day among those in football program to test positive for COVID-19". ESPN.com. Retrieved December 7, 2020.
^ Rittenberg, Adam (December 5, 2020). "Ohio State coach Ryan Day hopeful that 'worst part is behind us' after COVID-19 issues". ESPN.com. Retrieved December 7, 2020.
Head football coaches of the Big Ten Conference
Tom Allen (Indiana)
Mike Locksley (Maryland)
Jim Harbaugh (Michigan)
Mel Tucker (Michigan State)
Ryan Day (Ohio State)
James Franklin (Penn State)
Greg Schiano (Rutgers)
Bret Bielema (Illinois)
Kirk Ferentz (Iowa)
P. J. Fleck (Minnesota)
Scott Frost (Nebraska)
Pat Fitzgerald (Northwestern)
Jeff Brohm (Purdue)
Paul Chryst (Wisconsin)
Retrieved from "https://en.wikipedia.org/w/index.php?title=Ryan_Day_(American_football)&oldid=1000943031"
American football quarterbacks
Boston College Eagles football coaches
New Hampshire Wildcats football coaches
New Hampshire Wildcats football players
Philadelphia Eagles coaches
Temple Owls football coaches
Sportspeople from Manchester, New Hampshire
Players of American football from New Hampshire
Manchester Central High School alumni
Coaches of American football from New Hampshire


42.1 This Rule applies to a Rider when weighing out.
42.2.3 any blinkers, hood, visor, eyeshield, eyecover or number cloth which he is to carry in the race but which are excluded from the scale (by virtue of Paragraphs 42.4.6 to 42.4.10 and 42.4.17).
42.3.2 is in doubt as to his proper weight, he may declare the weight he intends to carry.
42.6 No Rider shall weigh out or attempt to weigh out for a race when not wearing an approved safety vest.


text:
using UnityEngine;
using System.Collections;

public class FontResizer : MonoBehaviour {

	private static Vector2 SCALAR = Vector2.zero;
	public void Start()
	{

			SCALAR = Constants.getScreenScalar();

			resizeGUITexts( Constants.getScreenScalar() );

	}

	void resizeGUITexts(Vector2 vec)
	{
		GUIText[] guiTexts = ( GUIText[])GameObject.FindObjectsOfType(typeof(GUIText));
		for(int i=0; i<guiTexts.Length; i++)
		{
			Misc.resizeGUIText(guiTexts[i],vec);
			Misc.changeFont(guiTexts[i],vec);

		}

	}

}

redpajama_set_name: RedPajamaGithub


Want to give TeaMi products a try? At checkout type GlutenFree1010 and save 10% off your total order!
I love coffee. A lot, a lot. I'm finishing up a 12-week fitness program, BBG 1.0, and thought this would be the perfect cap: kicking the coffee habit by replacing it with tea which has less caffeine and more antioxidants. I honestly picked Teami because they had a big Easter Sale and several people I follow on Instagram had given them good reviews. Teami sells multiple different tea blends used for different purposes.
The Teami Detox 30 Day plan is intended to boost metabolism, burn stored fat, detox and flush internal organs, & reduce bloating. All of that sounds good to me.
What comes with the 30 day pack?
15 colon cleanse tea bags (ingredients here), which you begin drinking on the 2nd night of the Detox and continue every other night. I've read to drink it right before bed and with water.
I tried looking for other tumblers with this same filter detachment on Amazon with no luck so I just added this cute blue guy.
My box of a 30 day supply + tumbler got here super fast.
The tea tumbler is awesome! I love that you can put hot and cold water in it and drop in cucumbers or lemons for fruit infused h20.
The guide calls for 1 teaspoon, as shown in the palm of my hand. It does expand into leafy beauty.
You can add hot water 2-3 more times after your first cup.
I subbed coffee the whole day for tea and didn't miss it!
It tastes a lot like green tea or a jasmine. Kinda dry but hints of sweet. I added honey and it was perfect. Really, I usually dump creamer into my coffee too.
The only itsy bitty complaint I have is that I wish the top would snap down further, as you can see it's propped up a bit more than the black mug. I know I have been graced with a big, German nose but I kept bumping it against the top. Meh, not a deal breaker, just a little product efficiency note.
~ First impressions are great!! Excited for the next 29 days. Didn't miss coffee. Nervous for the colon cleanse part :?
~ I've since finished the full 30 days! Yay! Check out my full review of Teami 30 Day Detox!


text:
Guys, It's Time To Freak The Hell Out Because Pennywise Is Returning
By Marilynn McLachlan
"You look like a nice boy, I bet you have a lot of friends…" Oh, spine chilling, goosebump-inducing clown, can you just STOP? It was deliciously bad enough that Pennywise hit our screens in 2017 in what was arguably the year's most scary movie but now we hear the evil clown is making a comeback and we. can't. even.
The 1986 book, written by the world's best horror novelist, Stephen King has been split into two films. As we can all remember, the first followed the story of the Losers Club. They've long since gone their separate ways and now they'll reunite almost three decades later amid new threats by their nemesis Pennywise, who will again be played by Bill Bill Skarsgård.
And, if it's anything like the first, which grossed more than a whopping $700 million globally, we can expect IT CHAPTER TWO to have all the heart-stopping horror of the first.
As Ben Hanscom said in the first movie: "Derry is not like any town I've been in before. They did a study once and, it turns out, people die or disappear at six times the national average. And that's just grown ups."
We're doomed.
The Deets:
What: IT CHAPTER TWO
When: In cinemas September 2019
Recap the horror of the first IT below.
Get our top stories direct to your inbox.
More On …
Couples Organic Food News Nightlife Branded Content Students Auckland Noosa Australia Vegan Wellness Womens Health Shop