text:
//===--- SILModule.cpp - SILModule implementation -------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

#define DEBUG_TYPE "sil-module"
#include "swift/SIL/SILModule.h"
#include "Linker.h"
#include "swift/AST/ASTMangler.h"
#include "swift/AST/GenericEnvironment.h"
#include "swift/AST/ProtocolConformance.h"
#include "swift/ClangImporter/ClangModule.h"
#include "swift/SIL/FormalLinkage.h"
#include "swift/SIL/Notifications.h"
#include "swift/SIL/SILDebugScope.h"
#include "swift/SIL/SILRemarkStreamer.h"
#include "swift/SIL/SILValue.h"
#include "swift/SIL/SILVisitor.h"
#include "swift/Serialization/SerializedSILLoader.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/YAMLTraits.h"
#include <functional>
using namespace swift;
using namespace Lowering;

STATISTIC(NumSlabsAllocated, "number of slabs allocated in SILModule");

class SILModule::SerializationCallback final
    : public DeserializationNotificationHandler {
  void didDeserialize(ModuleDecl *M, SILFunction *fn) override {
    updateLinkage(fn);
  }

  void didDeserialize(ModuleDecl *M, SILGlobalVariable *var) override {
    updateLinkage(var);

    // For globals we currently do not support available_externally.
    // In the interpreter it would result in two instances for a single global:
    // one in the imported module and one in the main module.
    var->setDeclaration(true);
  }

  void didDeserialize(ModuleDecl *M, SILVTable *vtable) override {
    // TODO: should vtables get linkage?
    //updateLinkage(vtable);
  }

  void didDeserialize(ModuleDecl *M, SILWitnessTable *wt) override {
    updateLinkage(wt);
  }

  template <class T> void updateLinkage(T *decl) {
    switch (decl->getLinkage()) {
    case SILLinkage::Public:
      decl->setLinkage(SILLinkage::PublicExternal);
      return;
    case SILLinkage::PublicNonABI:
      // PublicNonABI functions receive Shared linkage, so that
      // they have "link once" semantics when deserialized by multiple
      // translation units in the same Swift module.
      decl->setLinkage(SILLinkage::Shared);
      return;
    case SILLinkage::Hidden:
      decl->setLinkage(SILLinkage::HiddenExternal);
      return;
    case SILLinkage::Private:
      llvm_unreachable("cannot make a private external symbol");
    case SILLinkage::PublicExternal:
    case SILLinkage::HiddenExternal:
    case SILLinkage::Shared:
      return;
    }
  }

  StringRef getName() const override {
    return "SILModule::SerializationCallback";
  }
};

SILModule::SILModule(llvm::PointerUnion<FileUnit *, ModuleDecl *> context,
                     Lowering::TypeConverter &TC, const SILOptions &Options)
    : Stage(SILStage::Raw), loweredAddresses(!Options.EnableSILOpaqueValues),
      indexTrieRoot(new IndexTrieNode()), Options(Options), serialized(false),
      regDeserializationNotificationHandlerForNonTransparentFuncOME(false),
      regDeserializationNotificationHandlerForAllFuncOME(false),
      prespecializedFunctionDeclsImported(false), SerializeSILAction(),
      Types(TC) {
  assert(!context.isNull());
  if (auto *file = context.dyn_cast<FileUnit *>()) {
    AssociatedDeclContext = file;
  } else {
    AssociatedDeclContext = context.get<ModuleDecl *>();
  }
  TheSwiftModule = AssociatedDeclContext->getParentModule();

  // We always add the base SILModule serialization callback.
  std::unique_ptr<DeserializationNotificationHandler> callback(
      new SILModule::SerializationCallback());
  deserializationNotificationHandlers.add(std::move(callback));
}

SILModule::~SILModule() {
#ifndef NDEBUG
  checkForLeaks();

  NumSlabsAllocated += numAllocatedSlabs;
  assert(numAllocatedSlabs == freeSlabs.size() && "leaking slabs in SILModule");
#endif

  assert(!hasUnresolvedOpenedArchetypeDefinitions());

  // Decrement ref count for each SILGlobalVariable with static initializers.
  for (SILGlobalVariable &v : silGlobals) {
    v.clear();
  }

  for (auto vt : vtables)
    vt->~SILVTable();

  // Drop everything functions in this module reference.
  //
  // This is necessary since the functions may reference each other.  We don't
  // need to worry about sil_witness_tables since witness tables reference each
  // other via protocol conformances and sil_vtables don't reference each other
  // at all.
  for (SILFunction &F : *this) {
    F.dropAllReferences();
    F.dropDynamicallyReplacedFunction();
    F.clearSpecializeAttrs();
  }

  for (SILFunction &F : *this) {
    F.eraseAllBlocks();
  }
  flushDeletedInsts();
}

void SILModule::checkForLeaks() const {

  /// Leak checking is not thread safe, because the instruction counters are
  /// global non-atomic variables. Leak checking can only be done in case there
  /// is a single SILModule in a single thread.
  if (!getOptions().checkSILModuleLeaks)
    return;

  int instsInModule = std::distance(scheduledForDeletion.begin(),
                                    scheduledForDeletion.end());
  for (const SILFunction &F : *this) {
    for (const SILBasicBlock &block : F) {
      instsInModule += std::distance(block.begin(), block.end());
    }
  }
  for (const SILFunction &F : zombieFunctions) {
    for (const SILBasicBlock &block : F) {
      instsInModule += std::distance(block.begin(), block.end());
    }
  }
  for (const SILGlobalVariable &global : getSILGlobals()) {
      instsInModule += std::distance(global.StaticInitializerBlock.begin(),
                                     global.StaticInitializerBlock.end());
  }

  int numAllocated = SILInstruction::getNumCreatedInstructions() -
                       SILInstruction::getNumDeletedInstructions();

  if (numAllocated != instsInModule) {
    llvm::errs() << "Leaking instructions!\n";
    llvm::errs() << "Alloated instructions: " << numAllocated << '\n';
    llvm::errs() << "Instructions in module: " << instsInModule << '\n';
    llvm_unreachable("leaking instructions");
  }

  assert(PlaceholderValue::getNumPlaceholderValuesAlive() == 0 &&
         "leaking placeholders");
}

void SILModule::checkForLeaksAfterDestruction() {
// Disabled in release (non-assert) builds because this check fails in rare
// cases in lldb, causing crashes. rdar://70826934
#ifndef NDEBUG
  int numAllocated = SILInstruction::getNumCreatedInstructions() -
                     SILInstruction::getNumDeletedInstructions();

  if (numAllocated != 0) {
    llvm::errs() << "Leaking " << numAllocated << " instructions!\n";
    llvm_unreachable("leaking instructions");
  }
#endif
}

std::unique_ptr<SILModule> SILModule::createEmptyModule(
    llvm::PointerUnion<FileUnit *, ModuleDecl *> context,
    Lowering::TypeConverter &TC, const SILOptions &Options) {
  return std::unique_ptr<SILModule>(new SILModule(context, TC, Options));
}

ASTContext &SILModule::getASTContext() const {
  return TheSwiftModule->getASTContext();
}

void *SILModule::allocate(unsigned Size, unsigned Align) const {
  if (getASTContext().LangOpts.UseMalloc)
    return AlignedAlloc(Size, Align);

  return BPA.Allocate(Size, Align);
}

FixedSizeSlab *SILModule::allocSlab() {
  if (freeSlabs.empty()) {
    numAllocatedSlabs++;
    return new (*this) FixedSizeSlab();
  }

  FixedSizeSlab *slab = &*freeSlabs.rbegin();
  freeSlabs.remove(*slab);
  return slab;
}

void SILModule::freeSlab(FixedSizeSlab *slab) {
  freeSlabs.push_back(*slab);
  assert(slab->overflowGuard == FixedSizeSlab::magicNumber);
}

void SILModule::freeAllSlabs(SlabList &slabs) {
  freeSlabs.splice(freeSlabs.end(), slabs);
}

void *SILModule::allocateInst(unsigned Size, unsigned Align) const {
  return AlignedAlloc(Size, Align);
}

void SILModule::willDeleteInstruction(SILInstruction *I) {
  // Update RootOpenedArchetypeDefs.
  if (auto *svi = dyn_cast<SingleValueInstruction>(I)) {
    if (const CanOpenedArchetypeType archeTy =
            svi->getDefinedOpenedArchetype()) {
      OpenedArchetypeKey key = {archeTy, svi->getFunction()};
      assert(RootOpenedArchetypeDefs.lookup(key) == svi &&
             "archetype def was not registered");
      RootOpenedArchetypeDefs.erase(key);
    }
  }
}

void SILModule::scheduleForDeletion(SILInstruction *I) {
  I->dropAllReferences();
  scheduledForDeletion.push_back(I);
  I->ParentBB = nullptr;
}

void SILModule::flushDeletedInsts() {
  while (!scheduledForDeletion.empty()) {
    SILInstruction *inst = &*scheduledForDeletion.begin();
    scheduledForDeletion.erase(inst);
    AlignedFree(inst);
  }
}

SILWitnessTable *
SILModule::lookUpWitnessTable(const ProtocolConformance *C) {
  assert(C && "null conformance passed to lookUpWitnessTable");

  auto rootC = C->getRootConformance();
  // Attempt to lookup the witness table from the table.
  auto found = WitnessTableMap.find(rootC);
  if (found == WitnessTableMap.end())
    return nullptr;

  return found->second;
}

SILDefaultWitnessTable *
SILModule::lookUpDefaultWitnessTable(const ProtocolDecl *Protocol,
                                     bool deserializeLazily) {
  // Note: we only ever look up default witness tables in the translation unit
  // that is currently being compiled, since they SILGen generates them when it
  // visits the protocol declaration, and IRGen emits them when emitting the
  // protocol descriptor metadata for the protocol.

  auto found = DefaultWitnessTableMap.find(Protocol);
  if (found == DefaultWitnessTableMap.end()) {
    if (deserializeLazily) {
      SILLinkage linkage =
        getSILLinkage(getDeclLinkage(Protocol), ForDefinition);
      SILDefaultWitnessTable *wtable =
        SILDefaultWitnessTable::create(*this, linkage, Protocol);
      wtable = getSILLoader()->lookupDefaultWitnessTable(wtable);
      if (wtable)
        DefaultWitnessTableMap[Protocol] = wtable;
      return wtable;
    }

    return nullptr;
  }

  return found->second;
}

SILDefaultWitnessTable *
SILModule::createDefaultWitnessTableDeclaration(const ProtocolDecl *Protocol,
                                                SILLinkage Linkage) {
  return SILDefaultWitnessTable::create(*this, Linkage, Protocol);
}

void SILModule::deleteWitnessTable(SILWitnessTable *Wt) {
  auto Conf = Wt->getConformance();
  assert(lookUpWitnessTable(Conf) == Wt);
  getSILLoader()->invalidateWitnessTable(Wt);
  WitnessTableMap.erase(Conf);
  witnessTables.erase(Wt);
}

const IntrinsicInfo &SILModule::getIntrinsicInfo(Identifier ID) {
  unsigned OldSize = IntrinsicIDCache.size();
  IntrinsicInfo &Info = IntrinsicIDCache[ID];

  // If the element was is in the cache, return it.
  if (OldSize == IntrinsicIDCache.size())
    return Info;

  // Otherwise, lookup the ID and Type and store them in the map.
  StringRef NameRef = getBuiltinBaseName(getASTContext(), ID.str(), Info.Types);
  Info.ID = getLLVMIntrinsicID(NameRef);

  return Info;
}

const BuiltinInfo &SILModule::getBuiltinInfo(Identifier ID) {
  unsigned OldSize = BuiltinIDCache.size();
  BuiltinInfo &Info = BuiltinIDCache[ID];

  // If the element was is in the cache, return it.
  if (OldSize == BuiltinIDCache.size())
    return Info;

  // Otherwise, lookup the ID and Type and store them in the map.
  // Find the matching ID.
  StringRef OperationName =
    getBuiltinBaseName(getASTContext(), ID.str(), Info.Types);

  // Several operation names have suffixes and don't match the name from
  // Builtins.def, so handle those first.
  if (OperationName.startswith("fence_"))
    Info.ID = BuiltinValueKind::Fence;
  else if (OperationName.startswith("ifdef_"))
    Info.ID = BuiltinValueKind::Ifdef;
  else if (OperationName.startswith("cmpxchg_"))
    Info.ID = BuiltinValueKind::CmpXChg;
  else if (OperationName.startswith("atomicrmw_"))
    Info.ID = BuiltinValueKind::AtomicRMW;
  else if (OperationName.startswith("atomicload_"))
    Info.ID = BuiltinValueKind::AtomicLoad;
  else if (OperationName.startswith("atomicstore_"))
    Info.ID = BuiltinValueKind::AtomicStore;
  else if (OperationName.startswith("allocWithTailElems_"))
    Info.ID = BuiltinValueKind::AllocWithTailElems;
  else if (OperationName.startswith("applyDerivative_"))
    Info.ID = BuiltinValueKind::ApplyDerivative;
  else if (OperationName.startswith("applyTranspose_"))
    Info.ID = BuiltinValueKind::ApplyTranspose;
  else
    Info.ID = llvm::StringSwitch<BuiltinValueKind>(OperationName)
#define BUILTIN(id, name, attrs) .Case(name, BuiltinValueKind::id)
#include "swift/AST/Builtins.def"
      .Default(BuiltinValueKind::None);

  return Info;
}

SILFunction *SILModule::lookUpFunction(SILDeclRef fnRef) {
  auto name = fnRef.mangle();
  return lookUpFunction(name);
}

bool SILModule::loadFunction(SILFunction *F, LinkingMode LinkMode) {
  SILFunction *NewF =
    getSILLoader()->lookupSILFunction(F, /*onlyUpdateLinkage*/ false);
  if (!NewF)
    return false;

  linkFunction(NewF, LinkMode);

  assert(F == NewF);
  return true;
}

SILFunction *SILModule::loadFunction(StringRef name,
                                     LinkingMode LinkMode,
                                     Optional<SILLinkage> linkage) {
  SILFunction *func = lookUpFunction(name);
  if (!func)
    func = getSILLoader()->lookupSILFunction(name, linkage);
  if (!func)
    return nullptr;

  linkFunction(func, LinkMode);
  return func;
}

void SILModule::updateFunctionLinkage(SILFunction *F) {
  getSILLoader()->lookupSILFunction(F, /*onlyUpdateLinkage*/ true);
}

bool SILModule::linkFunction(SILFunction *F, SILModule::LinkingMode Mode) {
  return SILLinkerVisitor(*this, Mode).processFunction(F);
}

bool SILModule::hasFunction(StringRef Name) {
  if (lookUpFunction(Name))
    return true;
  return getSILLoader()->hasSILFunction(Name);
}

void SILModule::invalidateSILLoaderCaches() {
  getSILLoader()->invalidateAllCaches();
}

SILFunction *SILModule::removeFromZombieList(StringRef Name) {
  if (auto *Zombie = ZombieFunctionTable.lookup(Name)) {
    ZombieFunctionTable.erase(Name);
    zombieFunctions.remove(Zombie);

    // The owner of the function's Name is the ZombieFunctionTable key, which is
    // freed by erase().
    // Make sure nobody accesses the name string after it is freed.
    Zombie->Name = StringRef();
    return Zombie;
  }
  return nullptr;
}

/// Erase a function from the module.
void SILModule::eraseFunction(SILFunction *F) {
  assert(!F->isZombie() && "zombie function is in list of alive functions");

  llvm::StringMapEntry<SILFunction*> *entry =
      &*ZombieFunctionTable.insert(std::make_pair(F->getName(), nullptr)).first;
  assert(!entry->getValue() && "Zombie function already exists");
  StringRef zombieName = entry->getKey();

  // The owner of the function's Name is the FunctionTable key. As we remove
  // the function from the table we need to use the allocated name string from
  // the ZombieFunctionTable.
  FunctionTable.erase(F->getName());
  F->Name = zombieName;

  // The function is dead, but we need it later (at IRGen) for debug info
  // or vtable stub generation. So we move it into the zombie list.
  getFunctionList().remove(F);
  zombieFunctions.push_back(F);
  entry->setValue(F);
  F->setZombie();

  // This opens dead-function-removal opportunities for called functions.
  // (References are not needed anymore.)
  F->clear();
  F->dropDynamicallyReplacedFunction();
  // Drop references for any _specialize(target:) functions.
  F->clearSpecializeAttrs();
}

void SILModule::invalidateFunctionInSILCache(SILFunction *F) {
  getSILLoader()->invalidateFunction(F);
}

/// Erase a global SIL variable from the module.
void SILModule::eraseGlobalVariable(SILGlobalVariable *gv) {
  getSILLoader()->invalidateGlobalVariable(gv);
  GlobalVariableMap.erase(gv->getName());
  getSILGlobalList().erase(gv);
}

SILVTable *SILModule::lookUpVTable(const ClassDecl *C,
                                   bool deserializeLazily) {
  if (!C)
    return nullptr;

  // First try to look up R from the lookup table.
  auto R = VTableMap.find(C);
  if (R != VTableMap.end())
    return R->second;

  if (!deserializeLazily)
    return nullptr;

  // If that fails, try to deserialize it. If that fails, return nullptr.
  SILVTable *Vtbl = getSILLoader()->lookupVTable(C);
  if (!Vtbl)
    return nullptr;

  // If we succeeded, map C -> VTbl in the table and return VTbl.
  VTableMap[C] = Vtbl;
  return Vtbl;
}

SerializedSILLoader *SILModule::getSILLoader() {
  // If the SILLoader is null, create it.
  if (!SILLoader)
    SILLoader = SerializedSILLoader::create(
        getASTContext(), this, &deserializationNotificationHandlers);
  // Return the SerializedSILLoader.
  return SILLoader.get();
}

/// Given a conformance \p C and a protocol requirement \p Requirement,
/// search the witness table for the conformance and return the witness thunk
/// for the requirement.
std::pair<SILFunction *, SILWitnessTable *>
SILModule::lookUpFunctionInWitnessTable(ProtocolConformanceRef C,
                                        SILDeclRef Requirement,
                                        SILModule::LinkingMode linkingMode) {
  if (!C.isConcrete())
    return {nullptr, nullptr};

  if (getStage() != SILStage::Lowered) {
    SILLinkerVisitor linker(*this, linkingMode);
    linker.processConformance(C);
  }
  SILWitnessTable *wt = lookUpWitnessTable(C.getConcrete());

  if (!wt) {
    LLVM_DEBUG(llvm::dbgs() << "        Failed speculative lookup of "
               "witness for: ";
               C.dump(llvm::dbgs()); Requirement.dump());
    return {nullptr, nullptr};
  }

  // Okay, we found the correct witness table. Now look for the method.
  for (auto &Entry : wt->getEntries()) {
    // Look at method entries only.
    if (Entry.getKind() != SILWitnessTable::WitnessKind::Method)
      continue;

    SILWitnessTable::MethodWitness MethodEntry = Entry.getMethodWitness();
    // Check if this is the member we were looking for.
    if (MethodEntry.Requirement != Requirement)
      continue;

    return {MethodEntry.Witness, wt};
  }

  return {nullptr, nullptr};
}

/// Given a protocol \p Protocol and a requirement \p Requirement,
/// search the protocol's default witness table and return the default
/// witness thunk for the requirement.
std::pair<SILFunction *, SILDefaultWitnessTable *>
SILModule::lookUpFunctionInDefaultWitnessTable(const ProtocolDecl *Protocol,
                                               SILDeclRef Requirement,
                                               bool deserializeLazily) {
  // Look up the default witness table associated with our protocol from the
  // SILModule.
  auto Ret = lookUpDefaultWitnessTable(Protocol, deserializeLazily);

  // If no default witness table was found, bail.
  //
  // FIXME: Could be an assert if we fix non-single-frontend mode to link
  // together serialized SIL emitted by each translation unit.
  if (!Ret) {
    LLVM_DEBUG(llvm::dbgs() << "        Failed speculative lookup of default "
               "witness for " << Protocol->getName() << " ";
               Requirement.dump());
    return std::make_pair(nullptr, nullptr);
  }

  // Okay, we found the correct default witness table. Now look for the method.
  for (auto &Entry : Ret->getEntries()) {
    // Ignore dummy entries emitted for non-method requirements, as well as
    // requirements without default implementations.
    if (!Entry.isValid() || Entry.getKind() != SILWitnessTable::Method)
      continue;

    // Check if this is the member we were looking for.
    if (Entry.getMethodWitness().Requirement != Requirement)
      continue;

    return std::make_pair(Entry.getMethodWitness().Witness, Ret);
  }

  // This requirement doesn't have a default implementation.
  return std::make_pair(nullptr, nullptr);
}

SILFunction *
SILModule::
lookUpFunctionInVTable(ClassDecl *Class, SILDeclRef Member) {
  // Try to lookup a VTable for Class from the module...
  auto *Vtbl = lookUpVTable(Class);

  // Bail, if the lookup of VTable fails.
  if (!Vtbl) {
    return nullptr;
  }

  // Ok, we have a VTable. Try to lookup the SILFunction implementation from
  // the VTable.
  if (auto E = Vtbl->getEntry(*this, Member))
    return E->getImplementation();

  return nullptr;
}

SILDifferentiabilityWitness *
SILModule::lookUpDifferentiabilityWitness(StringRef name) {
  auto it = DifferentiabilityWitnessMap.find(name);
  if (it != DifferentiabilityWitnessMap.end())
    return it->second;
  return nullptr;
}

SILDifferentiabilityWitness *
SILModule::lookUpDifferentiabilityWitness(SILDifferentiabilityWitnessKey key) {
  Mangle::ASTMangler mangler;
  return lookUpDifferentiabilityWitness(
      mangler.mangleSILDifferentiabilityWitness(
          key.originalFunctionName, key.kind, key.config));
}

/// Look up the differentiability witness corresponding to the given indices.
llvm::ArrayRef<SILDifferentiabilityWitness *>
SILModule::lookUpDifferentiabilityWitnessesForFunction(StringRef name) {
  return DifferentiabilityWitnessesByFunction[name];
}

bool SILModule::loadDifferentiabilityWitness(SILDifferentiabilityWitness *dw) {
  auto *newDW = getSILLoader()->lookupDifferentiabilityWitness(dw->getKey());
  if (!newDW)
    return false;
  assert(dw == newDW);
  return true;
}

void SILModule::registerDeserializationNotificationHandler(
    std::unique_ptr<DeserializationNotificationHandler> &&handler) {
  deserializationNotificationHandlers.add(std::move(handler));
}

SILValue SILModule::getRootOpenedArchetypeDef(CanOpenedArchetypeType archetype,
                                              SILFunction *inFunction) {
  assert(archetype->isRoot());

  SILValue &def = RootOpenedArchetypeDefs[{archetype, inFunction}];
  if (!def) {
    numUnresolvedOpenedArchetypes++;
    def = ::new PlaceholderValue(SILType::getPrimitiveAddressType(archetype));
  }

  return def;
}

bool SILModule::hasUnresolvedOpenedArchetypeDefinitions() {
  return numUnresolvedOpenedArchetypes != 0;
}

void SILModule::notifyAddedInstruction(SILInstruction *inst) {
  if (auto *svi = dyn_cast<SingleValueInstruction>(inst)) {
    if (const CanOpenedArchetypeType archeTy =
            svi->getDefinedOpenedArchetype()) {
      SILValue &val = RootOpenedArchetypeDefs[{archeTy, inst->getFunction()}];
      if (val) {
        if (!isa<PlaceholderValue>(val)) {
          // Print a useful error message (and not just abort with an assert).
          llvm::errs() << "re-definition of root opened archetype in function "
                       << svi->getFunction()->getName() << ":\n";
          svi->print(llvm::errs());
          llvm::errs() << "previously defined in function "
                       << val->getFunction()->getName() << ":\n";
          val->print(llvm::errs());
          abort();
        }
        // The opened archetype was unresolved so far. Replace the placeholder
        // by inst.
        auto *placeholder = cast<PlaceholderValue>(val);
        placeholder->replaceAllUsesWith(svi);
        ::delete placeholder;
        numUnresolvedOpenedArchetypes--;
      }
      val = svi;
    }
  }
}

void SILModule::notifyMovedInstruction(SILInstruction *inst,
                                       SILFunction *fromFunction) {
  if (auto *svi = dyn_cast<SingleValueInstruction>(inst)) {
    if (const CanOpenedArchetypeType archeTy =
            svi->getDefinedOpenedArchetype()) {
      OpenedArchetypeKey key = {archeTy, fromFunction};
      assert(RootOpenedArchetypeDefs.lookup(key) == svi &&
             "archetype def was not registered");
      RootOpenedArchetypeDefs.erase(key);
      RootOpenedArchetypeDefs[{archeTy, svi->getFunction()}] = svi;
    }
  }
}

// TODO: We should have an "isNoReturn" bit on Swift's BuiltinInfo, but for
// now, let's recognize noreturn intrinsics and builtins specially here.
bool SILModule::isNoReturnBuiltinOrIntrinsic(Identifier Name) {
  const auto &IntrinsicInfo = getIntrinsicInfo(Name);
  if (IntrinsicInfo.ID != llvm::Intrinsic::not_intrinsic) {
    return IntrinsicInfo.getOrCreateAttributes(getASTContext())
        .hasFnAttr(llvm::Attribute::NoReturn);
  }
  const auto &BuiltinInfo = getBuiltinInfo(Name);
  switch (BuiltinInfo.ID) {
  default:
    return false;
  case BuiltinValueKind::Unreachable:
  case BuiltinValueKind::CondUnreachable:
  case BuiltinValueKind::UnexpectedError:
  case BuiltinValueKind::ErrorInMain:
    return true;
  }
}

bool SILModule::
shouldSerializeEntitiesAssociatedWithDeclContext(const DeclContext *DC) const {
  // Serialize entities associated with this module's associated context.
  if (DC->isChildContextOf(getAssociatedContext())) {
    return true;
  }

  // Serialize entities associated with clang modules, since other entities
  // may depend on them, and someone who deserializes those entities may not
  // have their own copy.
  if (isa<ClangModuleUnit>(DC->getModuleScopeContext())) {
    return true;
  }

  return false;
}

/// Returns true if it is the optimized OnoneSupport module.
bool SILModule::isOptimizedOnoneSupportModule() const {
  return getOptions().shouldOptimize() &&
         getSwiftModule()->isOnoneSupportModule();
}

void SILModule::addPublicCMOSymbol(StringRef symbol) {
  if (!publicCMOSymbols)
    publicCMOSymbols = std::make_shared<TBDSymbolSet>();
  publicCMOSymbols->insert(symbol.str());
}

void SILModule::setSerializeSILAction(SILModule::ActionCallback Action) {
  assert(!SerializeSILAction && "Serialization action can be set only once");
  SerializeSILAction = Action;
}

SILModule::ActionCallback SILModule::getSerializeSILAction() const {
  return SerializeSILAction;
}

void SILModule::serialize() {
  assert(SerializeSILAction && "Serialization action should be set");
  assert(!isSerialized() && "The module was serialized already");
  SerializeSILAction();
  setSerialized();
}

void SILModule::installSILRemarkStreamer() {
  assert(!silRemarkStreamer && "SIL Remark Streamer is already installed!");
  silRemarkStreamer = SILRemarkStreamer::create(*this);
}

bool SILModule::isStdlibModule() const {
  return TheSwiftModule->isStdlibModule();
}
void SILModule::performOnceForPrespecializedImportedExtensions(
    llvm::function_ref<void(AbstractFunctionDecl *)> action) {
  if (prespecializedFunctionDeclsImported)
    return;

  SmallVector<ModuleDecl *, 8> importedModules;
  // Add the Swift module.
  if (!isStdlibModule()) {
    auto *SwiftStdlib = getASTContext().getStdlibModule(true);
    if (SwiftStdlib)
      importedModules.push_back(SwiftStdlib);
  }

  // Add explicitly imported modules.
  SmallVector<Decl *, 32> topLevelDecls;
  getSwiftModule()->getTopLevelDecls(topLevelDecls);
  for (const Decl *D : topLevelDecls) {
    if (auto importDecl = dyn_cast<ImportDecl>(D)) {
      if (!importDecl->getModule() ||
          importDecl->getModule()->isNonSwiftModule())
        continue;
      importedModules.push_back(importDecl->getModule());
    }
  }

  for (auto *module : importedModules) {
    SmallVector<Decl *, 16> prespecializations;
    module->getExportedPrespecializations(prespecializations);
    for (auto *p : prespecializations) {
      if (auto *vd = dyn_cast<AbstractFunctionDecl>(p)) {
        action(vd);
      }
    }
  }
  prespecializedFunctionDeclsImported = true;
}

SILProperty *SILProperty::create(SILModule &M,
                                 bool Serialized,
                                 AbstractStorageDecl *Decl,
                                 Optional<KeyPathPatternComponent> Component) {
  auto prop = new (M) SILProperty(Serialized, Decl, Component);
  M.properties.push_back(prop);
  return prop;
}

// Definition from SILLinkage.h.
SILLinkage swift::getDeclSILLinkage(const ValueDecl *decl) {
  AccessLevel access = decl->getEffectiveAccess();
  SILLinkage linkage;
  switch (access) {
  case AccessLevel::Private:
  case AccessLevel::FilePrivate:
    linkage = SILLinkage::Private;
    break;
  case AccessLevel::Internal:
    linkage = SILLinkage::Hidden;
    break;
  case AccessLevel::Public:
  case AccessLevel::Open:
    linkage = SILLinkage::Public;
    break;
  }
  return linkage;
}

void swift::simple_display(llvm::raw_ostream &out, const SILModule *M) {
  if (!M) {
    out << "(null)";
    return;
  }
  out << "SIL for ";
  simple_display(out, M->getSwiftModule());
}

SourceLoc swift::extractNearestSourceLoc(const SILModule *M) {
  if (!M)
    return SourceLoc();
  return extractNearestSourceLoc(M->getSwiftModule());
}

redpajama_set_name: RedPajamaGithub


The EOR Capital Markets Group assists clients with capital investments/project finance for global energy and infrastructure related projects within Africa, the US, the Middle and Far East. EOR focuses on transactions that create sustainable value and affords technical, as well as logistical solutions that enhance social and environmental conditions. The firm works with clients to formulate strategy, conceptualize and implement creative financing structures; always drawing on best practices in the industry.
Key principals of the firm have years of experience in Finance/Investment Banking and specialize in manufacturing, infrastructure and energy related projects. By means of EOR's global client base and early involvement in international projects, EOR routinely is engaged to provide capital raise assistance via both the debt and/or equity markets.
Experience, Expertise & Integrity are the pillars of EOR's success.
The information contained in this website has been prepared to assist interested parties in making their own evaluation of EOR Energy Services, LLC and does not purport to be all-inclusive. Prospective users and investors should conduct their own investigation and analysis of the Company and of the information contained within this Internet Site. The Company and its management do not make any representation or warranty as to the accuracy or completeness of the information contained herein, or that any information contained herein remains unchanged in any respect since the date thereof. Accordingly, the Company and its management shall have no liability for any representations (expressed or implied) contained in, or for any omissions from, this internet site or for any other written or oral communications transmitted to prospective financiers in the course of their evaluation.


text:
Home › THE BEATBOX HOUSE
THE BEATBOX HOUSE
FEATURING GENE SHINOZAKI, CHRIS CELIZ & AMIT BEATS
Website | YouTube
"Based out of New York City, The Beatbox House is a collective of World Champion Beatboxers. Hailing from different regions of the country, The Beatbox House is comprised of five core members Gene Shinozaki, Kenny Urban, NaPoM, Amit and Chris Celiz. They currently live together in Brooklyn, New York (yes it's a real house.) Beatboxing is growing into a global phenomenon branching out from its Hip-Hop roots. The collective is rebranding the art as a new form of music and is pushing the boundaries of what's possible with the human voice.
Each artist is a soloist, educator and musician in their own right. Their ability to work together and bring a communal vibe unlike any other gives the audience a one of a kind experience. It leaves them with a new possibility of what human beings are capable of and inspires people to take action on what's truly possible for themselves." - The Beatbox House

redpajama_set_name: RedPajamaCommonCrawl


The desire and ambition of Speed Factory Indoor Karting is to create the most memorable and safest Motorsports themed entertainment experience possible. Our two locations offer the FASTEST Indoor Rental Go karts in SOUTH CAROLINA.
Our Greenville SC is conveniently located on Roper Mt Road for great access to Woodruff Road area stores and restaurants. Our newly reconfigured track offers a 10 turn road course with a variety of turn shapes challenging drivers of all skill levels. Both locations offering hospitality areas and additional VIP areas are available to enjoy your special event in private.
We offer the best gas powered European designed racing karts in the industry that provide the most comfortable, safest, hands-on, wheel to wheel racing experience possible.
Our staff is highly trained and experienced in the hospitality industry and will provide the most memorable experience possible.
We want to operate the most exciting Motorsports themed Entertainment, Hospitality, and Event Space possible.
We are always looking to improve our operation and welcome your comments.
Please let us know how we are doing and what we can do to make your experience even more FUN in the future.
 Hope you enjoy your visit and will come back and visit us again soon.


Multiple Sclerosis: Is Yawning a Warning?
Neuropsychologist Simon Thompson found a possible link between yawning and multiple sclerosis. So what better way to get under the skin of his research than volunteering to take part in one of his experiments?
Bournemouth University neuropsychologist Simon Thompson is an expert on yawning. In 2011, he posited that high levels of the stress hormone cortisol may be a direct cause of yawning. "We believe that cortisol levels rise sufficiently to trigger a yawn for the purpose of lowering brain temperature," he says.
The idea became known as the Thompson cortisol hypothesis (Interact J Med Res, 1:e4, 2012). Linking yawning with fatigue, cortisol, and brain temperature, the hypothesis is ideally suited to being tested on people with multiple sclerosis (MS). Patients with the neurodegenerative disorder often report frequent yawning. They also suffer from fatigue, which has been associated with elevated brain temperature (Neurology, 86:P2.172, 2016).
Up to now, experiments to test the hypothesis have only been conducted on healthy subjects. So, as a big yawner who has lived with MS for 10 years, I couldn't miss an opportunity to get a firsthand glimpse of Thompson's experiments—and to be his first MS guinea pig.
A couple of months ago, I found myself alone in a small, windowless booth on the leafy Bournemouth campus in Poole, U.K., southwest of London. Three electrodes stuck to my beard along my jawline recorded electrical signals from my facial muscles while I sat in a chair in front of a computer. Following a quick spit into a test tube to measure my baseline cortisol levels, the experiment began. On the screen, a woman repeatedly yawned. Normally, this kind of image would trigger a yawn immediately, but for some reason, I resisted. And then, right at the end of the 3-minute video, a yawn of epic proportions escaped my mouth.
Thompson rushed into the room holding a small plastic tube to spit into. He explained that he planned to compare my cortisol levels from saliva samples taken before and after the experiment. But I couldn't spit. Suddenly I was in the midst of a yawning frenzy that felt like it would never end. Eventually, the waves of yawning subsided long enough for me to spit into the tube, and the test was over.
After squirreling away my sample next to my pre-test spit in a bag to send to the U.S. for analysis, Thompson showed me how he tries to coax a yawn from participants whose minds or bodies stubbornly refuse to yawn in response to the video of the woman. First he tries a series of pictures of yawners, from babies to the elderly, and if that doesn't draw out a yawn, he has participants read a few paragraphs of dry technical text all about yawning.
All of these tricks worked well on me, but apparently do not on everyone: of 82 healthy volunteers, about half didn't yawn at all (J Neurol Neurosci, 6:1-15, 2015).
What the data did clearly show was a significant difference between yawners and non-yawners. The cortisol levels of yawners rose significantly more than those of non-yawners. In addition, the yawners had higher resting levels of cortisol and higher electrical activity in their facial muscles than those who didn't yawn.
Thompson is determined to bring the cortisol hypothesis closer to a full-blown theory. His most recent study used functional magnetic resonance imaging (fMRI) on 13 healthy French volunteers to illuminate how cortisol varies during mental and physical tasks, and how cortisol acts on specific brain regions such as the hypothalamus (J Neurol Neurosci, 7:92, 2016). Thompson's next experiment will also use MRI, but the participants will all have MS. "It would be good to get a picture of whether people with MS have completely different cortisol fluctuations from people who don't," he says.
Central to his argument is fatigue. Whether the result of just having woken up or of having MS, fatigue means lower oxygen saturation in the blood and a higher brain temperature. Thompson reasons that, far from competing with the oxygen explanation, his work expands upon it. Similar to his idea that yawning lowers brain temperature, taking oxygen in lowers body temperature. "So it all could be linked," he says.
Ultimately, Thompson hopes to develop a diagnostic for MS and other neurological diseases based on the connection between cortisol and yawning. But that will take time and resources.


The New Vendere Partners Website is Here!
Welcome to the newly redesigned and improved Vendere Partners website! In addition to sporting a fresh new look, the new VenderePartners.com features the latest and greatest information on Vendere's B2B sales and marketing services and solutions.
Perhaps the most notable additions to our services are our expanded converged sales and marketing services, which include IRENE and comprehensive inbound and outbound sales and marketing services. IRENE is an acronym for Interest, Research, Evaluate, Negotiate, and Engage. It is also the term used for the five e-mails and telemarketing touch points that Vendere uses to take leads from A to Z. Inbound and outbound sales and marketing services include articles, case studies, e-blasts, blog content, social media content, press releases, and tele-prospecting and tele-sales.
Many thanks to our internal team members and the DesL Group team for their hard work in making VenderePartners.com a valuable resource for all those who visit.


The idea of a 'nudge' was first introduced as a behavioral economic concept by Thaler and Sunstein in their book 'Nudge', detailing how small but deliberate changes can influence decision-making in a significant way.
"A prime is a type of nudge, that uses subtle influence to increase the ease with which certain information comes to mind." With the use of a prime, a designer can subtly alter a person's behaviour through eliciting rationality that enables one to achieve long term positive outcomes, without having to implement significant changes.
This provided a guide for the students to dig deep, compelling them to pinpoint the root cause of the problem they just described. Through identifying the root cause of a problem, students were then able to define key opportunity areas that they can work on. These opportunities are translated into 'How might we?' statements, detailing the design opportunities for the project.
A deck of priming strategy cards, designed and developed by Design Incubation Centre, was introduced as a tool to induce the Priming Effect in real-world scenarios. Each card offers an actionable strategy as well as questions that provoke deeper thoughts. Designers can make use of priming strategies as enablers to come up with design inspiration and solutions.
Students were encouraged to find priming strategy cards that were relevant for their 'How might we?' statements and place them on the worksheets provided. As the priming strategy cards serve only as a prompt, the rewriting of the strategies for a more contextualized approach was encouraged. Coupling the 'How might we?' statements with priming strategy cards enabled students to discover new and relevant areas for ideation.
We share the examples of the Priming Strategy Toolkit to give inspiration to designers and students.
Credits to Design Incubation Centre.


text:
An Open Letter to Justin Welby
20 March 2013 20 May 2016 Peter Tatchell Foundation
On the occasion of his enthronement as Archbishop of Canterbury
From Peter Tatchell, human rights campaigner
Archbishop of Canterbury
Lambeth Palace
Dear Archbishop Justin Welby,
Your enthronement as Archbishop of Canterbury and leader of the worldwide Anglican Communion will be an occasion for rejoicing by your faithful.
Like them, I wish you well.
I hope you will use your new authority to guide the church to accept equality and human rights for lesbian, gay, bisexual and transgender (LGBT) people.
Just over a decade ago, you expressed harsh homophobic opinions, condemning gay relationships and the adoption of children by same-sex couples. You may have since revised these views but even now you oppose marriage equality.
One of your first public statements, when you were confirmed as Archbishop of Canterbury last month, was to declare your support for discrimination against gay people: namely your support for the legal ban on same-sex civil marriage.
Moreover, although you have expressed your support for civil partnerships, it is reported that you have not approved civil partnerships taking place in churches or church blessings for same-sex couples.
You claim that you are not homophobic but a person who opposes legal equality for LGBT people is homophobic – in the same way that a person who opposes equal rights for black people is racist.
Homophobia has come to mean more than an irrational fear for gay people. It includes support for anti-gay discrimination and the denial of equal rights to people who are LGBT. In this sense of the word, you are homophobic because you support discrimination in law against gay people.
Discrimination is not a Christian value; regardless of whether this discrimination concerns gender, race, faith, sexual orientation or gender identity.
You say that you are listening to the concerns of the LGBT community but you continue to ignore and reject our claim for equal marriage rights. It does not feel like you are listening. Or perhaps you listening but not hearing?
You are not without precedent with regard to LGBT equality, in the UK and abroad.
Sadly, successive Archbishops of Canterbury have failed to speak out clearly and consistently against LGBT human rights abuses worldwide and against the frequent collusion with these abuses by local Anglicans. Large swathes of the Anglican global communion actively support the persecution of LGBT people, mostly without rebuke.
The Anglican churches of Nigeria and Uganda are supporting draconian new anti-gay bills that are currently before their respective parliaments.
Uganda's Anti Homosexuality Bill intensifies the criminalisation of LGBT people, including life imprisonment for mere sexual touching and the death penalty for repeat gay offenders. It also outlaws same-sex marriage, LGBT organisations and gay human rights advocacy.
Similar repression, excluding the death penalty, is enshrined in the Nigerian Same-Sex Marriage (Prohibition) Bill.
I urge you to speak out against these totalitarian homophobic proposals.
Such concerns aside, I note with encouragement recent statements by you that may indicate a softening of your stance and a greater openness to LGBT equality.
Most commendably, you support strengthening gay relationships and recognise that love between people of the same sex is no less than that of heterosexual couples.
You are quoted as saying: "I know I need to listen very attentively to the LGBT communities, and examine my own thinking prayerfully and carefully."
Indeed, you have indicated that you are open to on-going discussion and dialogue with LGBT people, for which we thank you.
I urge you to show true moral leadership by standing against homophobic discrimination in favour of LGBT equality.
In the name of free speech, I have spoken out against the prosecution of Christian street preachers – even homophobic ones. I have defended persecuted Christians, especially in countries like Saudi Arabia and Pakistan.
I call on you to reciprocate.
It would, I believe, be wrong for you to collude – either consciously or by default – with those fellow Anglicans who reject gay equality.
I ask you: Would you make such compromises on equal rights in the case of ethnic minorities? I expect not. So why should LGBT people be treated differently?
My mother is a devout Christian. She believes that homosexuality is, according to The Bible, a sin; albeit not a major one. Equally, she believes homophobic discrimination is wrong. She makes a distinction between her personal beliefs and the law of the land.
I would, respectfully, urge you to do the same with regard to marriage equality and other legislation.
I understand and appreciate that you want to maintain Anglican unity and prevent a split in the communion. But is sacrificing LGBT equal rights morally justifiable in order to secure this goal? Is it a price worth paying to keep the church united? Should gay human rights be compromised to appease those in the worldwide communion who endorse homophobic persecution and legal discrimination?
I urge you:
Be a moral leader for universal human rights, including the human rights of LGBT people.
Peter Tatchell Foundation
www.PeterTatchellFoundation.org
Religion, UK
Anglican Church, Anglican Communion, Archbishop of Canterbury, Christian, Church of England, civil partnerships, Equal Love, Equal Marriage, Justin Welby, LGBT, LGBT community, LGBT equality, Nigeria, Pakistan, same sex marriage, Saudi Arabia, Uganda.
Pope wrong to meet Mugabe
Archbishop Welby offers to meet Tatchell


Kings Moutain, NC Herald sold.
Gemini Newspapers, Inc., Kings Mountain has announced the sale of its North Carolina holdings to Community First Media, Inc., of Shelby, effective June 27. Gemini acquired the Kings Mountain Herald, The (Cherryville) Eagle and the Belmont/Mt. Holly Banner News in August 2008 from Republic Newspapers, Inc. of Knoxville, TN.
Community First Media is the publisher of Shelby Shopper & Info and the Rutherford Weekly community newspapers.
Gary Greene of Cribb, Greene & Associates of Charlottesville, Va. represented the company in the sale.
Cribb, Greene & Associates is a ninety-one year old newspaper brokerage, appraisal and consulting firm with offices in Helena, MT, Charlottesville, VA and Neosho, MO.


Marketing has evolved over the period of years and now you just don't market a product, you promote and market a 'concept'. More than your marketing tagline or idea, the concept sells. A concept unifies the marketing message with the brand personality and projects it to the audience. The audience are more receptive to a concept than to stand-alone elements. It creates a stronger impact and helps to increase brand recall value as well.
Here, we have listed 20 exhibition stand design inspiration that will help you in picking out the perfect exhibition stand for your next show.
Same goes for below the line marketing activities such as exhibitions, gone are the days when exhibition stand contractors compiled various exhibition stand ideas to create one exhibition stand. Now clients demand creative ideas for their exhibition stands and unique exhibition stand design inspiration that will help them stand out from the crowd. To market their business effectively they take part in exhibitions with help of creative exhibition stand contractors in Germany. It is essential to promote the event that you are participating in, but for that, you need the best exhibition graphics that will help you stand out from the crowd. You also need to support it before and after the event through various marketing techniques. This will enable you to generate qualified leads for your business.
Not any novice can come up with good exhibition stand design inspiration and be competent enough to execute it. You need a team of experienced and skilled team of designers that understand your limitations, space constraints and most importantly your brand personality and your core brand values. Only then can they create stand designs that will help you achieve your marketing goals. Large exhibition stands helps to present the stand design in a unique, creative and precise way which will help your brand to truly shine through the crowd. If your company is facing budget constraint issues then you opt for small exhibition stands too by uniquely representing your brand at the event. For this, you might require to reach out to potential professionals who will help you make a good impact on your target audience.
Creating awareness through your stand design will help in generating sales as well as build interest among your target audience. It is essential to building a balance between the company services and the company notion while you plan to promote your business through exhibition stands. There are several companies who prefer having a traditional type but it is important to remember that innovative exhibition stand designs can do wonders at the event. Before actually planning to buy a customizable exhibition stand, the organization needs to take into consideration a few aspects such as price and the overall expense, the colour and the detailing. Doing a competitive research of the market and understanding the latest trends in the industry. A professional exhibition stand designer will be well-acquainted with the latest trends and help you design an eye-catching exhibition stand for the event.
There are many exhibition stand builders that claim to provide you with the exclusive and unique design concept. They might even provide you with inspired 3D designs raising your expectation only to fail you on the D-day with their substandard quality. Hence, it is important that you do your background research and know exactly want to want for your show. Also, look for an exhibition company that provides a comprehensive package of services right from design to installation of your stands. This will enable you to have a stress-free exhibiting experience. When you have some knowledge and are clear about your requirements it not only becomes easier to communicate with the stand builder but you can yourself come up with insightful inputs since no one knows your brand better than you do.


Quartz unisex wristwatch MK5535 with stainless steel case, with diameter 42 mm, silver dial and silver stainless steel band.
Alles Bestens, gerne wieder bei Bedarf.
Vi ringrazio per la vostra professionalità e precisione,orologio perfetto!


text:
Brooke Wahlberg Named a "Rising Star in Environmental Law"
Brooke Wahlberg, a Partner in Nossaman's Environment & Land Use Group, was one of only five attorneys nationally that was recognized by Law360 as a "Rising Star" for 2019 in the environmental law category. The awards recognize a select group of attorneys under 40 "whose legal accomplishments transcend their age."
In the Law360 feature on Brooke, the publication noted that she is a "go-to authority" helping clients navigate through the "maze of wildlife and environmental compliance" which contributed to her being chosen for the "Rising Star" honor. The feature also highlights Brooke's work on a number of projects, including the establishment of a five-state species conservation bank developed to provide ready mitigation for project proponents impacting species.
When asked what she enjoys most about her work, Brooke said "I really like being able to problem solve…I take joy in helping people be less stressed about something or feeling more comfortable about the choices they're making."
For the full article on Brooke, click here (subscription required).
Brooke Marcus Wahlberg
Endangered Species & Wildlife Law


text:
News Biofuel Biofuels
ExxonMobil invests in Global Clean Energy Holdings to advance renewable diesel production, camelina expansion
February 10, 2022 By Global Clean Energy Holdings
Global Clean Energy Holdings, Inc. is advancing its renewable diesel production through an agreement with ExxonMobil, which will invest $125 million with an option to acquire up to a 25 per cent equity stake in the company. The investment, outlined in filings with the U.S. Securities and Exchange Commission, will help Global Clean Energy grow its proprietary camelina business in key farming regions in the United States and accelerate expansion into Europe and South America.
"This strategic investment by ExxonMobil is transformational for GCE and will enable the rapid expansion of our proprietary camelina business. It also demonstrates the long-term commitment of both organizations to develop ultra-low-carbon, nonfood-based feedstocks and advanced biofuels," said Richard Palmer, CEO of Global Clean Energy Holdings. "Throughout our four years working together, ExxonMobil has actively supported our feedstock deployment efforts in multiple U.S. growth regions."
GCE's Sustainable Oils subsidiary is the leading global producer of camelina, a fast-growing, nonfood oilseed crop planted during fallow rotations by farmers without impact to their primary crops. Based on analysis of California Air Resources Board data, renewable diesel from various non-petroleum feedstocks can reduce life-cycle greenhouse gas emissions by
approximately 40 per cent to 80 per cent compared to petroleum-based diesel used in engines on the road today.
"We are investing in a number of technologies and initiatives that can reduce greenhouse gas emissions from vital sectors of the global economy, and are progressing lower-emission fuels to help industries like heavy transportation, marine and aviation," said Ian Carr, president of ExxonMobil Fuels and Lubricants Company. "Our agreement with GCE is an example of how we are leveraging our significant resources, technology and capabilities to deliver more renewable fuels to help customers reduce their emissions."
GCE has an existing commercial agreement with ExxonMobil for more than four million barrels of drop-in renewable diesel from GCE's California biorefinery, which is on track to begin production later this year.
GCE was represented by investment banks Stifel and Raymond James; financial advisor Ocean Park, and King & Spalding LLP acted as outside counsel. The investment was executed on Feb. 02, 2022, with an expected financial closing by the end of February 2022, following customary HSR review. The investment includes an additional $40 million in equity and debt by GCEH's existing lenders led by Orion Infrastructure Capital for a total investment of $165 million.
Aemetis announces 'Carbon Zero' plants designed to produce renewable jet fuel
Covenant Energy makes key appointments tied to its renewable diesel fuel project
Canada launches its $1.5-billion Clean Fuels Fund, calling for project proposals
Aemetis signs $2B agreement to engineer carbon zero plant
Global Clean Energy Holdings
Aemetis signs agreement with Japan Airlines to supply 90M gallons of SAF
Drax starts operations at Leola, Arkansas pellet plant


Enriched with vitamin C and antioxidants, its Berry Mix Complex™ offers a nutritiously sweet and fragrant blend of raspberry, strawberry, cranberry, and blueberry extracts to indulge the senses. Exclusive Moisture Wrap™ technology boasts hyaluronic acid and minerals to form a protective film over the lips to lock in moisture and active ingredients.
Berry Mix Complex Rich in Vitamin C and antioxidants from a nutritious blend of raspberries, strawberries, cranberries, goji berries and blueberries, Berry Mix Complex soothes and softens, revealing smooth, supple lips.
Directions Apply generously and leave on overnight. Gently wipe off remains next morning.


text:
Holocryptis ussuriensis är en fjärilsart som beskrevs av Hans Rebel 1901. Holocryptis ussuriensis ingår i släktet Holocryptis och familjen nattflyn. Inga underarter finns listade i Catalogue of Life.

Källor

Nattflyn
ussuriensis

redpajama_set_name: RedPajamaWikipedia


The Visitor Services Associate supports the daily operations and frontline experience for all visitors to the Walters across three entrances and throughout the Museum to create a welcoming atmosphere, greet and assist visitors' with various needs; provide basic information about the museum collection and campus; and resolve routine customer issues and complaints.
The Manager of Visitor Services oversees the daily operations of the frontline experience for all visitors to the Walters, ensuring staff presence in Visitor Information areas across three entrances and throughout the Museum to create a welcoming atmosphere, greet and assist with visitors' various needs; provide basic information about the museum collection and campus; and resolve routine customer issues and complaints.
Ticket Agents represent the face of the BSO and are responsible for all aspects of customer service, including but not limited to subscription sales, single ticket sales, exchanges and resolving customer issues by phone, e-mail/web, mail, fax and in person for all BSO venues, including the Joseph Meyerhoff Symphony Hall and the Music Center at Strathmore. Ticket Agents must possess a friendly, service oriented demeanor and be willing to go above and beyond to assist BSO patrons. Must be flexible and willing to work daytime, evening and weekend hours.


text:
Herpetology Colleges In Kolkata
KOLKATA: Alipore zoo's tryst with new guests is far from. Samanta said that they had first placed the proposal with the Madras-based reptile zoo and herpetology research station. "They had approved.
KOLKATA: You can get to see four yellow anacondas at Alipore zoo from August. The anacondas, which will be brought to the zoo mid-June from Madras Crocodile Bank and Centre for Herpetology in.
BARIPADA: Governor M C Bhandare will inaugurate a school of herpetology at the North Orissa University (NOU. joined teaching and research programmes in Indian universities and colleges. Besides,
The Madras Crocodile Bank Trust and Centre for Herpetology is one of the largest reptile zoos in the world and their aim is to promote the conservation of reptiles and amphibians. By the 1990s there.
has been named Smithophis atemporalis after eminent British herpetologist Malcolm Arthur Smith for his immense contribution to Indian herpetology. Although new to science, the discovery is locally.
GUWAHATI: A new frog species was found by herpetology researchers – Jayaditya Purkayastha. was one of the pioneers of amphibian research in the region and head of the Aryavidyapeeth College zoology.
I had a class in college-herpetology-and I admired Steve for his ease and careful. Thanks for the adventure Steve. Vittal I., Kolkata, India: I was returning from work when I got news of Steve.
A naturalist and conservation biologist, Chirag Roy was born in Kolkata, India, and did his schooling in Darjeeling. "He worked a lot with snakes, in the field of herpetology, and was a well known.
However, the neural network couldn't come up with a specific factor. "Then we figured it out," Burbrink, associate curator with the department of herpetology at the American Museum of Natural History,
The Madras Crocodile Bank Trust and Centre for Herpetology, which is researching venom and anti-venom, has planned to educate people of Tamil Nadu, Maharashtra, Jharkhand, Orissa, Bihar, Madhya.
It is two weeks since a Komodo dragon began to be displayed prominently at a special enclosure at The Madras Crocodile Bank Trust and Centre for Herpetology in Mamallapuram. The reptile is one of four.
Some of the thrust areas of study at the zoology department of GU include ecology, conservation biology, wildlife biology, herpetology, ornithology, biodiversity monitoring, biodiversity assessment.
The research findings were recently published in the journal Herpetology Notes by scientists associated with the Zoological Survey of India (ZSI), Kolkata. "Sighting of our target animals is very rare.
The research findings of the study on temple ponds were recently published in the journal Herpetology Notes by scientists associated with the Zoological Survey of India (ZSI), Kolkata. "Sighting of.
He then began reading up on how to cure avian diseases, borrowing books from the Bombay Veterinary College library. to volunteer every summer at the Madras Crocodile Bank Trust (an herpetology.
College and university students are also being trained by senior scientists on specific avenues such as herpetology (study of reptiles and amphibians) and entomology (insects) so that they can also be.
With no prior knowledge in herpetology, jawans posted at the Panisagar sector would often find themselves helpless in cases of snakebites. The area is thickly forested and has an abundance of cobras,
Concept Formation And Classification In Social Science
Ecology Action San Jose


I'm continually amazed at the curious phenomenon common to the legal profession, where we anoint to celebrity status certain lawyers who appear to have mastered a particular subject matter. It goes beyond wishful thinking and bleeds into blind optimism that somehow we are as world-famous, if not world-class, as we think. I visited four cities during one busy week recently, meeting with something like twenty law firm clients of all shapes and sizes to discuss trends in legal marketing and business development. In separate conversations at three different firms, legal marketers described one of their top lawyers as "One of the best, if not the best, in the country in this practice area." This would be a startling coincidence, as the cities and firms I visited could best be described as a random sample from the NLJ 250. What are the odds that of all the practice areas, and of all the firms in this group offering these practice areas, and of all of the lawyers in these firms engaged in these practice areas, I was sufficiently fortunate to cross paths with the top practitioner three separate times? Astounding!
The stark reality is that not every accomplished lawyer is a celebrity. And even those who have mastered their domain and are indeed shining lights in the profession are often little more than transient blips in the daily lives of the business professionals who hire them. Ouch.
I've written previously about this concept, which hearkens back to our school days. Imagine the coolest guy or the most popular gal in your high school. Now imagine your hero transplanted overnight to a different school a thousand miles away. Will Miss Popular or Mister Big Man on Campus be afforded the same privileges and adoration by the fawning class immediately upon arrival? Isn't it more likely that some measure of their "success" is a function of time and location and isn't readily transferable, at least not immediately? I say this with the greatest amount of respect for the exemplary credentials and accomplishments of the many lawyers I've hired and on whom I've relied over the years in my corporate career: I simply can't recall your names, even though by and large I valued your contribution in addressing my business issues.
A couple years ago I gave a talk to a group of lawyers assembled for a conference in a South American country. After I had returned to the airport and while sitting in the business lounge awaiting my flight home, I suddenly became aware of a large number of thick-necked men in dark suits roaming about and a growing sense of hustle in the airport staff. One beefy man was evidently assigned to watch me, as he stood a short distance away gazing alertly in my direction. In time a private plane pulled up on the tarmac outside the ground floor lounge and a non-descript man in a natty suit disembarked and was accompanied into the lounge by several stern men, and when the bags were retrieved they all disappeared in a flash out a side door. To this day I have no idea who this dignitary was, although he was clearly of some importance to the locals. However, I have a distinct recollection of annoyance, as whoever he was delayed all air traffic for a short time, including my departure, which put my later connecting flight at risk.
This anecdote came to mind recently when I was chatting with a General Counsel after we participated on a panel discussion together. We were both invited to speak at a law firm partner retreat, sharing anecdotes and best practices between in-house counsel and outside counsel. She admitted some reluctance, because though she had recently concluded a successful and quite large transaction with the firm's help, she was not delighted with the performance of one of the senior partners. He and his team delivered excellent legal advice, she reported, but she was constantly chasing the partner for budget updates and she was regularly negotiating invoices that reflected much higher fees than she had agreed to. Each conversation followed a predictable path: the partner would patiently (and somewhat patronizingly, she added) explain why the nature and complexity of the transaction allowed little predictability, and the partner claimed that other clients happily paid his fees because he delivered the desired results. The partner would then agree to write down a portion of the invoice and the cycle would repeat the following month.
But it was the other predictable conversation that troubled her more: the divisional CFO would request a quarterly budget update for her transactions, the invoices on this matter would exceed budget every quarter, and even when she negotiated a write-down and added cushion she was left in the unfortunate position of explaining and justifying the budget exceptions. Again and again. To the person who signs her paycheck. Not surprisingly, the CFO didn't know the sterling reputation of the lawyer, didn't have an appreciation for the complexity of the legal matter and accordingly at the conclusion of the transaction he strongly suggested that this lawyer not be re-hired for future work based on his "poor" performance.
While there are several learning opportunities here, a key takeaway is the lawyer's misguided sense of importance in the client's operation. His lack of interest in providing budget predictability was, to the ultimate buyer of the lawyer's services, an indication of poor performance. The renowned reputation of the lawyer, the presumably high quality of legal work product and the successful conclusion of past engagements meant little. Too often lawyers lose business without realizing it. My friend the GC wasn't planning to "fire" the lawyer but she would protect her integrity and her future legal budgets by simply not re-hiring this particular partner. She was, she shared to little surprise, inundated with unsolicited approaches from other capable lawyers who might deliver the same result but with less surprise and stress. It wasn't the overall cost, she reiterated, it was the constant uncertainty and failure to adhere to a budget that troubled her.
At a recent conference held at the Opryland Hotel outside Nashville, I was dashing to a very early breakfast meeting when I passed a young man in a cowboy hat strumming a guitar while sitting alone in an empty side lobby. "What a curious time and place for the hotel to arrange entertainment," I thought as I sped by. When I returned an hour later, this same young man was at the head of a long line, signing autographs and posing for photographs. As it turns out, he was a well-known country music star who had just concluded an interview on the Grand Ole Opry radio station conveniently located within the hotel (who knew?). Several dozen fans came out to hail the star and he caused quite a commotion. Don't ask me who he was, because the sum total of what I know about country music and its talented stars could be written on a guitar pick. But that's the point. I wasn't this young man's target audience so to me he was merely a curious diversion on the walk back to my hotel room.
Whether you're a practicing lawyer who believes that you're a star in your field, or a marketer asked to cater to the needs of one of these many stars, be sure to first ask some tough questions: Am I selling only a reputation or am I selling solutions to my client's business challenges? Have I confirmed what constitutes a quality work product for this client on this engagement? Am I confident that my contact and the person who pays the legal bills share the same definition of quality work product? Am I working as hard to keep this client satisfied as I worked to win this client in the first place?
It's hard work to achieve the many accolades and laurels that accomplished lawyers are awarded. But let's be sure not to rest on those laurels, particularly if there are hungry rivals waiting to delight your clients. Your reputation alone may not be sufficient to win, and keep, work from dissatisfied clients. And it might might be humbling, but extraordinarily helpful, to acknowledge that your reputation might not mean all that much in the first place.


text:
Лора Фиджи (нид. Laura Fygi; род. 27 августа 1955 года) — нидерландская певица.

Биография

Лора Фиджи родилась 27 августа 1955 года в столице Нидерландов Амстердаме в семье голландца и египтянки. Однако впоследствии семья эмигрировала, и до восьми лет будущая джазистка жила с родителями в Южной Америке. Лора Фиджи входила в состав одной из самых популярных голландских синти-поп групп 80-х Centerfold с 1984 по 1989. На счету коллектива один лонгплей — Man's Ruin, увидевший свет в 1986 году. В 1990 году становится сольной исполнительницей. Лора Фиджи совместно с Мишелем Леграном записала альбом «Watch What Happens» (1997).

В 2010-х плотно сотрудничает с китайскими представителями музыкальной индустрии, в частности, альбом Flower частично записан на китайском языке и промотировался именно в этой стране. Но и по завершении работы над альбомом и его промокампании певица не потеряла связи: так, новый, 2017-й, год — по китайскому календарю — певица встретила на приеме в китайском посольстве по приглашению посла Ву Кена.

Сольные альбомы

Номерные альбомы
 1991 — Introducing
 1993 — Bewitched
 1994 —The Lady Wants to Know
 1995 — Turn out the Lamplight
 1997 — Watch What Happens (When Laura Fygi Meets Michel Legrand)
 2000 — The Latin Touch
 2001 — Change
 2004 — The Very Best Time of Year (рождественский альбом)
 2007 — Rendez-vous
 2011 — The Best is Yet to Come
 2012 — Flower
 2016 — Jazz Love

Концертные альбомы
 1998 Laura Fygi Live
 2003 Live at Ronnie Scott's
 2003 — Live At North Sea Jazz Festival

Сборники
 1999 — The Best Of Laura Fygi

 2009 Songs from Movies & Musicals
 2015 — Laura Fygi — 25th Anniversary Collection (выход сборника 17 марта 2015 приурочен к 25-летнему юбилею в статусе сольной исполнительницы)

Примечания

Певцы и певицы Нидерландов
Певцы и певицы на испанском языке


Rent A 10 Cubic yard dumpster rental service in New Jersey it can hold 10 cubic yards of waste or rubbish. The measurements of a typical 10 yard roll-off container is 12 foot long by 8 foot wide by 3.5 foot high. This 10-Cu. yd. (NJ HOMEOWNER SPECIAL) delivery is perfect for a smaller clean-up projects and junk removal around the house that may be too much to mix with your household garbage that the weekly hauler picks up. This dumpster is available in New Jersey and can hold waste and junk, construction debris and is ideal for cleaning out your garage, basement or attic. It may be just fine for a new bathroom, roofing material. concrete, asphalt as well. This dumpster is smaller and is ideal for tight driveways. It holds about five pick-up truck loads. Select which county in New Jersey dumpster delivery.
Rent A 20 Cubic yard container dumpster in New Jersey it holds 20 cubic yards of waste or junk. The measurements of a typical 20 yard roll-off container dumpster is 22 foot long by 8 foot wide by 4 foot high. This 20-Cu. yd. is our most popular size. This dumpster container delivery is available in Northern NJ is perfect for residential & commercial, and ideal for a number of projects such as new construction, smaller demolition projects, new kitchens, new bathroom, a bigger estate clean up, windows, siding, landscaping, recycling, land clearing, junk removal, roofing material, deck removal and an attic, basement or garage clean-out that hasn't been cleaned up in years. Rent a dumpster and put all your trash, waste, construction & demolition debris, furniture, windows, doors, stumps, tree wood, wood chips inside. Select county where roll off dumpster service in New Jersey is needed.
Order online 30 Cubic Yard Dumpster in New Jersey for Roll-Off Container Service for Northern New Jersey .
Rent A 30 Cubic yard dumpster container rental service in NJ it holds 30 cubic yards of debris or waste. The measurements of a typical 30 yard roll-off container is 22 foot by 8 foot wide by 6 foot high. This 30-Cu. yd. container dumpster delivery is available in Northern NJ is great for new home construction and larger projects, add-a-level, home clean-up projects that may have a lot of furniture, carpet removal or appliances involved. Also used for tearing down porticos, small garages, decks, land clearing, landscaping. This dumpster container can hold a lot of trash for all of your junk removal. You can even demolish a large shed, remove above ground pool and load the dumpster. Free quote select New Jersey County then type of waste material going into dumpster.
Renta A 40 Cubic yard roll-off container dumpster New Jersey holds 40 cubic yards of debris, junk or waste. The measurements of a typical 40 yard roll-off container dumpster is 22 foot by 8 foot wide by 7 foot high. This 40-Cu. yd. dumpster delivery service is a popular one in New Jersey for new construction jobs, demolition sites, house clean-outs and recycling, farm and estate clean-ups & factory sites. NJ Dumpster is for clean-out service of houses, farms, factories, garages commercial sites for rubbish removal and disposal of roofing, construction and demolition debris, scrap metal recycling, junk cars, old furniture, carpet removal, insulation, and railroad ties. This dumpster container is huge make sure you have enough room in your driveway for this one...Most of our clients use these for offices, apartments, estates, construction and demolition debris, scrap metal, furniture, windows & doors, stumps…call NJ Dumpster Rentals 1.800.567.5804 save money on you next dumpster delivery and pick-up in New Jersey.


sportsmagic.com.au is committed to protecting your privacy and we make it our absolute priority.We use the information we collect about you to process your order(s) and to provide you with the most enjoyable shopping experience.If you have made payment via credit card over the phone all documentation displaying credit card details including card number, expiry dates and security numbers are all destroyed.
When you place an order(s), we need to know your name, email address, billing and mailing addresses, credit card number, and expiration date.This information is necessary to complete your order and to notify you of your order status.
We may also use your personal information to provide you with information about other services offered by us.If you would prefer not to receive promotional or other material from us, please let us know and we will respect your request.
Your orders are processed through the use of a secure server.The fully secure server software encrypts all information you input before it is sent to us.All of the customer data we collect is protected against unauthorised access.
(C) to protect the rights, property or safety of Sportsmagic.com.au, our users, or others.
We are bound by and comply with the National Privacy principles as provided in the Federal Privacy Act 1988.By using our website you consent to the collection and use of this information by Sportsmagic.com.au.If we decide to change our policy, we will post those changes on our website Sportsmagic.com.au so that you are aware of what information we collect, how we use it and under what circumstances we disclose it.


Linux Lite users are among the first to try the recently released Linux 5.0 kernel on their computers powered by one of the supported Linux Lite releases.
Released last weekend, Linux kernel 5.0 is a major milestone with minor improvements. Linux Lite developer and founder Jerry Bezencon is usually among the first to offer a new major kernel series to his users, and you can now install the Linux 5.0 kernel series on Linux Lite 4.x and 3.x series.
Highlights of Linux kernel 5.0 include FreeSync support in for AMD GPUs for a stutter-free viewing experience on LCDs with dynamic refresh rates, a new energy-aware scheduling feature for ARM big.LITTLE CPUs, support for swap files in the Btrfs file system, and support for the Adiantum file system encryption for low power devices.
If you're running Linux Lite 4.x or Linux Lite 3.x series, you can now install the Linux 5.0 kernel on your computers by going to Applications Menu > System > Lite Tweaks and selecting the Kernel Installer. Alternatively, you can run the commands listed below in a terminal emulator.
Once the Linux 5.0 kernel packages have been successfully installed, you'll have to reboot your computer for the changes to take effect. Of course, we remind you that you should only install this kernel if need support for some specific hardware components that aren't supported by older kernel versions.
"If you use proprietary drivers, this kernel may break functionality with those drivers. If you have proprietary drivers installed and you still decide to go ahead with this kernel install, you should be competent in repairing your drivers. If you aren't, DO NOT install this kernel," said developer Jerry Bezencon.


text:
— японская традиция, широко распространённая в сельской местности с ранних лет периода Эдо (1603) до начала периода Мэйдзи (1868) и соблюдавшаяся в некоторых частях Японии вплоть до середины XX века. Традиция позволяла молодым людям скрытно проникать в дома девушек по ночам и вступать с ними в половую связь с согласия партнёрши и с молчаливого согласия её родителей.

Описание
«Ночное посещение» в традиционном понимании заключалось в том, что молодые неженатые мужчины могли ночью проникать в дома, где проживали молодые незамужние женщины. Бесшумно пробравшись в покои женщины, раздетый мужчина давал понять о своих намерениях, и если получал согласие, они вступали в половую связь. К утру мужчина должен был уйти. Родители девушки делали вид, что не знают о ночном визитёре, даже если это было не так. Несмотря на поддерживаемую всеми видимость секретности, о встречах, как правило, было известно заранее как её непосредственным участникам, так и родителям женщины, которые оставляли входную дверь открытой и намеренно оставляли девушку в комнате одну. После ночного посещения, закончившегося беременностью партнёрши, от пары требовалось вступить в брак, однако если ребёнок всё же рождался вне брачных уз, то он принимался в семью матери. Официальными родителями в таком случае «назначались» родители матери-одиночки. С учётом того, что до начала периода Мэйдзи у японских простолюдинов даже не было фамилий, личность отца в этих условиях практически не имела значения.

Согласно этнографу Акамацу Кисукэ, традиция «ёбаи» могла отличаться в некоторых деталях в зависимости от региона. Кисукэ разделял «ночные посещения» на три вида: закрытые — в которых девушкам разрешалось принимать молодых людей только из той же самой деревни; открытые — когда девушкам разрешалось принимать жителей других деревень и совершеннолетних проезжих, как женатых, так и холостых; полуоткрытые — являвшие собой различные комбинации из первых двух видов.

История
С установлением сёгуната Токугава японское общество было сильно бюрократизировано и поделено на социальные классы: самураи, ремесленники, купцы и крестьяне. Местные власти записывали социальный класс каждой семьи в , следили за тем, чтобы дети, рождённые в этой семье, не могли вступить в брак с членом другого социального класса. В связи с этим в Японии, особенно в высших социальных слоях, были широко распространены браки по договорённости. У простолюдинов, напротив, существовала относительная свобода выбора партнёра, и традиция «ночного посещения», после которой молодые люди нередко вступали в брак, рассматривалась родителями девушки как один из способов выдать дочь замуж. Наиболее широко традиция была распространена на юго-западе страны, где патриархальные устои были не столь сильны, в отличие от севера, и понятие моногамного брака было весьма условным.

С падением сёгуната социальные классы были отменены, и для вступления в брак уже не требовалось разрешения властей. Тем не менее значительная часть населения, особенно в сельской местности, продолжала практику браков по договорённости, негласно включавшую традицию «ночных посещений». Однако государственная политика единобрачия изменила общественное отношение к «ёбаи» с позитивного или нейтрального на негативное, и «ночные посещения» стали осуждаться как аморальные. По мере индустриализации страны традиция ещё сохранялась в сельских и горных районах страны вплоть до середины XX века, но в итоге уступила романтическим свиданиям в «отелях для влюблённых», банях и на курортах.

Примечания

Японские обычаи
История сексуальности


Thames Valley Police has issued a warning following reports of a high powered laser shone at aircraft over the past four months.
Lives are being put at risk in the skies over West Berkshire following a number of incidents in which a laser has been shone at civilian and military aircraft.
Officers are appealing for witnesses to all of the incidents and people in the community are being encouraged to ring police immediately if they become aware of a sighting of a laser in the sky, to allow officers to respond while the incident is ongoing.
PC Darryl MacAndrew said: "These are very serious incidents which carry a high level of risk that could ultimately prove fatal. Pilots can become dazzled by lasers which can put the aircraft at risk.
Laser pointers such as the one above that can shine up to 12km distance are legal to sell, buy and own in the UK. However, it is an offence to shine them at people, cars and aircraft and to use them in an anti-social manner according to police sources.
Police are appealing to anyone with any information about the incidents please call the 24-hour Thames Valley Police enquiry centre on 101 or call 999 if a crime is in progress.