text:
// Copyright 2011 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "graph.h"

#include <assert.h>
#include <stdio.h>

#include "build_log.h"
#include "debug_flags.h"
#include "depfile_parser.h"
#include "deps_log.h"
#include "disk_interface.h"
#include "manifest_parser.h"
#include "metrics.h"
#include "state.h"
#include "util.h"

bool Node::Stat(DiskInterface* disk_interface, string* err) {
  METRIC_RECORD("node stat");
  mtime_ = disk_interface->Stat(path_, err);
  exists_ = mtime_ > 0;
  return mtime_ != -1;
}

bool DependencyScan::RecomputeDirty(Node* node, string* err) {
  vector<Node*> stack;
  return RecomputeDirty(node, &stack, err);
}

bool DependencyScan::RecomputeDirty(Node* node, vector<Node*>* stack,
                                    string* err) {
  Edge* edge = node->in_edge();
  if (!edge) {
    // If we already visited this leaf node then we are done.
    if (node->status_known())
      return true;
    // This node has no in-edge; it is dirty if it is missing.
    if (!node->StatIfNecessary(disk_interface_, err))
      return false;
    if (!node->exists())
      EXPLAIN("%s has no in-edge and is missing", node->path().c_str());
    node->set_dirty(!node->exists());
    return true;
  }

  // If we already finished this edge then we are done.
  if (edge->mark_ == Edge::VisitDone)
    return true;

  // If we encountered this edge earlier in the call stack we have a cycle.
  if (!VerifyDAG(node, stack, err))
    return false;

  // Mark the edge temporarily while in the call stack.
  edge->mark_ = Edge::VisitInStack;
  stack->push_back(node);

  bool dirty = false;
  edge->outputs_ready_ = true;
  edge->deps_missing_ = false;

  // Load output mtimes so we can compare them to the most recent input below.
  for (vector<Node*>::iterator o = edge->outputs_.begin();
       o != edge->outputs_.end(); ++o) {
    if (!(*o)->StatIfNecessary(disk_interface_, err))
      return false;
  }

  if (!dep_loader_.LoadDeps(edge, err)) {
    if (!err->empty())
      return false;
    // Failed to load dependency info: rebuild to regenerate it.
    // LoadDeps() did EXPLAIN() already, no need to do it here.
    dirty = edge->deps_missing_ = true;
  }

  // Visit all inputs; we're dirty if any of the inputs are dirty.
  Node* most_recent_input = NULL;
  for (vector<Node*>::iterator i = edge->inputs_.begin();
       i != edge->inputs_.end(); ++i) {
    // Visit this input.
    if (!RecomputeDirty(*i, stack, err))
      return false;

    // If an input is not ready, neither are our outputs.
    if (Edge* in_edge = (*i)->in_edge()) {
      if (!in_edge->outputs_ready_)
        edge->outputs_ready_ = false;
    }

    if (!edge->is_order_only(i - edge->inputs_.begin())) {
      // If a regular input is dirty (or missing), we're dirty.
      // Otherwise consider mtime.
      if ((*i)->dirty()) {
        EXPLAIN("%s is dirty", (*i)->path().c_str());
        dirty = true;
      } else {
        if (!most_recent_input || (*i)->mtime() > most_recent_input->mtime()) {
          most_recent_input = *i;
        }
      }
    }
  }

  // We may also be dirty due to output state: missing outputs, out of
  // date outputs, etc.  Visit all outputs and determine whether they're dirty.
  if (!dirty)
    if (!RecomputeOutputsDirty(edge, most_recent_input, &dirty, err))
      return false;

  // Finally, visit each output and update their dirty state if necessary.
  for (vector<Node*>::iterator o = edge->outputs_.begin();
       o != edge->outputs_.end(); ++o) {
    if (dirty)
      (*o)->MarkDirty();
  }

  // If an edge is dirty, its outputs are normally not ready.  (It's
  // possible to be clean but still not be ready in the presence of
  // order-only inputs.)
  // But phony edges with no inputs have nothing to do, so are always
  // ready.
  if (dirty && !(edge->is_phony() && edge->inputs_.empty()))
    edge->outputs_ready_ = false;

  // Mark the edge as finished during this walk now that it will no longer
  // be in the call stack.
  edge->mark_ = Edge::VisitDone;
  assert(stack->back() == node);
  stack->pop_back();

  return true;
}

bool DependencyScan::VerifyDAG(Node* node, vector<Node*>* stack, string* err) {
  Edge* edge = node->in_edge();
  assert(edge != NULL);

  // If we have no temporary mark on the edge then we do not yet have a cycle.
  if (edge->mark_ != Edge::VisitInStack)
    return true;

  // We have this edge earlier in the call stack.  Find it.
  vector<Node*>::iterator start = stack->begin();
  while (start != stack->end() && (*start)->in_edge() != edge)
    ++start;
  assert(start != stack->end());

  // Make the cycle clear by reporting its start as the node at its end
  // instead of some other output of the starting edge.  For example,
  // running 'ninja b' on
  //   build a b: cat c
  //   build c: cat a
  // should report a -> c -> a instead of b -> c -> a.
  *start = node;

  // Construct the error message rejecting the cycle.
  *err = "dependency cycle: ";
  for (vector<Node*>::const_iterator i = start; i != stack->end(); ++i) {
    err->append((*i)->path());
    err->append(" -> ");
  }
  err->append((*start)->path());
  return false;
}

bool DependencyScan::RecomputeOutputsDirty(Edge* edge, Node* most_recent_input,
                                           bool* outputs_dirty, string* err) {
  string command = edge->EvaluateCommand(/*incl_rsp_file=*/true);
  for (vector<Node*>::iterator o = edge->outputs_.begin();
       o != edge->outputs_.end(); ++o) {
    if (RecomputeOutputDirty(edge, most_recent_input, command, *o)) {
      *outputs_dirty = true;
      return true;
    }
  }
  return true;
}

bool DependencyScan::RecomputeOutputDirty(Edge* edge,
                                          Node* most_recent_input,
                                          const string& command,
                                          Node* output) {
  if (edge->is_phony()) {
    // Phony edges don't write any output.  Outputs are only dirty if
    // there are no inputs and we're missing the output.
    if (edge->inputs_.empty() && !output->exists()) {
      EXPLAIN("output %s of phony edge with no inputs doesn't exist",
              output->path().c_str());
      return true;
    }

    // Update the mtime with the newest input. Dependents can thus call
    //  mtime() on the fake node and get the latest mtime of the dependencies
    if (most_recent_input)
      output->UpdatePhonyMtime(most_recent_input->mtime());

    // Phony edges are clean, nothing to do
    return false;
  }

  BuildLog::LogEntry* entry = 0;

  // Dirty if we're missing the output.
  if (!output->exists()) {
    EXPLAIN("output %s doesn't exist", output->path().c_str());
    return true;
  }

  // Dirty if the output is older than the input.
  if (most_recent_input && output->mtime() < most_recent_input->mtime()) {
    TimeStamp output_mtime = output->mtime();

    // If this is a restat rule, we may have cleaned the output with a restat
    // rule in a previous run and stored the most recent input mtime in the
    // build log.  Use that mtime instead, so that the file will only be
    // considered dirty if an input was modified since the previous run.
    bool used_restat = false;
    if (edge->GetBindingBool("restat") && build_log() &&
        (entry = build_log()->LookupByOutput(output->path()))) {
      output_mtime = entry->mtime;
      used_restat = true;
    }

    if (output_mtime < most_recent_input->mtime()) {
      bool really_dirty = true;
      if (edge->GetBindingBool("hash_input")) {
        string err;
        really_dirty = hash_log().EdgeChanged(edge, &err);
        if (!err.empty()) {
          really_dirty = true; // in case of an error we behave as if hashing
          Error(err.c_str());  // would be disabled, but we log the error
        }
      }

      if (really_dirty) {
        EXPLAIN("%soutput %s older than most recent input %s "
                "(%d vs %d)",
                used_restat ? "restat of " : "", output->path().c_str(),
                most_recent_input->path().c_str(),
                output_mtime, most_recent_input->mtime());
        return true;
      } else {
        EXPLAIN("output %s older than most recent input, but hashed "
                "contents of all inputs are unchanged",
              output->path().c_str());
      }
    }
  }

  if (build_log()) {
    bool generator = edge->GetBindingBool("generator");
    if (entry || (entry = build_log()->LookupByOutput(output->path()))) {
      if (!generator &&
          BuildLog::LogEntry::HashCommand(command) != entry->command_hash) {
        // May also be dirty due to the command changing since the last build.
        // But if this is a generator rule, the command changing does not make us
        // dirty.
        EXPLAIN("command line changed for %s", output->path().c_str());
        return true;
      }
      if (most_recent_input && entry->mtime < most_recent_input->mtime()) {
        // May also be dirty due to the mtime in the log being older than the
        // mtime of the most recent input.  This can occur even when the mtime
        // on disk is newer if a previous run wrote to the output file but
        // exited with an error or was interrupted.
        EXPLAIN("recorded mtime of %s older than most recent input %s (%d vs %d)",
                output->path().c_str(), most_recent_input->path().c_str(),
                entry->mtime, most_recent_input->mtime());
        return true;
      }
    }
    if (!entry && !generator) {
      EXPLAIN("command line not found in log for %s", output->path().c_str());
      return true;
    }
  }

  return false;
}

bool Edge::AllInputsReady() const {
  for (vector<Node*>::const_iterator i = inputs_.begin();
       i != inputs_.end(); ++i) {
    if ((*i)->in_edge() && !(*i)->in_edge()->outputs_ready())
      return false;
  }
  return true;
}

/// An Env for an Edge, providing $in and $out.
struct EdgeEnv : public Env {
  enum EscapeKind { kShellEscape, kDoNotEscape };

  EdgeEnv(Edge* edge, EscapeKind escape)
      : edge_(edge), escape_in_out_(escape), recursive_(false) {}
  virtual string LookupVariable(const string& var);

  /// Given a span of Nodes, construct a list of paths suitable for a command
  /// line.
  string MakePathList(vector<Node*>::iterator begin,
                      vector<Node*>::iterator end,
                      char sep);

 private:
  vector<string> lookups_;
  Edge* edge_;
  EscapeKind escape_in_out_;
  bool recursive_;
};

string EdgeEnv::LookupVariable(const string& var) {
  if (var == "in" || var == "in_newline") {
    int explicit_deps_count = edge_->inputs_.size() - edge_->implicit_deps_ -
      edge_->order_only_deps_;
    return MakePathList(edge_->inputs_.begin(),
                        edge_->inputs_.begin() + explicit_deps_count,
                        var == "in" ? ' ' : '\n');
  } else if (var == "out") {
    int explicit_outs_count = edge_->outputs_.size() - edge_->implicit_outs_;
    return MakePathList(edge_->outputs_.begin(),
                        edge_->outputs_.begin() + explicit_outs_count,
                        ' ');
  }

  if (recursive_) {
    vector<string>::const_iterator it;
    if ((it = find(lookups_.begin(), lookups_.end(), var)) != lookups_.end()) {
      string cycle;
      for (; it != lookups_.end(); ++it)
        cycle.append(*it + " -> ");
      cycle.append(var);
      Fatal(("cycle in rule variables: " + cycle).c_str());
    }
  }

  // See notes on BindingEnv::LookupWithFallback.
  const EvalString* eval = edge_->rule_->GetBinding(var);
  if (recursive_ && eval)
    lookups_.push_back(var);

  // In practice, variables defined on rules never use another rule variable.
  // For performance, only start checking for cycles after the first lookup.
  recursive_ = true;
  return edge_->env_->LookupWithFallback(var, eval, this);
}

string EdgeEnv::MakePathList(vector<Node*>::iterator begin,
                             vector<Node*>::iterator end,
                             char sep) {
  string result;
  for (vector<Node*>::iterator i = begin; i != end; ++i) {
    if (!result.empty())
      result.push_back(sep);
    const string& path = (*i)->PathDecanonicalized();
    if (escape_in_out_ == kShellEscape) {
#if _WIN32
      GetWin32EscapedString(path, &result);
#else
      GetShellEscapedString(path, &result);
#endif
    } else {
      result.append(path);
    }
  }
  return result;
}

string Edge::EvaluateCommand(bool incl_rsp_file) {
  string command = GetBinding("command");
  if (incl_rsp_file) {
    string rspfile_content = GetBinding("rspfile_content");
    if (!rspfile_content.empty())
      command += ";rspfile=" + rspfile_content;
  }
  return command;
}

string Edge::GetDescription(bool force_full_command) {
  string description;
  if (!force_full_command)
    description = GetBinding("description");
  if (description.empty())
    description = EvaluateCommand();
  return description;
}

string Edge::GetBinding(const string& key) {
  EdgeEnv env(this, EdgeEnv::kShellEscape);
  return env.LookupVariable(key);
}

bool Edge::GetBindingBool(const string& key) {
  return !GetBinding(key).empty();
}

string Edge::GetUnescapedDepfile() {
  EdgeEnv env(this, EdgeEnv::kDoNotEscape);
  return env.LookupVariable("depfile");
}

string Edge::GetUnescapedRspfile() {
  EdgeEnv env(this, EdgeEnv::kDoNotEscape);
  return env.LookupVariable("rspfile");
}

void Edge::Dump(const char* prefix) const {
  printf("%s[ ", prefix);
  for (vector<Node*>::const_iterator i = inputs_.begin();
       i != inputs_.end() && *i != NULL; ++i) {
    printf("%s ", (*i)->path().c_str());
  }
  printf("--%s-> ", rule_->name().c_str());
  for (vector<Node*>::const_iterator i = outputs_.begin();
       i != outputs_.end() && *i != NULL; ++i) {
    printf("%s ", (*i)->path().c_str());
  }
  if (pool_) {
    if (!pool_->name().empty()) {
      printf("(in pool '%s')", pool_->name().c_str());
    }
  } else {
    printf("(null pool?)");
  }
  printf("] 0x%p\n", this);
}

bool Edge::is_phony() const {
  return rule_ == &State::kPhonyRule;
}

bool Edge::use_console() const {
  return pool() == &State::kConsolePool;
}

// static
string Node::PathDecanonicalized(const string& path, uint64_t slash_bits) {
  string result = path;
#ifdef _WIN32
  uint64_t mask = 1;
  for (char* c = &result[0]; (c = strchr(c, '/')) != NULL;) {
    if (slash_bits & mask)
      *c = '\\';
    c++;
    mask <<= 1;
  }
#endif
  return result;
}

void Node::Dump(const char* prefix) const {
  printf("%s <%s 0x%p> mtime: %d%s, (:%s), ",
         prefix, path().c_str(), this,
         mtime(), mtime() ? "" : " (:missing)",
         dirty() ? " dirty" : " clean");
  if (in_edge()) {
    in_edge()->Dump("in-edge: ");
  } else {
    printf("no in-edge\n");
  }
  printf(" out edges:\n");
  for (vector<Edge*>::const_iterator e = out_edges().begin();
       e != out_edges().end() && *e != NULL; ++e) {
    (*e)->Dump(" +- ");
  }
}

bool ImplicitDepLoader::LoadDeps(Edge* edge, string* err) {
  string deps_type = edge->GetBinding("deps");
  if (!deps_type.empty())
    return LoadDepsFromLog(edge, err);

  string depfile = edge->GetUnescapedDepfile();
  if (!depfile.empty())
    return LoadDepFile(edge, depfile, err);

  // No deps to load.
  return true;
}

bool ImplicitDepLoader::LoadDepFile(Edge* edge, const string& path,
                                    string* err) {
  METRIC_RECORD("depfile load");
  // Read depfile content.  Treat a missing depfile as empty.
  string content;
  switch (disk_interface_->ReadFile(path, &content, err)) {
  case DiskInterface::Okay:
    break;
  case DiskInterface::NotFound:
    err->clear();
    break;
  case DiskInterface::OtherError:
    *err = "loading '" + path + "': " + *err;
    return false;
  }
  // On a missing depfile: return false and empty *err.
  if (content.empty()) {
    EXPLAIN("depfile '%s' is missing", path.c_str());
    return false;
  }

  DepfileParser depfile;
  string depfile_err;
  if (!depfile.Parse(&content, &depfile_err)) {
    *err = path + ": " + depfile_err;
    return false;
  }

  uint64_t unused;
  if (!CanonicalizePath(const_cast<char*>(depfile.out_.str_),
                        &depfile.out_.len_, &unused, err)) {
    *err = path + ": " + *err;
    return false;
  }

  // Check that this depfile matches the edge's output, if not return false to
  // mark the edge as dirty.
  Node* first_output = edge->outputs_[0];
  StringPiece opath = StringPiece(first_output->path());
  if (opath != depfile.out_) {
    EXPLAIN("expected depfile '%s' to mention '%s', got '%s'", path.c_str(),
            first_output->path().c_str(), depfile.out_.AsString().c_str());
    return false;
  }

  // Preallocate space in edge->inputs_ to be filled in below.
  vector<Node*>::iterator implicit_dep =
      PreallocateSpace(edge, depfile.ins_.size());

  // Add all its in-edges.
  for (vector<StringPiece>::iterator i = depfile.ins_.begin();
       i != depfile.ins_.end(); ++i, ++implicit_dep) {
    uint64_t slash_bits;
    if (!CanonicalizePath(const_cast<char*>(i->str_), &i->len_, &slash_bits,
                          err))
      return false;

    Node* node = state_->GetNode(*i, slash_bits);
    *implicit_dep = node;
    node->AddOutEdge(edge);
    CreatePhonyInEdge(node);
  }

  return true;
}

bool ImplicitDepLoader::LoadDepsFromLog(Edge* edge, string* err) {
  // NOTE: deps are only supported for single-target edges.
  Node* output = edge->outputs_[0];
  DepsLog::Deps* deps = deps_log_->GetDeps(output);
  if (!deps) {
    EXPLAIN("deps for '%s' are missing", output->path().c_str());
    return false;
  }

  // Deps are invalid if the output is newer than the deps.
  if (output->mtime() > deps->mtime) {
    EXPLAIN("stored deps info out of date for '%s' (%d vs %d)",
            output->path().c_str(), deps->mtime, output->mtime());
    return false;
  }

  vector<Node*>::iterator implicit_dep =
      PreallocateSpace(edge, deps->node_count);
  for (int i = 0; i < deps->node_count; ++i, ++implicit_dep) {
    Node* node = deps->nodes[i];
    *implicit_dep = node;
    node->AddOutEdge(edge);
    CreatePhonyInEdge(node);
  }
  return true;
}

vector<Node*>::iterator ImplicitDepLoader::PreallocateSpace(Edge* edge,
                                                            int count) {
  edge->inputs_.insert(edge->inputs_.end() - edge->order_only_deps_,
                       (size_t)count, 0);
  edge->implicit_deps_ += count;
  return edge->inputs_.end() - edge->order_only_deps_ - count;
}

void ImplicitDepLoader::CreatePhonyInEdge(Node* node) {
  if (node->in_edge())
    return;

  Edge* phony_edge = state_->AddEdge(&State::kPhonyRule);
  node->set_in_edge(phony_edge);
  phony_edge->outputs_.push_back(node);

  // RecomputeDirty might not be called for phony_edge if a previous call
  // to RecomputeDirty had caused the file to be stat'ed.  Because previous
  // invocations of RecomputeDirty would have seen this node without an
  // input edge (and therefore ready), we have to set outputs_ready_ to true
  // to avoid a potential stuck build.  If we do call RecomputeDirty for
  // this node, it will simply set outputs_ready_ to the correct value.
  phony_edge->outputs_ready_ = true;
}


For this recipe, we had the pleasure of joining forces with our pal Kirby from Leisure Fan Club for a guest post. Kirby is an LA based food, travel and lifestyle blogger. Her blog, Leisure Fan Club is a creative outlet to supplement her decidedly uncreative day job. It's her way of making time to focus on the things she loves whilst trying to inspire others to do the same. To follow along on her adventures, or to see pictures of her cute dogs, check out her Instagram or Facebook page.
A good cornbread recipe is essential for Fall. It's comfort food at its finest, but it can also be bright and summery, which makes it perfect for transitioning from Summer to Autumn. This particular cornbread recipe boasts lots of versatility. I've personally used it as a grab-and-go breakfast, a camping side dish, and a decadent dessert. It can be dressed up with fresh fruit, a pat of butter, honey, or even hot sauce. In a stroke of genius, I drizzled one of these cornbread muffins with a touch of hot honey that I infused with jalapeño, and it was a true delight. Sweet, but with a peppery kick! Here's the hot honey recipe if you want to follow suit.
Now I'll continue to wax poetic about cornbread. This simple and perfectly balanced recipe is one you'll want to keep in your back pocket as a base you can adapt for any occasion. Or you can just make it the same way every time. It's your life.
This variation uses fresh figs for a striking look and a little added sweetness. I'm obsessed with figs and think their beauty and flavor is an asset to almost any dish, so it was a no brainer. These simple figgy cheesy cornbread muffins would be a welcome addition to any Thanksgiving spread, but if you can't find figs, or just don't care for them, feel free to omit or replace them with another fruit of your choosing! If you do include the figs, I'd recommend finishing off your muffins within a couple of days, as they're delicate creatures who won't last forever. Either way, you'll want to store them in the fridge if you can stop yourself from eating them all immediately.
Start by preheating your oven to 400°F. Then add the cornmeal, flour, sugar, baking powder and salt in a large bowl and whisk until combined. In a separate bowl, mix the milk, eggs and butter together. Then incorporate this into the dry ingredients.
Next, gently fold in the parmesan cheese, followed by the corn kernels.
Line or grease a muffin pan and distribute the batter evenly into each slot. You'll want to stop when they're about 3/4 of the way full. For me, this meant 3 tbsp per muffin.
Place one sliced fig on top of each muffin and bake for 14-16 minutes, or until you can stick a toothpick through the center of one of the muffins and remove it cleanly.
Put the cornmeal, flour, sugar, baking powder and salt in a large bowl and whisk until combined.
In a separate bowl, mix the milk, eggs and butter together. Then incorporate this into the dry ingredients.
Gently fold in the parmesan cheese, followed by the corn kernels.
This entry was posted in Recipes, Uncategorized and tagged bakeware, cookware, cornbread, enamelware, fall, muffin tin, recipe, thanksgiving.


Located in the Hidden Springs Resort, Bear Essentials boasts a log interior, beautiful hardwood floors, and classic cabin décor, along with access to community perks. Enjoy year-round fun at the community pool or relax in the outdoor hot tub at your cabin. The 1-bedroom, 1-bathroom cabin is perfect for a romantic getaway or a family vacation, with a king-size bed, high-speed wireless internet, big screen HDTVs, an indoor jetted tub, and room for 4 guests. Enjoy the security of a gated log cabin community, the peace of wooded views, and the amenities of your own semi-private cabin. It's also less than 6 miles from downtown, so you can hop in the car and take the short drive to nearby restaurants, shops, and family-friendly attractions!
Offering a homey yet lodge-style feel, the spacious living room of Bear Essentials is the perfect place to relax after those long days of exploring downtown. Above the stone gas fireplace is a 46-inch HDTV with satellite where you can watch your favorite shows or ballgames. The comfy queen sofa sleeper (new in Spring 2018) sits next to a cozy leather recliner– 2 great places to kick back and relax on a cool Smoky Mountain evening. Keep snacks and drinks nearby or play some cards and board games on the spacious coffee table in the center of the room.
As you play and relax, stay warm by the fire or flip on the ceiling fan to stay cool. A large window frames the wooded views and allows for some natural light to flow in – great for enjoying sunny mountain days. A deer and fish are mounted above the fireplace, and an antler lamp provides the perfect reading light from where it sits on the side table by the sofa. On the days when you just don't feel like leaving the cabin, you'll appreciate the comfort and homey atmosphere this space provides. And with an open-concept layout, guests can visit while cooking, relaxing, and dining. If you need some extra sleeping space, take advantage of the queen-size sleeper sofa located here.
Just off the living area is the fully equipped kitchen, offering everything you need to make meals or whip up snacks for while you're around the cabin. The elegant kitchen boasts brand new full-size stainless steel appliances, and the tools and essentials you need – coffeemaker, toaster, knives, dishes, glasses, and utensils – for romantic dinners or family meals here. If you don't feel like cooking, order our romantic dinner for two, which includes all the ingredients you need for a candlelit dinner, all waiting for you when you arrive in the cabin. Just toss the steaks on the grill, bake the potatoes in the oven, and enjoy a beautiful and delicious dinner for two. Or you can visit one of the Pigeon Forge dinner shows such as the Lumberjack Feud or Hatfield & McCoy for a hearty dinner and great entertainment, leaving the cooking to someone else.
Enjoy in-cabin meals at the lovely dining table in the kitchen. The elegant round table is surrounded by four iron chairs and offers a nice place to have meals. Cooking and eating in the cabin is a great way to get some extra quality time with the ones you love. The table is also the perfect spot for a romantic meal as a couple. It's conveniently located between the kitchen and the living area, so you can fill the table with game-day snacks or easily get up for seconds during your big Southern breakfast.
With vaulted ceilings and large windows that frame beautiful wooded views, the master suite is a peaceful retreat for couples to relax and unwind. A mountain-themed handcrafted quilt, shams, and pillows adorn the king-sized bed. Enjoy the mattress (new in Fall 2016), which features Comfort Right™ layers of support, integrated Cool Balance™ technology for improved sleeping temperature, and a TrueSense™ design to reduce motion transfer from one partner to the other. A large window above the indoor jetted tub looks out over the hot tub and the wooded view. With your own door to the deck, you'll have easy access to the hot tub there. The cozy suite also boasts a 32-inch HDTV with DVD player, a dual-sided fireplace, and a dresser where you can unpack.
For a truly relaxing night, add one of our gift baskets to your stay. Just imagine having a bubble bath in the oversized jetted tub at night as you have a movie night, listen to your favorite music on the CD player/radio, or just enjoy the peacefulness of the Great Smoky Mountains. Keep phones and tablets handy on the nightstand or flip on the bear lamp so you can read late at night. This bedroom also offers its own bathroom, so you can enjoy plenty of privacy as you get ready for bed or prepare to hit the town. It features plenty of counter and storage space, a hair dryer, a makeup mirror, and a vanity stool that makes getting ready a breeze. This semi-private retreat will make you want to sleep in late and head to bed early. And with so many wonderful amenities right in the room, it will be easy to stay here for hours.
The outdoor spaces at Bear Essentials are just as impressive as the interiors. The mild weather and beautiful scenery are two major reasons that people visit the Great Smoky Mountains. You'll definitely want to take advantage of the outdoor areas during your time here. From the covered deck, enjoy wooded views that will make you feel nestled high in the tree tops.
On cool evenings, or after a long day of hiking in the national park, take it easy as you soak your cares away in the 4-person hot tub on the covered deck. Because it's covered, you can enjoy it rain or shine. It even features a step that will make getting in and out easier and a natural privacy screen of foliage. Just pour yourself a glass of wine and spend some time unwinding.. What a romantic way to end the night!
In the mornings, start your day with a cup of coffee as you sit in the log-style deck furniture. Kick off your shoes and rest your feet on the bear rug here. Around the other side of the cabin, fire up the charcoal grill for a cookout on a nice day. As you grill, the wooded surroundings and authentic log exterior will give you the Smoky Mountain experience you've been seeking.
Bear Essentials also offers a CD player, DVD player, satellite TV, high-speed wireless Internet, and a hair dryer. Offering easy arrivals, the cabin also boasts paved parking and a community snow plow/salt truck that creates better driving conditions in winter. The washer and dryer and iron and ironing board are more perks, making longer stays that much easier. After a day of hiking or before a night out on the town, toss in a load of laundry for some fresh clothes. As guests of the Hidden Springs Resort, you'll enjoy access to the enclosed heated swimming pool – for fun no matter the weather – and free high-speed Internet poolside!
Whether planning a romantic weekend or a fun family getaway, Bear Essentials puts you close to everything the Smoky Mountains has to offer. Spend days playing and relaxing around the cabin or head to the community pool to get some sun, float, or splash around. This beautiful Pigeon Forge cabin will feel like home, but it will offer all the amenities you seek in a mountain getaway. It's just a few miles from downtown Pigeon Forge, keeping you near all the action.
Enough for an entire day of fun, LazerPort Fun Center features laser tag, the largest arcade in the Smokies, go karts, and blacklight miniature golf! Grab some ice cream at the Sweet Sensations Ice Cream Parlor before playing games in the 5,000-square-foot arcade.
The incredibly detailed and life-like wax figures at this Pigeon Forge attraction will blow you away. You can pose with the celebrities, play trivia games, and pick up some great Hollywood-themed souvenirs in the gift shop.
"Very clean ...has the cozy feel to it .. will be returning!"


So I did something pretty neat this past weekend: I knew even as mass was going on (all two hours of it) that it would be too much, too many emotions for me to blog about. So I'm not going to.
Well, I'm sort of not, or rather I wouldn't have, if the next morning I hadn't listened to a video clip. One of the notes I was singing in the clip was under pitch. It was a note that I knew had a tendency to go flat, and I didn't pay close enough attention and the damn thing fell all out of tune.
So the morning after one of the most wonderful experiences of my life, after receiving countless compliments and feeling great pride and having my Attention-Craving-Extrovert meter go way past eleven, I spent hours obsessing over one funny note.
The moral of the story is singers are crazy, and in a way everyone is crazy because we blast ourselves over tiny flaws even when the big picture is very beautiful. At least, I thought that was the moral of the story, but if it were, I wouldn't be writing about it now, because that's an old stupid story and no one needs me to retell it.
Many wise musicians before me have advised that one should not worry about individual notes or flubs if the overall effect is musical. I try to take that to heart. What happened on Saturday at Fenway Park was certainly musical, and I take pride in that.
But the pride isn't mine alone. What we did at liturgy was musical not because the brass was in tune or the levels on the mics were set right or because I was properly warmed up. It was musical because everyone was working together: bishops and priests and young singers and faculty Eucharistic Ministers and all those assembled.
It is very rare that I make music all by myself. It is very rare that I accomplish anything of value by myself. I make music when the Spirit swirls my gifts together with everyone else's, and our love and commitment and beauty become something new in a certain place and time. So it doesn't matter what I do, it matters what we do. And we made music last weekend.


Annapurna is a beautifully written love story about the long lost romance between soul mates, Ulysses and Emma. They explore how they have each changed and what has changed between them in their 20 years of separation. Will they be able to fix what was destroyed so long ago? Can the time apart be enough to face the depths of denial and forgive what is past? Founding Artistic Director, Joe Canuso will direct Philadelphia favorites Pearce Bunting (HBO's Boardwalk Empire, Theatre Exile's A Behanding in Spokane) and Catharine Slusar (Theatre Exile's Iron, Any Given Monday) in the intimate Studio X.
Founded in 1996 by Joe Canuso and Trish Kelly, Theatre Exile was created by a group of artists who wanted to rattle the gates of the mainstream. Drawn to plays that explore the complexities of the human condition and contain a sense of true Philadelphia grit and passion, Exile has produced 54 full-scale productions, including 14 world and 25 Philadelphia premieres. They were the first Philadelphia organization to produce such powerhouse playwrights as Pulitzer Prize and Tony winner Tracy Letts, Noah Haidle, Rona Munro, David Harrower, Annie Baker and Rajiv Joseph. For their excellence in producing theatre, they have received 49 Barrymore Award nominations, with six awards total. Theatre Exile believes in freedom of expression formulated through innovation, exploration and provocation, all while providing a safe and creative environment, in which local artists can grow, experiment and ultimately, find their own voice.
PHILADELPHIA– Theatre Exile closes its 17th season with the Philadelphia premiere of Annapurna, a moving and explosive new play by critically acclaimed, emerging Broadway playwright Sharr White.


Your Club Winnings are calculated based on when you joined a Punters Club and the Betting Rounds.
Your Winnings are based on how much your Contributed to the Punters Club. If you entered a Club after activation then the amount you contributed will be less.
This means that your Winnings will be based on when you entered the Club. You are only eligible for Winnings from the point you joined the Club.
Contributed less than what the Rules stated?
You may have joined a Club after activation. Find out how your Contribution is calculated.


James Rawlings is a citizen of Sweden, the United States, and United Kingdom currently studying at the Moscow State Institute of International Relations in the Politics and Economics in Eurasia programme. He is a political science graduate of the University of Illinois at Urbana Champaign, with emphasis on security, economics, and US politics. His particular field of interest is security in the Baltic region, following the development of the region and its transformation from being an area of low geopolitical tension, to one of the most dynamic focal points in the interaction between Russia and the West. He also has a deep interest in both Russian and US politics and foreign policy, especially US-Russia relations. This blog will deal with a wide range of issues, but will primarily concentrate on issues pertaining to the Baltic region, broader challenges between Russia and the West, as well as relations between the United States and Russia.


text:
    <title>
     Mathematicians' Introduction to  Macaulay2
    </title>

    We assume you've installed \(\mac\) and can type

    on a command line to bring up the program. You should see something like:

    We suggest you do that now, so that you can experiment while you read
    this tutorial!

Arithmetic with integers, rings and ideals

    You can immediately do arithmetic with integers:

2+2

107*431

25!

binomial(5,4)

factor 32004

    Most \(\mac\) applications involve polynomial rings over fields
    and their quotient rings. Fields can be made in various ways:

ZZ/101

QQ

GF 2^5

k = toField (QQ[i]/(i^2+1))

    After making \({\tt k}\) we can compute in it:

1/i

    Computation is often fastest and needs least
    memory when performed over finite prime fields of the form
    $\ZZ/p$.
    Fortunately, when the characteristic $p$ is not too small,
    qualitative questions often have similar answers over
    $\ZZ/p$ and over $\QQ$, so we mostly use the former.
    In \(\mac\) the prime $p$ can be up to 32 bits long.

    We make a polynomial ring in 5 variables over $\ZZ/101$:

kk=ZZ/101

S=kk[x_1..x_5]

    Here is another way:

S=kk[a,b,c,d,e]

    One can do arithmetic on polynomials:

(3*a^2+1)^5

    We make an ideal in $S$:

I=ideal(a^3-b^3, a+b+c+d+e)

    Using this ideal, we can make a factor ring:

R=S/I

    Another way to make an ideal, with more compact notation (familiar to anyone who used the
    classic Macaulay) is:

use S

I=ideal"3(a+b)3, 4c5"

    Note the command "use S", which specifies
    that we want to work with the generators of the polynomial ring $S$ again;
    otherwise the variables $a$, $b$, and $c$
    would still have had values in $R$ instead of in $S$.

    Algebraic operations on ideals are available:

I^2

I*I

I+ideal"a2"

    In case you forget any of these things, \({\tt help}\) is available! The most
    useful way to get it is often to type something like:

viewHelp ideal

    Then a browser window will pop up that contains documentation about the function
    \({\tt ideal}\) that we've been using; links on that page allow one to explore
    all of the \(\mac\) documentation.

    On the other hand, we might have wanted information about the \({\tt class}\) of all ideals.
    Not too surprisingly, this class is called \({\tt Ideal}\). We could get information about
    what functions create or use ideals by typing:

viewHelp Ideal

    To see the names of classes, you can begin by looking at the output
    of commands; the second line output (the one introduced by a colon) often contains the name of the
    class of the result.

    Here are some basic operations on matrices:

M = matrix{{a,b,c},{b,c,d},{c,d,e}}

M^2

determinant M

trace M

M-transpose M

    The function \({\tt entries}\) gives the entries of a matrix:

entries M

    The result is a list of lists, one for each row of the matrix $M$.
    The function \({\tt flatten}\) can be used to merge the
    lists into a single list:

flatten entries M

    If you want a particular entry, say the one in the upper left corner,
    you can use the underscore operator.

M_(0,0)

    Here, as everywhere in \(\mac\), all indexing starts with 0.
    For example:

I_0

    is the first generator of I. You can list all the generators with:

I_*

    A \({\it module}\) can be defined as a cokernel, kernel, image, or even as a subquotient:

coker M

image M

kernel matrix"a,b,0;0,a,b"

N = matrix{{a,b},{b,c},{c,d}}

(image M)/(image N)

subquotient(M,N)

    Note that the matrix $N$ above was defined with an
    alternate syntax, parallel to the alternate syntax for \({\tt ideal}\).

    Before going on, the reader might want to explore a bit. A good place to
    start is the top of the documentation tree, which can be reached, for
    example, by typing:

viewHelp "Macaulay2Doc"

Properties of ideals and modules

    To compute the Gröbner basis of an ideal
    $(x^2y,xy^2+x^3)$ in the polynomial ring in
    four variables we proceed as follows.
    First we make our favorite field:

kk = ZZ/32003

    Then the polynomial ring:

R = kk[x,y,z,w]

    And then the ideal:

I = ideal(x^2*y,x*y^2+x^3)

    Now the punch line.  We compute the Gröbner basis with the \({\tt groebnerBasis}\) function:

J = groebnerBasis I

    Gröbner bases are always computed with respect to a particular
    monomial order on the ring. In fact, the ring we defined above has
    a default monomial order, the graded reverse lex order. For many
    other possibilities, see \({\tt MonomialOrder}\):

viewHelp MonomialOrder

    The analogue of factorization in the theory of ideals
    is primary decomposition.
    For example, we can begin by intersecting three ideals:

I= intersect (ideal"x2,y3", ideal"y2,z3", (ideal"x,y,z")^4)

    We can almost undo this operation by computing
    a primary decomposition:

primaryDecomposition I

    Inspecting the output, we see that the first two ideals
    are the same as the first two ideals we intersected, but the
    third one differs from the corresponding input ideal.
    This is because only the primary components corresponding
    to minimal primes (here, the first two) are unique. All three of the input ideals
    are primary, so they constitute a primary decomposition of $I$
    different from the one provided by \(\mac\) on the output line.

    For larger examples, primary decomposition is computationally challenging!
    Sometimes it is easier to compute just the minimal primes. To do
    this we can use \({\tt decompose}\):

decompose I

    Using Gröbner bases we can compute
    codimensions, dimensions,
    degrees, Hilbert
    functions, and Hilbert polynomials.
    This will be more fun if we work with a
    meaningful example.  We will use
    the ideal defining the smooth
    rational quartic curve in $\PP^3$ given
    parametrically (in an affine representation)
    by $$t \mapsto{} (t,t^3,t^4).$$
    (The reader more interested in algebra than geometry
    may simply treat the ideal given below as a
    gift from the gods.)
    First we make the
    polynomial ring in 4 variables, to serve as the
    homogeneous coordinate ring of $\PP^3$:

R = kk[a..d]

    We introduce the ring map $\phi: R \to kk[s,t]$ defined by
    $(a,b,c,d) \mapsto{} (s^4, s^3 t, s t^3, t^4)$:

phi = map(kk[s,t],R,{s^4, s^3*t, s*t^3, t^4})

    Here the syntax of the function \({\tt map}\) has the target ring first and the source ring second:
    maps in \(\mac\) generally go from right to left!
    The last input to the command is a
    list of the elements to which to send the variables of the source ring.
    The ideal we want is the kernel of this map:

I = ker phi

    Shortcut notation for this construction is provided by the function
    \({\tt monomialCurveIdeal}\):

I = monomialCurveIdeal(R,{1,3,4})

    We can compute the \({\tt dimension}\), \({\tt codimension}\) (also called the
    height) and \({\tt degree}\) of this ideal:

dim I

codim I

degree I

    The Hilbert polynomial is obtained with the function \({\tt hilbertPolynomial}\):

hilbertPolynomial(R/I)

    The output above may not be what the user expected:
    the term ${\bf P}_m$ represents the Hilbert polynomial of
    projective $m$-space.  Thus the output tells
    us that the Hilbert polynomial of $M$ is
    $i \mapsto{} -3*1+4*(i+1) = 4i + 1$.  Thus the degree
    is four, the dimension of the projective variety
    that is the support of $M$ is 1 (and so the affine
    dimension is 2), and the (arithmetic) genus is 0 (obtained as 1 minus the
    constant term of the polynomial.)

    The more usual expression for the Hilbert polynomial can
    be obtained as follows:

hilbertPolynomial(R/I, Projective => false)

    The construction "Projective => false" is our first example of
    an \({\it option}\) to a function: we specified that the option
    \({\tt Projective}\) was to have the value \({\tt false}\).
    The form we used first could also have been written this way:

hilbertPolynomial(R/I, Projective => true)

    The Hilbert series of $M$ (the generating function
    for the dimensions of the graded pieces of $M$) is
    obtained with:

hilbertSeries (R/I)

    This generating function is expressed
    as a rational function with denominator equal to $(1-T)^n$, where
    n is the number of variables in R.
    Since $R/I$ has dimension 2, it can also be written
    with denominator $(1-t)^2$. To see it in this form, use \({\tt reduceHilbert}\):

reduceHilbert hilbertSeries (R/I)

    It is possible to manipulate the numerator and denominator of this
    expression. To learn how to do so, see \({\tt hilbertSeries}\):

viewHelp hilbertSeries

    A great deal of subtle information about a module is visible using
    free resolutions. For an example, we begin
    by turning $R/I$ into a module. Here the code \({\tt R^1}\) produces the free module of
    rank 1 over $R$, and \({\tt res}\) computes a free resolution:

M=R^1/I

Mres = res M

    To get more precise information about \({\tt Mres}\),
    we could compute its Betti table with \({\tt betti}\):

betti Mres

    The display is chosen for compactness. Each column of the
    table corresponds
    to a free module in the resolution. The column's heading
    specifies the \({\it homological\ degree}\) (the position of the free
    module in the resolution).
    The entry just below the homological degree
    is the rank of the free module, also called the
    \({\it total\ betti\ number}\). The remaining entries in the column
    tell us how many generators of each degree this free
    module has: the number in the column labelled $j$ and in the row labelled $d$
    tells how many generators of degree $j+d$ the $j$-th free module has.
    Thus, in our case, the single
    generator of the third (and last) free module in the
    resolution has degree $3+2=5$.

    Commonly computed homological invariants
    such as projective dimension and regularity
    are (also) available directly:

pdim M

regularity M

Division With Remainder

    A major application of Gröbner bases is
    to give the normal form for an element modulo an
    ideal, allowing one, for example, to decide whether
    the element is in the ideal.
    For example, we can decide which power of the trace
    of a generic 3x3 matrix is expressible in terms of the entries of the
    cube of the matrix with the following code:

R = kk[a..i]

M = genericMatrix(R,a,3,3)

I = ideal M^3

    This gives the ideal of entries of the matrix. In the expression
    "M = genericMatrix(R,a,3,3)" the arguments \({\tt R,a,3,3}\) specify the
    ring, the first variable to use, and the numbers of rows and columns
    desired.

Tr = trace M

for p from 1 to 10 do print (Tr^p % I)

    The expression $Tr^p \% I$ computes the normal form for the $p$-th power
    of the trace \({\tt Tr}\) with respect to the Gröbner basis of $I$.
    The expression "for p from 1 to 10 do" specifies a
    \({\it for\ loop}\) that executes the following expression, "print (Tr^p % I)",
    with 10 consecutive values of $p$. For more information on such loops see \({\tt for}\)
    or type:

viewHelp "for"

    Here we have put quotes around "for" because
    "for" is a keyword in the \(\mac\) language.  (In general, it's always safe to use
    quotes with viewHelp.)

    We see from the output of these commands that the 6-th power
    of the trace is NOT in the ideal of entries of the cube of M,
    but the 7-th power is. We can compute the coefficients in the expression for it
    using the division algorithm, denoted in this setting by
    \({\tt //}\):

Tr^7//(gens I)

Elimination Theory

    Consider the problem of projecting the
    twisted cubic, a curve in $\PP^3$ defined
    by the three $2 \times{} 2$ minors of a certain
    $2 \times{} 3$ matrix.
    We already have the simplest tools for solving
    such a problem.
    We first clear the earlier meaning of $x$
    to allow it to be used as a subscripted variable:

x = symbol x

    Since we are going to deal with a curve in $\PP^3$,
    we begin with a polynomial ring in four variables:

R = kk[x_0..x_3]

    The ideal of the twisted cubic curve is generated by the $2 \times{} 2$
    minors of a "catalecticant" or "Hankel" matrix, conveniently
    defined as follows:

M = map(R^2, 3, (i,j)->x_(i+j))

I = minors(2,M)

    As projection center we
    take the point with homogeneous coordinates $(1,0,0,-1)$,
    which is defined by the ideal:

pideal = ideal(x_0+x_3, x_1, x_2)

    The ideal $J$ of the image of the curve under the projection from this point
    is the kernel of the ring map $S=kk[u,v,w] \to R/I$
    sending the variables
    of S to the generators of \({\tt pIdeal}\),
    regarded as elements of $R/I$.  This is the same as the more usual formulation:
    $$J = I \cap{} kk[x_0+x_3, x_1, x_x]$$
    To compute this we first substitute \({\tt pIdeal}\) into $R/I$, and then form
    the necessary ring map:

Rbar = R/I

pideal = substitute(pideal, Rbar)

S = kk[u,v,w]

J=kernel map (Rbar, S, gens pideal)

    The ideal $J$ defines a curve with one singular point.
    We can compute the ideal of the singular locus with:

K = ideal singularLocus(J)

    This doesn't look like the ideal of a reduced point! But
    that's because it isn't yet saturated:

saturate K

    We have just seen the \({\tt saturate}\) function in its most
    common use: to saturate with respect to the maximal ideal.
    but we can also find the saturation of any ideal with
    respect to another:

saturate (ideal"u3w,uv", ideal"u")

    We can also take the \({\it ideal\ quotient}\) $I:J$ of an ideal $I$ with
    respect to another, $J$
    defined as the set of elements $f$ such that
    $fJ$ is contained in $I$:

ideal"u3w,uv":ideal"u"

Defining functions and loading packages

    It is easy to define your own functions in \(\mac\), and this
    can save a lot of typing. Functions are defined with the
    symbol ->. For example, the famous \({\it Collatz\ Conjecture}\)
    (also called the "hailstone problem") asks
    about the following procedure: given an integer $n$, divide it
    by 2 if possible, or else multiply by 3 and add 1.
    If we repeat this over and over,
    does the process always reach 1?  Here is a function that
    performs the Hailstone procedure again and again,
    producing a list of the intermediate results.

<codeblock>Collatz = n ->
    while n != 1 list if n%2 == 0 then n=n//2 else n=3*n+1</codeblock>

    For example:

Collatz 27

    If you don't understand this code easily, see:

viewHelp Function

viewHelp "while"

    In order to understand a process it is often useful to tabulate the
    results of applying it many times. One feature of the Collatz process
    is how many steps it takes to get to 1. We can tabulate this statistic
    for the first 25 values of n with the function \({\tt tally}\), as follows:

tally for n from 1 to 30 list length Collatz n

    A line of the form

    in the result means that a Collatz sequence of length 18
    was seen 3 times.
    To see the successive "record-breakers",
    that is, the numbers with longer Collatz sequences than any
    number before them, we might try:

record = length Collatz 1

<codeblock>L = for n from 2 to 1000 list (
        l := length Collatz n;
        if l > record
          then (record = l; (n,l))
          else continue)</codeblock>

    If you want to see a list of just the successive records,
    you can apply the
    function \({\tt last}\) to each element of the list $L$.
    A convenient way to do this is with this syntax:

L/last

    Note that in
    writing functions of more than one expression (usually
    there's one expression per line), the expressions must be
    separated by semicolons. For example in the "for" loop
    above, the first expression was \({\tt l = length\ Collatz\ n}\).
    After the last expression of an input line or of a function body,
    a semicolon suppresses output, useful when the output
    would be large.

    There are many packages of ready-made functions available for
    your use, many written by other users (perhaps you'll contribute one
    someday!) A list of installed packages can be found with:

viewHelp "packages provided with Macaulay2"

    For example, there is a package called \({\tt EdgeIdeals}\).
    To load the package, use:

needsPackage "EdgeIdeals"

    After loading it, you can view its documentation with

viewHelp EdgeIdeals

    or you can call its functions,
    such as \({\tt randomGraph}\) and \({\tt edgeIdeal}\):

R = kk[vars(0..10)]

G=randomGraph (R,20)

K=edgeIdeal G

hilbertSeries K

betti res K

    When testing a conjecture  one sometimes wants to run a
    large number of randomly chosen
    examples.
    Here's some typical code that one might use to study
    a random graph ideal.  First we use "for ... list ..." to construct a list $L$
    and suppress its printing by ending the line that creates
    it with a ";".  Each entry of $L$ is a triple consisting of the
    codimension, degree, and Betti table of a random graph ideal
    on 10 vertices having only 4 edges.

R = ZZ/2[vars(0..10)]

<codeblock>L=for j from 1 to 100 list(
    I = edgeIdeal randomGraph (R,5);
    (codim I, degree I, betti res I));</codeblock>

    We can use \({\tt tally}\) to find out how many examples
    were found with each combination of codimension and degree and Betti table.

tally L

    We can determine how many distinct patterns were found:

#tally L

Ext, Tor, and cohomology

    \(\mac\) can compute the homology of complexes;
    for example, let's compute the homology of a
    Koszul complex that is not a resolution:
    $$ {\bf K}(x^2, x y^2):\ \  0 \rightarrow{} S(-5) \rightarrow{} S(-2)\oplus S(-3) \rightarrow{} S \rightarrow 0 $$
    The free module $S(-2) \oplus{} S(-3)$ can be defined with this
    syntax:

S^{-2,-3}

    Here is how we can define the maps in the Koszul complex:

S = kk[x,y]

phi1 = map(S^1, S^{-2,-3}, matrix"x2,xy2")

phi2 = map(S^{-2,-3}, S^{-5}, matrix"xy2;-x2")

    Let's check that this is will really make a complex:

phi1*phi2

    To get the homology we can, for example compute:

(ker phi1)/(image phi2)

    We could also use the data type \({\tt ChainComplex}\)
    and use a built-in facility to take homology (in our case $H_1$):

FF = chainComplex(phi1,phi2)

FF.dd

homology FF

presentation (homology FF)_1

    Either way, the first homology is $((x^2):(xy^2)) / (x^2) \cong{} S/(x)$, in accord
    with general theory.

    There are other ways to construct Koszul complexes.  One way is as the tensor product of
    chain complexes of length 1:

FF = chainComplex matrix {{x^2}} ** chainComplex matrix {{x*y^2}}

FF.dd

    Another way is by using the function \({\tt koszul}\), designed for that purpose:

FF = koszul matrix {{x^2, x*y^2}}

FF.dd

    Since \(\mac\) can compute resolutions and homology, it can
    compute things such as $Ext$, $Tor$ and sheaf cohomology, as in the
    following examples. The first uses Serre's formula to compute
    the multiplicity with which a 2-plane meets the union
    of two 2-planes in 4-space (this is the first case in which
    the length of the intersection scheme is NOT the right answer.)
    The notation "M**N" denotes the tensor product $M \otimes_S N$ of the modules $M$ and $N$.
    We use the syntactical forms
    "for j from 0 to 4 list ..." to list some results and
    "sum(0..4, j -> ...)" to sum some results.

S=kk[a,b,c,d]

IX = intersect(ideal(a,b), ideal(c,d))

IY = ideal(a-c, b-d)

degree ((S^1/IX) ** (S^1/IY))

for j from 0 to 4 list degree Tor_j(S^1/IX, S^1/IY)

sum(0..4, j-> (-1)^j * degree Tor_j(S^1/IX, S^1/IY))

    Similarly, we can compute Hom and Ext:

Hom(IX, S^1/IX)

Ext^1(IX, S^1/IX)

    or the cohomology of the sheaf associated to a module.

    Here is how to compute
    the first cohomology of the structure
    sheaf twisted by $-2$ of the curve $Proj(S/IX)$, which
    in this case is the disjoint union of two
    lines in $\PP^3$:

HH^1 (sheaf (S^{-2}**(S^1/IX)))

redpajama_set_name: RedPajamaGithub


Try this Easy Bread Pudding recipe tonight. Flavored with chocolate, cinnamon and brown sugar, there's a lot to love about this Easy Bread Pudding recipe.
Beat reduced-fat cream cheese and sugar in large bowl with mixer until well blended. Add egg whites and cinnamon; mix well. Gradually beat in milk until well blended.
Place bread in 8-inch square baking dish; top with chocolate and cream cheese mixture.
Bake 30 to 35 min. or until center is set. Cool slightly.
Top dessert with 1/2 cup thawed COOL WHIP LITE Whipped Topping just before serving.
We've took a classic chocolate bread pudding and gave it a makeover. We used fat-free milk instead of whole milk, decreased the amount of chocolate, and used egg whites instead of whole eggs. We also added PHILADELPHIA 1/3 Less Fat than Cream Cheese to the milk mixture to create a creamy texture. Not only does this warm pudding taste great, but it also saves you 40 calories and 4 g of fat per serving when compared to the classic recipe.


text:
Substantial feedback provided during Town Hall sessions will…
Substantial feedback provided during Town Hall sessions will help guide future drafts of Sexualized Violence Policy
Students, staff and faculty members at Brandon University (BU) have provided significant and valuable feedback during the first round of wide community consultation on a new, stand-alone sexualized violence policy.
"What came through loud and clear was that people want this policy, they want it to be as strong as it can be, and they are eager to help us at the university as we work towards that goal," said Carla Navid, BU's Sexual Violence Education and Prevention Coordinator. "Not only have people been very engaged in going carefully through this draft and identifying areas of improvements, we have had a lot of very constructive and positive suggestions to help improve those areas, adding clarity and nuance. It has been a thoroughly satisfying series of Town Halls."
Navid sits on BU's Sexual Assault Advisory Group (SAAG), a large standing committee that drew together a cross-section of the campus along with wider community experts to develop the new, stand-alone sexualized violence policy. After targeted feedback from staff, students, faculty and community experts, SAAG published the draft online and invited everyone to come to three open Town Hall sessions this month.
"This is just one round of the consultations that we have planned," said BU Vice President (Academic & Provost) Dr. Steve Robinson, who is chair of SAAG. "We will be conducting small focus groups and reaching out to more community experts as we respond and revise this draft. And of course, everyone is welcome to read and comment on the policy online, where feedback can also be sent completely anonymously."
The draft policy, along with related information about combatting and preventing sexualized violence, is available at BrandonU.ca/SexualViolence. The online feedback tool has already proven to be a popular way to submit detailed and valuable suggestions, Navid says.
"I have been very impressed with the thought and care that has been evident in all of the submissions we've received — both in person and online," she said.
Common feedback has included a desire for even more engagement with off-campus community resources, and a renewed focus on the nuts and bolts of procedure and process.
"We will certainly be reaching out to more groups in the community who have said they want to be involved, and we hope that the Brandon University experience can help set the standard for an approach to sexualized violence that works everywhere," Navid said. "This policy is our foundation, and we need it to be as solid and secure as possible as it will guide the development of our protocol."
Based on the policy, which will capture the university's overall commitment to combat sexualized violence, SAAG will work to develop a protocol with detailed procedures and process for BU community members to follow.
"The policy is our values, it tells us why our approach is important. The protocol is what we do: Who talks to whom, and when," Navid said. "We have a good interim protocol in place that is also available online, and that is a good guide for us right now. Also, based on our draft policy and all the feedback that's come in so far, we are working to develop a new protocol, and we will be proud to take that for wide community consultation as well."
Over the next few weeks, SAAG will assemble and discuss all the feedback that has been received for the draft policy, and will develop a second draft policy, paired with a draft protocol. A further round of consultations is expected early in the new year.
Dr. Steve Robinson
Vice President (Academic & Provost)
RobinsonS@BrandonU.ca
Grant Hamilton
HamiltonG@BrandonU.ca

redpajama_set_name: RedPajamaCommonCrawl


Having arrived at Winters, Jeff reunites with his father at long last. Of course, knowing Dr. Andonuts' track record of following his son's life, the result is...less than joyous.
Although Dr. Andonuts is not much of a family man, he still does care for those around him. Especially neanderthals that just happen to share their jerky with him.
With a sudden bit of down time, what better thing to do than go check out a couple of the world's greatest wonders?
With Jeff's return to Winters comes a number of reunions. Some may be important, but perhaps the greatest of all is when a boy and his giant killer mushroom meet again after being separated for so long.


Before you can begin to taste the wonders of the wine you have purchased, you need to open the bottle. The bottlings generally break down into two categories, Still Wine and Sparkling Wine. First I will discuss how to open the bottle, then we can get to enjoying the wine.
1. Cut around the top of the bottle to remove enough of the metal/tin/plastic foil so that there will be no metal/material touching the wine when poured.
2. Hold your wine opener straight and twist the corkscrew through the cork, clockwise, taking care not to go all the way through the cork.
3. Pull the cork out gently, attaching the bottle opener lever to the edge of the bottle to help in the process.
1. Chill the bottle, for about three hours in the refrigerator or half an hour in a bucket of ice water.
2. Wrap a towel or cloth around the bottle, to guard against the unlikely event of breakage.
3. Remove the foil wrap.
4. Place one hand firmly on the neck of the bottle, with your thumb maintaining pressure on the metal capsule against the cork.
5. Twist the wire ring six half-turns counter clockwise.
7. Tilt the bottle at a 45° angle, facing away from you and all others present.
9. As you feel the cork begin to loosen and rise, hold it with back pressure from your hand. Allow the cork to slowly ease out of the bottle. If done correctly, you will hear a gentle "sigh" rather than a "pop".
10. Pour a small amount in each glass.
11. As the initial mousse subsides, pour more Champagne into each glass.
1. Use a white background to detect color of the wine.
2. Create a swirling motion in the glass. This will aerate the wine to allow aromas to escape as well as to create "legs".
3. As you taste the wine, draw air into your mouth through the wine in order to magnify the intensity of the flavors. After you taste the wine, exhale through your nose because this is where you detect most tastes. The tongue reveals relatively little flavor. The tongue detects sweetness on the tip, bitterness at the back and top, acidity or sourness on the sides, and saltiness at the front sides.
4. An often-heard term is "finish". This term refers to a measure of the tastes or flavors that linger in the mouth after the wine is tasted. Generally, the longer the finish, the better the wine.
This is your first introduction to the wine. What we want to determine here is clarity and viscosity of the wine. It is our first hint of what the wine will taste like.
a. Color - A red wine may be described as ruby, purple or garnet if young and brick or orange if old. A white wine may be described as pale-straw to golden tones.
b. Clarity- Anywhere from Cloudy to Brilliant are common terms.
c. "Legs" appear on the inside of the glass after swirling.
d. Bubbles: smaller the bead, and the more plentiful the bead are two indicators of quality.
You smell to first determine if there are flaws in the wine or if it has gone over the top (turned toward vinegar). Next you want to smell to assess the aroma and get the first hint of that wonderful taste to come or maybe to not come, but at least you will be ready.
a. Are there any flaws in the wine? Corked? Oxidized?
b. Aromas (Not to be confused with bouquet) Aroma should really be confined to the fresh and fruity smells of the grapes; bouquet is the smell of the wine.
Well, you are finally at the hightlight of the process, tasting. As you taste the wine try to identify the taste you find. Certain wines will display traits unique to the grape variety. Such as, Sauvignon Blanc which will usually possess a grassy taste. We have listed below some common taste traits for wine.


text:
Race Has Always Affected the Vote
While racism in the United States is often attributed to poor whites, research suggests its political power resides in middle and wealthy suburban whites.
Was George Wallace Anti-Education…Or Just Anti-Integration?
While pledging to keep schools segregated, Alabama Governor George Wallace set up a community college system that benefited black Alabamans.
"Stranger Things" and the Psychic Nosebleed
Where did we get the idea that using psychic or telekinetic powers makes a person's nose bleed?
How We Escape It: An Essay
Escape is an ancient word, escapism, a modern one, and the designation of a genre—"escape literature"—dates to the 1930s.
The Pirate Creed
Examining the 18th-century social contract of Captain Bartholomew Roberts and his men shows just how organized and codified pirate societies could be.
Cornel West: Neoliberalism Has Failed Us
West speaks on Obama's legacy, the failures of American empire, and the role of race in Trump's election.
What's So Bad About A Monopoly?
Amazon's acquisition of Whole Foods has drawn the ire of a new antitrust movement, which argues against the dangers of industry monopoly.


text:
HomeCelebritiesBobby Lee: Age, Mad TV, Wife, Breakup, Brother, Feud, Nationality, Salary, Net...
Bobby Lee: Age, Mad TV, Wife, Breakup, Brother, Feud, Nationality, Salary, Net Worth & More
Bobby Lee, or Robert Lee Jr., is a stand-up comedian, podcaster, and actor from the United States. He was born in America but his parents are Korean immigrants Jeanie Lee and Robert Lee. Bobby Lee and his younger sibling grew up in California where they were born.
At 18 years of age, Bobby left his parents' home and began working in the San Diego region of California. There he took up jobs in restaurants and coffee shops while attending Palomar College from where he dropped out later. As a school student, Bobby Lee was in the school's breakdance team too.
The coffee shop in which Bobby worked closed abrupt in 1994. This made Bobby go the next door coffe shop for work. It was the famous The Comedy Store in San Diego. After working for some time there, he decided to try stand-up comic in that shop during one of their amateur nights. He then started performing regularly there. Within a year, he received offers to open from both Pauly Shore and Carlos Mencia. Bobby went on to work regularly in The Comedy Store, Los Angeles, US
Lee said that his parents were not supportive of his career as a stand-up comedian initially but later accepted it. He added that his father even apologised to him for not supporting him in the beginning.
Bobby Lee Wife
Bobby Lee was in a long-time relationship with his partner Khalyla Kuhn until they broke up recently. Khalyla Kuhn is also an Asian-American. She was born in Cebu, the Philippines. Cebu is the wealthiest region in the Philippines. It is a highly urbanised city in the Philippines and has been the richest region there for several consecutive years.
Shortly after Khalyla's birth, her parents moved to the US. Her mother's name is Marites Kuhn. We do not have much information about her father though. Khalyla herself does not bring up her father in her discussions. Apart from this, we also are not sure about her childhood life and even the number of siblings she has. Although there is surety about one sibling of hers, Julianna Kuhn, some reports also suggest that Khalyla has three siblings. They have identified one of them as Khawinda.
Khalyla, in the US, pursued Biochemistry as the subject of her higher studies. Before she met Bobby Lee, her future partner with who she hosted TigerBelly Podcast, Khalyla worked as a tutor. She taught anatomy, microbiology, and physiology.
Khalyla and Bobby Lee had been together for about 9 years since 2013. They once revealed they started to date in 2013. They met on the dating platform Tinder. Some reports suggest the two even married in 2016. They got married in New York. However, Bobby Lee and Khalyla did not publicise the marriage, unlike most celebrity marriages.
Besides the TigerBelly Podcast, Khalyla Kuhn also co-hosts Trash Tuesday, another podcast. She has made quite a following for herself and has a net worth of about a million dollars, say reports. This suggests she has a decent income too.
Just recently, Khalyla and Bobby broke up, but there were talks for quite a few days surrounding this possibility.
Bobby Lee Brother
Bobby Lee, the famous American comedian, podcaster, and actor, has a younger sibling. And guess what? He is in the business too. Bobby's younger brother Steve Lee is also a comedian and a podcaster. He is a musician as well. Steve Lee hosts The Stebee Weebee podcast and with another comedian Jeremiah Watkins, he co-hosts the Scissor Bros podcast. The Stebee Webee podcast has over 135 thousand subscribers on YouTube. He joined YouTube in 2017. This tells about the popularity of Steve Lee.
Steve attended Arizona Stae University. While he was in school, he wrestled and qualified twice for the state championships. Prior to becoming a comedian, musician, and podcaster, Steve spent years in the customer service industry.
Steve made appearances with his brother Bobby Lee on MADtv in 2006. He played the role of a bartender there. Since 2016, Steve has been appearing on the TigerBelly podcast as a guest. TigerBelly podcast is hosted by his brother Bobby and Bobby's previous partner Khalyla Kuhn. In 2019, he appeared on another comedy podcast, Riffin with Griffin. Riffin with Griffin is hosted by the actor and comedian Erik Griffin. Besides these, some of Steve's most famous performances are those sketches in which he appeared alongside his elder brother Bobby Lee. Those sketches featured Kim Jong Il and Tank.
Bobby Lee & Brendan Schaub Feud
Brendan Schaub is a former professional mixed martial artist, podcast host, and stand-up comedian. He is an American and was born in Colorado, US. The podcast shows he hosts are The Fighter and the kid podcast, the Below the Belt with Brendan Schaub podcast, and the King and the Sting podcast. He is actually a co-host of the King and the Stings. He co-hosts that with another comedian Theo Von.
Schaub started training in mixed martial arts and Brazilian jiu-jitsu after retiring from football in 2009. After just six months of training, Schaub won the Colorado novice-division Golden Gloves heavyweight title.
As a mixed martial artist, Schaub signed with the Ultimate Fighting Championship (UFC) in 2009. He signed to compete in the tenth season of The Ultimate Fighter. He retired in October 2015 and announced his retirement on The Joe Rogan podcast where he was a guest. At UFC, Brendan won Knockout of the Night once and at Ring of Fire, he won the Ring of Fire Heavyweight Championship.
In December 2014, while he was still a professional mixed martial artist, he joined a joint podcast with Joe Rogan and Bryan Callen. Both of them advised Schaub to retire from mixed martial arts and pursue a career in stand-up comedy. He actually did that and is now a famous stand-up comedian. Brendan shared a cordial relationship with fellow stand-up comedians and podcasters like Bobby Lee and Khalyla Kuhn.
Recently, we have seen a deterioration in the relationship between Bobby Lee, Khalyla Kuhn, and Brendan Schaub. Khalyla alleged with fellow podcasters on the Trash Tuesday podcast that someone "B.S." had come after her hard but was rejected. This made people mock Schaub. He joined Lee and Kuhn on the TigerBelly podcast to clarify himself but nothing was resolved.
Khalyla Bobby Break Up With Khalyla
Very recently, long-time partners Khalyla and Bobby Lee announced their breakup. They were together since 2013 and even got married reportedly in 2016 in New York but never announced it. Over these 9 years, both Bobby and Khalyla have not been as open about their relationship as other celebrity couples although they both hosted and still host the famous podcast the TigerBelly Podcast.
On one of the TigerBelly Podcast episodes, Bobby Lee announced that he and Khalyla are not together anymore. He added Khalyla is the love of his life and his best friend and that she has reinvented him by changing his life in so many ways. In the same episode, he added that they had faced a lot of challenges together like learning Khalyla had a coronary heart condition during a trip to the Philippines. Bobby Lee continued by saying that they spend 24 hours together and that Khalyla's niece also lives with them. They are a family, he said. He even added that both of them created the TigerBelly podcast together.
Bobby confessed that he had no money until he met her. He was "was making on the road", he went on. His life right now is the "direct result" of Khalyla and him building a business together and that "rekindled" his acting career.
On Ryan Sickler's HoneyDew podcast, Lee was open to discussing his relationship with Khalyla. Bobby Lee accepted that one of the biggest reasons why they broke up was his addiction to video games. He said he could not give her the time he could. He said the new game Starfield is going to release in eight months and that he knows he would be playing that for 16 hours a day. Bobby Lee ended by saying he would remain supportive of Khalyla.
Bobby Lee and "The Dictator"
The Dictator, a 2012 Hollywood movie, was a political black comedy. It was about a fictitious brutal dictator from the middle-east who came to the United States to address the United Nations Security Council. The dictator's plan spoils due to his kidnap by a hitman hired by his uncle Tamir. General Aladeen is that dictator's name.
The movie was a box office success. It was also the second most successful film of the main lead of this movie Sacha Baron Cohen. Sacha Baron Cohen was also this movie's co-writer and one of the producers. The film was made at a budget of $65-$100 million and earned $179.4 million worldwide. Although the movie is not based on any real-life characters, the makers say they found inspiration in real-life dictators like Kim Jong-il, Idi Amin, Muammar Gaddafi, Mobutu Sese Seko, and Saparmurat Niyazov. The absurd rules they made, the brutal fashion of their reign, and the oppression and unfreedom their countrymen faced at their hands were shown by the makers in the movie The Dictator but with a comic touch.
Of the so many characters who made the movie memorable and added their touch to make it a success, Bobby Lee is one of them. The American podcaster and comedian played the role of Mr Lao, a corrupt businessman. Mr Lao is seen with Tamir, the uncle of General Aladeen. Ben Kingsley, an excellent English actor, played the role of Tamir. He was the person who plotted the kidnapping of General Aladeen during his visit to New York, US to address the United Nations Security Council.
Harold and Kumar
Harold and Kumar is a Hollywood film series consisting of three movies: Harold & Kumar Go to White Castle (2004), Harold & Kumar Escape from Guantanamo Bay (2008), and A Very Harold & Kumar Christmas (2011). The movie stars Kal Penn and John Cho in the lead roles. Kal Penn plays Kumar Patel and John Cho plays Harold Lee. It also stars Neil Patrick Harris in all three movies as his fictionalised self. Neil Patrick Harris, although openly gay in real life, is a heavy drug user and womaniser in the movie. Other actors include Errol Sitahal, Bobby Lee, Shaun Majumdar, and others.
The Harold and Kumar film series follows the story of two friends, Kumar Patel and Harold Lee, who go on adventures and end up in comical situations.
Kumar Patel is an Indian-American pre-med student living in New Jersey. He is a confident and fearless slacker and does what he wants. But Kumar is very intelligent and talented though. His father and brother are successful doctors and want him to follow in their footsteps. But Kumar does not want to go to medical school and he prefers to smoke marijuana at night. On the other hand, his friend Harold Lee is a hard-working investment banker. Harold is a Korean-American person with a romantic life centring on John Hughes. He thinks he will end up with Cindy Kim, a Korean-American woman, who happens to like Harold but he doesn't. Harold and Kumar are roommates.
There are many actors who have made their mark in the movie. One of them is Bobby Lee. He plays the character of Kenneth Park. Kenneth Park introduces himself as a Princeton student and tries to network with Harold for an internship. Later in the movie, we can see him shirtless holding a pot of brownies.
MADtv
MAD TV, or MADtv, is a sketch-comedy television series in the US. It draws inspiration from MAD magazine. MAD was an American humour magazine. It started as a comic series but became a magazine. At the peak of its circulation, the magazine had over 2 million readers in 1973-74.
MADtv presented live performances before the audience. The performances comprised sketches, musical performances, and often cartoon shorts. The topics were parodied from popular television shows, movies, and music. They also covered topical, political, and pop culture humour.
The show had 15 seasons and ran from 1995 to 2009. Bobby Lee joined MAD TV in its seventh season as a featured character. Then he remained a part of the show as one of the main characters until the fourteenth season. In the fifteenth and final season, Bobby appeared as a guest on MAD TV.
The makers planned a revival of the popular American show. Reports came out in December 2015 that the series would return for an hour-long special episode to mark the twentieth anniversary of MAD TV. The episode would air in January 2016 on The CW, an American English-language commercial broadcast network. Later The CW announced they were reviving MAD TV for an eight-episode season in April 2016 featuring a new cast. They also retained a few original members of the cast like Nicole Sullivan, Bobby Lee, Will Sasso, Debra Wilson and a few others. They returned as hosts. Some of them appeared as their signature characters or most memorable celebrity impressions.
MAD TV was a very popular television show in the US. Its popularity is reflected by the number of award nominations the show received and the number of awards it won. MAD TV received 35 Emmy Awards nominations and it won 7 out of them.
Bobby Lee FAQs
What movie is Bobby Lee in?
Bobby Lee is in several movies doing a variety of roles. He has worked in The Dictator (2012), the Harold and Kumar film series, Laid in America (2016), Kickin' It Old Skool (2007), Borderlands, Bro, What Happened? (2014) and some other movies and shows.
Where is Bobby Lee from?
Bobby Lee was born in San Diego, California, the US. His parents Jeanie Lee and Robert Lee are Korean immigrants. Bobby grew up in the US and is a Korean-American.
How old is Bobby Lee?
Bobby Lee was born in on 17 September 1971. He is 51 years old.
When did Bobby Lee join Mad TV?
Bobby Lee joined MAD TV in 2001. MAD TV was in its seventh season then. As a matter of fact, Bobby Lee was the first Asian-American cast member of MAD TV.
How much is Bobby Lee worth?
The actor, comedian, and podcaster Bobby Lee is worth $10 million.
How much does Bobby Lee make a year?
Bobby Lee reportedly makes $400 thousand a year.
bobby and steve lee
bobby lee age
bobby lee and kalila
bobby lee and khalyla kuhn
bobby lee brendan schaub
bobby lee cook
bobby lee girlfriend
bobby lee girlfriend khalyla
bobby lee harold and kumar
bobby lee khalyla kuhn
bobby lee live
bobby lee movies
bobby lee movies and tv shows
bobby lee net worth
bobby lee podcast
bobby lee sex and the city
bobby lee stand up
bobby lee swagger
bobby lee tour
bobby lee twitter
bobby lee young
brendan schaub bobby lee
brendan schaub bobby lee drama
bryan callen bobby lee
btk killer
how old is bobby lee
khalyla kuhn
steve lee bobby lee
The Key Steps to Restarting Your Education
Nevada Alexander Musk: Date Of Birth, Father, Mother, Death, FAQs & More
Prateek - February 1, 2023
Mike - January 30, 2023
10 Best Sportlemon Alternatives You Can Find In 2023
10 Best Chatiw Alternatives You Can Find In 2023
Everything about Polish Elegance Veronica Bielik
Attractive Sudanese Model on Instagram – Amirah Dyme
Doujindesu Application: The App To Watch Manga Online
Frugal Fit Mom: Christine, Age, Husband, Mormon, Religion, YouTube, Bio, Recipes, Net Worth & FAQS
Joy Sunday: Bio, Age, Height, Parents, Instagram, Twitter, Movies, Wednesday, Black Panther, Net Worth, FAQs & More


This page shows the latest methotrexate news and features for those working in and with pharma, biotech and healthcare.
as methotrexate, cyclosporine and acitretin, which have significant side effects.
methotrexate – in patients with moderate-to-severe RA who weren't responding to methotrexate alone. ... was significantly better than methotrexate alone at helping patients achieve an ACR20 response.
Approximately 1 fully matching, plus 96 partially matching documents found.
The appointments come as the company looks to expand its business after the commercialisation of Otrexup (methotrexate) for arthritis and the advance in development of testosterone replacement therapy Vibex QS T.
methotrexate) for arthritis and advance the development of testosterone replacement therapy Vibex QS T.