text:
/*
Package cache implements data structures used by the kubelet volume manager to
keep track of attached volumes and the pods that mounted them.
*/
package cache

import (
	"fmt"
	"sync"

	v1 "k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/types"
	utilfeature "k8s.io/apiserver/pkg/util/feature"
	"k8s.io/klog/v2"
	"k8s.io/kubernetes/pkg/features"
	"k8s.io/kubernetes/pkg/volume"
	"k8s.io/kubernetes/pkg/volume/util"
	"k8s.io/kubernetes/pkg/volume/util/operationexecutor"
	volumetypes "k8s.io/kubernetes/pkg/volume/util/types"
)

// ActualStateOfWorld defines a set of thread-safe operations for the kubelet
// volume manager's actual state of the world cache.
// This cache contains volumes->pods i.e. a set of all volumes attached to this
// node and the pods that the manager believes have successfully mounted the
// volume.
// Note: This is distinct from the ActualStateOfWorld implemented by the
// attach/detach controller. They both keep track of different objects. This
// contains kubelet volume manager specific state.
type ActualStateOfWorld interface {
	// ActualStateOfWorld must implement the methods required to allow
	// operationexecutor to interact with it.
	operationexecutor.ActualStateOfWorldMounterUpdater

	// ActualStateOfWorld must implement the methods required to allow
	// operationexecutor to interact with it.
	operationexecutor.ActualStateOfWorldAttacherUpdater

	// AddPodToVolume adds the given pod to the given volume in the cache
	// indicating the specified volume has been successfully mounted to the
	// specified pod.
	// If a pod with the same unique name already exists under the specified
	// volume, reset the pod's remountRequired value.
	// If a volume with the name volumeName does not exist in the list of
	// attached volumes, an error is returned.
	AddPodToVolume(operationexecutor.MarkVolumeOpts) error

	// MarkRemountRequired marks each volume that is successfully attached and
	// mounted for the specified pod as requiring remount (if the plugin for the
	// volume indicates it requires remounting on pod updates). Atomically
	// updating volumes depend on this to update the contents of the volume on
	// pod update.
	MarkRemountRequired(podName volumetypes.UniquePodName)

	// SetDeviceMountState sets device mount state for the given volume. When deviceMountState is set to DeviceGloballyMounted
	// then device is mounted at a global mount point. When it is set to DeviceMountUncertain then also it means volume
	// MAY be globally mounted at a global mount point. In both cases - the volume must be unmounted from
	// global mount point prior to detach.
	// If a volume with the name volumeName does not exist in the list of
	// attached volumes, an error is returned.
	SetDeviceMountState(volumeName v1.UniqueVolumeName, deviceMountState operationexecutor.DeviceMountState, devicePath, deviceMountPath string) error

	// DeletePodFromVolume removes the given pod from the given volume in the
	// cache indicating the volume has been successfully unmounted from the pod.
	// If a pod with the same unique name does not exist under the specified
	// volume, this is a no-op.
	// If a volume with the name volumeName does not exist in the list of
	// attached volumes, an error is returned.
	DeletePodFromVolume(podName volumetypes.UniquePodName, volumeName v1.UniqueVolumeName) error

	// DeleteVolume removes the given volume from the list of attached volumes
	// in the cache indicating the volume has been successfully detached from
	// this node.
	// If a volume with the name volumeName does not exist in the list of
	// attached volumes, this is a no-op.
	// If a volume with the name volumeName exists and its list of mountedPods
	// is not empty, an error is returned.
	DeleteVolume(volumeName v1.UniqueVolumeName) error

	// PodExistsInVolume returns true if the given pod exists in the list of
	// mountedPods for the given volume in the cache, indicating that the volume
	// is attached to this node and the pod has successfully mounted it.
	// If a pod with the same unique name does not exist under the specified
	// volume, false is returned.
	// If a volume with the name volumeName does not exist in the list of
	// attached volumes, a volumeNotAttachedError is returned indicating the
	// given volume is not yet attached.
	// If the given volumeName/podName combo exists but the value of
	// remountRequired is true, a remountRequiredError is returned indicating
	// the given volume has been successfully mounted to this pod but should be
	// remounted to reflect changes in the referencing pod. Atomically updating
	// volumes, depend on this to update the contents of the volume.
	// All volume mounting calls should be idempotent so a second mount call for
	// volumes that do not need to update contents should not fail.
	PodExistsInVolume(podName volumetypes.UniquePodName, volumeName v1.UniqueVolumeName) (bool, string, error)

	// VolumeExistsWithSpecName returns true if the given volume specified with the
	// volume spec name (a.k.a., InnerVolumeSpecName) exists in the list of
	// volumes that should be attached to this node.
	// If a pod with the same name does not exist under the specified
	// volume, false is returned.
	VolumeExistsWithSpecName(podName volumetypes.UniquePodName, volumeSpecName string) bool

	// VolumeExists returns true if the given volume exists in the list of
	// attached volumes in the cache, indicating the volume is attached to this
	// node.
	VolumeExists(volumeName v1.UniqueVolumeName) bool

	// GetMountedVolumes generates and returns a list of volumes and the pods
	// they are successfully attached and mounted for based on the current
	// actual state of the world.
	GetMountedVolumes() []MountedVolume

	// GetAllMountedVolumes returns list of all possibly mounted volumes including
	// those that are in VolumeMounted state and VolumeMountUncertain state.
	GetAllMountedVolumes() []MountedVolume

	// GetMountedVolumesForPod generates and returns a list of volumes that are
	// successfully attached and mounted for the specified pod based on the
	// current actual state of the world.
	GetMountedVolumesForPod(podName volumetypes.UniquePodName) []MountedVolume

	// GetGloballyMountedVolumes generates and returns a list of all attached
	// volumes that are globally mounted. This list can be used to determine
	// which volumes should be reported as "in use" in the node's VolumesInUse
	// status field. Globally mounted here refers to the shared plugin mount
	// point for the attachable volume from which the pod specific mount points
	// are created (via bind mount).
	GetGloballyMountedVolumes() []AttachedVolume

	// GetUnmountedVolumes generates and returns a list of attached volumes that
	// have no mountedPods. This list can be used to determine which volumes are
	// no longer referenced and may be globally unmounted and detached.
	GetUnmountedVolumes() []AttachedVolume

	// MarkFSResizeRequired marks each volume that is successfully attached and
	// mounted for the specified pod as requiring file system resize (if the plugin for the
	// volume indicates it requires file system resize).
	MarkFSResizeRequired(volumeName v1.UniqueVolumeName, podName volumetypes.UniquePodName)

	// GetAttachedVolumes returns a list of volumes that is known to be attached
	// to the node. This list can be used to determine volumes that are either in-use
	// or have a mount/unmount operation pending.
	GetAttachedVolumes() []AttachedVolume
}

// MountedVolume represents a volume that has successfully been mounted to a pod.
type MountedVolume struct {
	operationexecutor.MountedVolume
}

// AttachedVolume represents a volume that is attached to a node.
type AttachedVolume struct {
	operationexecutor.AttachedVolume

	// DeviceMountState indicates if device has been globally mounted or is not.
	DeviceMountState operationexecutor.DeviceMountState
}

// DeviceMayBeMounted returns true if device is mounted in global path or is in
// uncertain state.
func (av AttachedVolume) DeviceMayBeMounted() bool {
	return av.DeviceMountState == operationexecutor.DeviceGloballyMounted ||
		av.DeviceMountState == operationexecutor.DeviceMountUncertain
}

// NewActualStateOfWorld returns a new instance of ActualStateOfWorld.
func NewActualStateOfWorld(
	nodeName types.NodeName,
	volumePluginMgr *volume.VolumePluginMgr) ActualStateOfWorld {
	return &actualStateOfWorld{
		nodeName:        nodeName,
		attachedVolumes: make(map[v1.UniqueVolumeName]attachedVolume),
		volumePluginMgr: volumePluginMgr,
	}
}

// IsVolumeNotAttachedError returns true if the specified error is a
// volumeNotAttachedError.
func IsVolumeNotAttachedError(err error) bool {
	_, ok := err.(volumeNotAttachedError)
	return ok
}

// IsRemountRequiredError returns true if the specified error is a
// remountRequiredError.
func IsRemountRequiredError(err error) bool {
	_, ok := err.(remountRequiredError)
	return ok
}

type actualStateOfWorld struct {
	// nodeName is the name of this node. This value is passed to Attach/Detach
	nodeName types.NodeName

	// attachedVolumes is a map containing the set of volumes the kubelet volume
	// manager believes to be successfully attached to this node. Volume types
	// that do not implement an attacher interface are assumed to be in this
	// state by default.
	// The key in this map is the name of the volume and the value is an object
	// containing more information about the attached volume.
	attachedVolumes map[v1.UniqueVolumeName]attachedVolume

	// volumePluginMgr is the volume plugin manager used to create volume
	// plugin objects.
	volumePluginMgr *volume.VolumePluginMgr
	sync.RWMutex
}

// attachedVolume represents a volume the kubelet volume manager believes to be
// successfully attached to a node it is managing. Volume types that do not
// implement an attacher are assumed to be in this state.
type attachedVolume struct {
	// volumeName contains the unique identifier for this volume.
	volumeName v1.UniqueVolumeName

	// mountedPods is a map containing the set of pods that this volume has been
	// successfully mounted to. The key in this map is the name of the pod and
	// the value is a mountedPod object containing more information about the
	// pod.
	mountedPods map[volumetypes.UniquePodName]mountedPod

	// spec is the volume spec containing the specification for this volume.
	// Used to generate the volume plugin object, and passed to plugin methods.
	// In particular, the Unmount method uses spec.Name() as the volumeSpecName
	// in the mount path:
	// /var/lib/kubelet/pods/{podUID}/volumes/{escapeQualifiedPluginName}/{volumeSpecName}/
	spec *volume.Spec

	// pluginName is the Unescaped Qualified name of the volume plugin used to
	// attach and mount this volume. It is stored separately in case the full
	// volume spec (everything except the name) can not be reconstructed for a
	// volume that should be unmounted (which would be the case for a mount path
	// read from disk without a full volume spec).
	pluginName string

	// pluginIsAttachable indicates the volume plugin used to attach and mount
	// this volume implements the volume.Attacher interface
	pluginIsAttachable bool

	// deviceMountState stores information that tells us if device is mounted
	// globally or not
	deviceMountState operationexecutor.DeviceMountState

	// devicePath contains the path on the node where the volume is attached for
	// attachable volumes
	devicePath string

	// deviceMountPath contains the path on the node where the device should
	// be mounted after it is attached.
	deviceMountPath string

	// volumeInUseErrorForExpansion indicates volume driver has previously returned volume-in-use error
	// for this volume and volume expansion on this node should not be retried
	volumeInUseErrorForExpansion bool
}

// The mountedPod object represents a pod for which the kubelet volume manager
// believes the underlying volume has been successfully been mounted.
type mountedPod struct {
	// the name of the pod
	podName volumetypes.UniquePodName

	// the UID of the pod
	podUID types.UID

	// mounter used to mount
	mounter volume.Mounter

	// mapper used to block volumes support
	blockVolumeMapper volume.BlockVolumeMapper

	// spec is the volume spec containing the specification for this volume.
	// Used to generate the volume plugin object, and passed to plugin methods.
	// In particular, the Unmount method uses spec.Name() as the volumeSpecName
	// in the mount path:
	// /var/lib/kubelet/pods/{podUID}/volumes/{escapeQualifiedPluginName}/{volumeSpecName}/
	volumeSpec *volume.Spec

	// outerVolumeSpecName is the volume.Spec.Name() of the volume as referenced
	// directly in the pod. If the volume was referenced through a persistent
	// volume claim, this contains the volume.Spec.Name() of the persistent
	// volume claim
	outerVolumeSpecName string

	// remountRequired indicates the underlying volume has been successfully
	// mounted to this pod but it should be remounted to reflect changes in the
	// referencing pod.
	// Atomically updating volumes depend on this to update the contents of the
	// volume. All volume mounting calls should be idempotent so a second mount
	// call for volumes that do not need to update contents should not fail.
	remountRequired bool

	// volumeGidValue contains the value of the GID annotation, if present.
	volumeGidValue string

	// fsResizeRequired indicates the underlying volume has been successfully
	// mounted to this pod but its size has been expanded after that.
	fsResizeRequired bool

	// volumeMountStateForPod stores state of volume mount for the pod. if it is:
	//   - VolumeMounted: means volume for pod has been successfully mounted
	//   - VolumeMountUncertain: means volume for pod may not be mounted, but it must be unmounted
	volumeMountStateForPod operationexecutor.VolumeMountState
}

func (asw *actualStateOfWorld) MarkVolumeAsAttached(
	volumeName v1.UniqueVolumeName, volumeSpec *volume.Spec, _ types.NodeName, devicePath string) error {
	return asw.addVolume(volumeName, volumeSpec, devicePath)
}

func (asw *actualStateOfWorld) MarkVolumeAsUncertain(
	volumeName v1.UniqueVolumeName, volumeSpec *volume.Spec, _ types.NodeName) error {
	return nil
}

func (asw *actualStateOfWorld) MarkVolumeAsDetached(
	volumeName v1.UniqueVolumeName, nodeName types.NodeName) {
	asw.DeleteVolume(volumeName)
}

func (asw *actualStateOfWorld) MarkVolumeAsMounted(markVolumeOpts operationexecutor.MarkVolumeOpts) error {
	return asw.AddPodToVolume(markVolumeOpts)
}

func (asw *actualStateOfWorld) AddVolumeToReportAsAttached(volumeName v1.UniqueVolumeName, nodeName types.NodeName) {
	// no operation for kubelet side
}

func (asw *actualStateOfWorld) RemoveVolumeFromReportAsAttached(volumeName v1.UniqueVolumeName, nodeName types.NodeName) error {
	// no operation for kubelet side
	return nil
}

func (asw *actualStateOfWorld) MarkVolumeAsUnmounted(
	podName volumetypes.UniquePodName, volumeName v1.UniqueVolumeName) error {
	return asw.DeletePodFromVolume(podName, volumeName)
}

func (asw *actualStateOfWorld) MarkDeviceAsMounted(
	volumeName v1.UniqueVolumeName, devicePath, deviceMountPath string) error {
	return asw.SetDeviceMountState(volumeName, operationexecutor.DeviceGloballyMounted, devicePath, deviceMountPath)
}

func (asw *actualStateOfWorld) MarkDeviceAsUncertain(
	volumeName v1.UniqueVolumeName, devicePath, deviceMountPath string) error {
	return asw.SetDeviceMountState(volumeName, operationexecutor.DeviceMountUncertain, devicePath, deviceMountPath)
}

func (asw *actualStateOfWorld) MarkVolumeMountAsUncertain(markVolumeOpts operationexecutor.MarkVolumeOpts) error {
	markVolumeOpts.VolumeMountState = operationexecutor.VolumeMountUncertain
	return asw.AddPodToVolume(markVolumeOpts)
}

func (asw *actualStateOfWorld) MarkDeviceAsUnmounted(
	volumeName v1.UniqueVolumeName) error {
	return asw.SetDeviceMountState(volumeName, operationexecutor.DeviceNotMounted, "", "")
}

func (asw *actualStateOfWorld) GetDeviceMountState(volumeName v1.UniqueVolumeName) operationexecutor.DeviceMountState {
	asw.RLock()
	defer asw.RUnlock()

	volumeObj, volumeExists := asw.attachedVolumes[volumeName]
	if !volumeExists {
		return operationexecutor.DeviceNotMounted
	}

	return volumeObj.deviceMountState
}

func (asw *actualStateOfWorld) MarkForInUseExpansionError(volumeName v1.UniqueVolumeName) {
	asw.Lock()
	defer asw.Unlock()

	volumeObj, ok := asw.attachedVolumes[volumeName]
	if ok {
		volumeObj.volumeInUseErrorForExpansion = true
		asw.attachedVolumes[volumeName] = volumeObj
	}
}

func (asw *actualStateOfWorld) GetVolumeMountState(volumeName v1.UniqueVolumeName, podName volumetypes.UniquePodName) operationexecutor.VolumeMountState {
	asw.RLock()
	defer asw.RUnlock()

	volumeObj, volumeExists := asw.attachedVolumes[volumeName]
	if !volumeExists {
		return operationexecutor.VolumeNotMounted
	}

	podObj, podExists := volumeObj.mountedPods[podName]
	if !podExists {
		return operationexecutor.VolumeNotMounted
	}
	return podObj.volumeMountStateForPod
}

// addVolume adds the given volume to the cache indicating the specified
// volume is attached to this node. If no volume name is supplied, a unique
// volume name is generated from the volumeSpec and returned on success. If a
// volume with the same generated name already exists, this is a noop. If no
// volume plugin can support the given volumeSpec or more than one plugin can
// support it, an error is returned.
func (asw *actualStateOfWorld) addVolume(
	volumeName v1.UniqueVolumeName, volumeSpec *volume.Spec, devicePath string) error {
	asw.Lock()
	defer asw.Unlock()

	volumePlugin, err := asw.volumePluginMgr.FindPluginBySpec(volumeSpec)
	if err != nil || volumePlugin == nil {
		return fmt.Errorf(
			"failed to get Plugin from volumeSpec for volume %q err=%v",
			volumeSpec.Name(),
			err)
	}

	if len(volumeName) == 0 {
		volumeName, err = util.GetUniqueVolumeNameFromSpec(volumePlugin, volumeSpec)
		if err != nil {
			return fmt.Errorf(
				"failed to GetUniqueVolumeNameFromSpec for volumeSpec %q using volume plugin %q err=%v",
				volumeSpec.Name(),
				volumePlugin.GetPluginName(),
				err)
		}
	}

	pluginIsAttachable := false
	if attachablePlugin, err := asw.volumePluginMgr.FindAttachablePluginBySpec(volumeSpec); err == nil && attachablePlugin != nil {
		pluginIsAttachable = true
	}

	volumeObj, volumeExists := asw.attachedVolumes[volumeName]
	if !volumeExists {
		volumeObj = attachedVolume{
			volumeName:         volumeName,
			spec:               volumeSpec,
			mountedPods:        make(map[volumetypes.UniquePodName]mountedPod),
			pluginName:         volumePlugin.GetPluginName(),
			pluginIsAttachable: pluginIsAttachable,
			deviceMountState:   operationexecutor.DeviceNotMounted,
			devicePath:         devicePath,
		}
	} else {
		// If volume object already exists, update the fields such as device path
		volumeObj.devicePath = devicePath
		klog.V(2).Infof("Volume %q is already added to attachedVolume list, update device path %q",
			volumeName,
			devicePath)
	}
	asw.attachedVolumes[volumeName] = volumeObj

	return nil
}

func (asw *actualStateOfWorld) AddPodToVolume(markVolumeOpts operationexecutor.MarkVolumeOpts) error {
	podName := markVolumeOpts.PodName
	podUID := markVolumeOpts.PodUID
	volumeName := markVolumeOpts.VolumeName
	mounter := markVolumeOpts.Mounter
	blockVolumeMapper := markVolumeOpts.BlockVolumeMapper
	outerVolumeSpecName := markVolumeOpts.OuterVolumeSpecName
	volumeGidValue := markVolumeOpts.VolumeGidVolume
	volumeSpec := markVolumeOpts.VolumeSpec
	asw.Lock()
	defer asw.Unlock()

	volumeObj, volumeExists := asw.attachedVolumes[volumeName]
	if !volumeExists {
		return fmt.Errorf(
			"no volume with the name %q exists in the list of attached volumes",
			volumeName)
	}

	podObj, podExists := volumeObj.mountedPods[podName]
	if !podExists {
		podObj = mountedPod{
			podName:                podName,
			podUID:                 podUID,
			mounter:                mounter,
			blockVolumeMapper:      blockVolumeMapper,
			outerVolumeSpecName:    outerVolumeSpecName,
			volumeGidValue:         volumeGidValue,
			volumeSpec:             volumeSpec,
			volumeMountStateForPod: markVolumeOpts.VolumeMountState,
		}
	}

	// If pod exists, reset remountRequired value
	podObj.remountRequired = false
	podObj.volumeMountStateForPod = markVolumeOpts.VolumeMountState
	asw.attachedVolumes[volumeName].mountedPods[podName] = podObj
	return nil
}

func (asw *actualStateOfWorld) MarkVolumeAsResized(
	podName volumetypes.UniquePodName,
	volumeName v1.UniqueVolumeName) error {
	asw.Lock()
	defer asw.Unlock()

	volumeObj, volumeExists := asw.attachedVolumes[volumeName]
	if !volumeExists {
		return fmt.Errorf(
			"no volume with the name %q exists in the list of attached volumes",
			volumeName)
	}

	podObj, podExists := volumeObj.mountedPods[podName]
	if !podExists {
		return fmt.Errorf(
			"no pod with the name %q exists in the mounted pods list of volume %s",
			podName,
			volumeName)
	}

	klog.V(5).Infof("Volume %s(OuterVolumeSpecName %s) of pod %s has been resized",
		volumeName, podObj.outerVolumeSpecName, podName)
	podObj.fsResizeRequired = false
	asw.attachedVolumes[volumeName].mountedPods[podName] = podObj
	return nil
}

func (asw *actualStateOfWorld) MarkRemountRequired(
	podName volumetypes.UniquePodName) {
	asw.Lock()
	defer asw.Unlock()
	for volumeName, volumeObj := range asw.attachedVolumes {
		if podObj, podExists := volumeObj.mountedPods[podName]; podExists {
			volumePlugin, err :=
				asw.volumePluginMgr.FindPluginBySpec(podObj.volumeSpec)
			if err != nil || volumePlugin == nil {
				// Log and continue processing
				klog.Errorf(
					"MarkRemountRequired failed to FindPluginBySpec for pod %q (podUid %q) volume: %q (volSpecName: %q)",
					podObj.podName,
					podObj.podUID,
					volumeObj.volumeName,
					podObj.volumeSpec.Name())
				continue
			}

			if volumePlugin.RequiresRemount() {
				podObj.remountRequired = true
				asw.attachedVolumes[volumeName].mountedPods[podName] = podObj
			}
		}
	}
}

func (asw *actualStateOfWorld) MarkFSResizeRequired(
	volumeName v1.UniqueVolumeName,
	podName volumetypes.UniquePodName) {
	asw.Lock()
	defer asw.Unlock()
	volumeObj, volumeExists := asw.attachedVolumes[volumeName]
	if !volumeExists {
		klog.Warningf("MarkFSResizeRequired for volume %s failed as volume not exist", volumeName)
		return
	}

	podObj, podExists := volumeObj.mountedPods[podName]
	if !podExists {
		klog.Warningf("MarkFSResizeRequired for volume %s failed "+
			"as pod(%s) not exist", volumeName, podName)
		return
	}

	volumePlugin, err :=
		asw.volumePluginMgr.FindNodeExpandablePluginBySpec(podObj.volumeSpec)
	if err != nil || volumePlugin == nil {
		// Log and continue processing
		klog.Errorf(
			"MarkFSResizeRequired failed to find expandable plugin for pod %q volume: %q (volSpecName: %q)",
			podObj.podName,
			volumeObj.volumeName,
			podObj.volumeSpec.Name())
		return
	}

	if volumePlugin.RequiresFSResize() {
		if !podObj.fsResizeRequired {
			klog.V(3).Infof("PVC volume %s(OuterVolumeSpecName %s) of pod %s requires file system resize",
				volumeName, podObj.outerVolumeSpecName, podName)
			podObj.fsResizeRequired = true
		}
		asw.attachedVolumes[volumeName].mountedPods[podName] = podObj
	}
}

func (asw *actualStateOfWorld) SetDeviceMountState(
	volumeName v1.UniqueVolumeName, deviceMountState operationexecutor.DeviceMountState, devicePath, deviceMountPath string) error {
	asw.Lock()
	defer asw.Unlock()

	volumeObj, volumeExists := asw.attachedVolumes[volumeName]
	if !volumeExists {
		return fmt.Errorf(
			"no volume with the name %q exists in the list of attached volumes",
			volumeName)
	}

	volumeObj.deviceMountState = deviceMountState
	volumeObj.deviceMountPath = deviceMountPath
	if devicePath != "" {
		volumeObj.devicePath = devicePath
	}
	asw.attachedVolumes[volumeName] = volumeObj
	return nil
}

func (asw *actualStateOfWorld) DeletePodFromVolume(
	podName volumetypes.UniquePodName, volumeName v1.UniqueVolumeName) error {
	asw.Lock()
	defer asw.Unlock()

	volumeObj, volumeExists := asw.attachedVolumes[volumeName]
	if !volumeExists {
		return fmt.Errorf(
			"no volume with the name %q exists in the list of attached volumes",
			volumeName)
	}

	_, podExists := volumeObj.mountedPods[podName]
	if podExists {
		delete(asw.attachedVolumes[volumeName].mountedPods, podName)
	}

	return nil
}

func (asw *actualStateOfWorld) DeleteVolume(volumeName v1.UniqueVolumeName) error {
	asw.Lock()
	defer asw.Unlock()

	volumeObj, volumeExists := asw.attachedVolumes[volumeName]
	if !volumeExists {
		return nil
	}

	if len(volumeObj.mountedPods) != 0 {
		return fmt.Errorf(
			"failed to DeleteVolume %q, it still has %v mountedPods",
			volumeName,
			len(volumeObj.mountedPods))
	}

	delete(asw.attachedVolumes, volumeName)
	return nil
}

func (asw *actualStateOfWorld) PodExistsInVolume(
	podName volumetypes.UniquePodName,
	volumeName v1.UniqueVolumeName) (bool, string, error) {
	asw.RLock()
	defer asw.RUnlock()

	volumeObj, volumeExists := asw.attachedVolumes[volumeName]
	if !volumeExists {
		return false, "", newVolumeNotAttachedError(volumeName)
	}

	podObj, podExists := volumeObj.mountedPods[podName]
	if podExists {
		// if volume mount was uncertain we should keep trying to mount the volume
		if podObj.volumeMountStateForPod == operationexecutor.VolumeMountUncertain {
			return false, volumeObj.devicePath, nil
		}
		if podObj.remountRequired {
			return true, volumeObj.devicePath, newRemountRequiredError(volumeObj.volumeName, podObj.podName)
		}
		if podObj.fsResizeRequired &&
			!volumeObj.volumeInUseErrorForExpansion &&
			utilfeature.DefaultFeatureGate.Enabled(features.ExpandInUsePersistentVolumes) {
			return true, volumeObj.devicePath, newFsResizeRequiredError(volumeObj.volumeName, podObj.podName)
		}
	}

	return podExists, volumeObj.devicePath, nil
}

func (asw *actualStateOfWorld) VolumeExistsWithSpecName(podName volumetypes.UniquePodName, volumeSpecName string) bool {
	asw.RLock()
	defer asw.RUnlock()
	for _, volumeObj := range asw.attachedVolumes {
		if podObj, podExists := volumeObj.mountedPods[podName]; podExists {
			if podObj.volumeSpec.Name() == volumeSpecName {
				return true
			}
		}
	}
	return false
}

func (asw *actualStateOfWorld) VolumeExists(
	volumeName v1.UniqueVolumeName) bool {
	asw.RLock()
	defer asw.RUnlock()

	_, volumeExists := asw.attachedVolumes[volumeName]
	return volumeExists
}

func (asw *actualStateOfWorld) GetMountedVolumes() []MountedVolume {
	asw.RLock()
	defer asw.RUnlock()
	mountedVolume := make([]MountedVolume, 0 /* len */, len(asw.attachedVolumes) /* cap */)
	for _, volumeObj := range asw.attachedVolumes {
		for _, podObj := range volumeObj.mountedPods {
			if podObj.volumeMountStateForPod == operationexecutor.VolumeMounted {
				mountedVolume = append(
					mountedVolume,
					getMountedVolume(&podObj, &volumeObj))
			}
		}
	}
	return mountedVolume
}

// GetAllMountedVolumes returns all volumes which could be locally mounted for a pod.
func (asw *actualStateOfWorld) GetAllMountedVolumes() []MountedVolume {
	asw.RLock()
	defer asw.RUnlock()
	mountedVolume := make([]MountedVolume, 0 /* len */, len(asw.attachedVolumes) /* cap */)
	for _, volumeObj := range asw.attachedVolumes {
		for _, podObj := range volumeObj.mountedPods {
			if podObj.volumeMountStateForPod == operationexecutor.VolumeMounted ||
				podObj.volumeMountStateForPod == operationexecutor.VolumeMountUncertain {
				mountedVolume = append(
					mountedVolume,
					getMountedVolume(&podObj, &volumeObj))
			}

		}
	}

	return mountedVolume
}

func (asw *actualStateOfWorld) GetMountedVolumesForPod(
	podName volumetypes.UniquePodName) []MountedVolume {
	asw.RLock()
	defer asw.RUnlock()
	mountedVolume := make([]MountedVolume, 0 /* len */, len(asw.attachedVolumes) /* cap */)
	for _, volumeObj := range asw.attachedVolumes {
		for mountedPodName, podObj := range volumeObj.mountedPods {
			if mountedPodName == podName && podObj.volumeMountStateForPod == operationexecutor.VolumeMounted {
				mountedVolume = append(
					mountedVolume,
					getMountedVolume(&podObj, &volumeObj))
			}
		}
	}

	return mountedVolume
}

func (asw *actualStateOfWorld) GetGloballyMountedVolumes() []AttachedVolume {
	asw.RLock()
	defer asw.RUnlock()
	globallyMountedVolumes := make(
		[]AttachedVolume, 0 /* len */, len(asw.attachedVolumes) /* cap */)
	for _, volumeObj := range asw.attachedVolumes {
		if volumeObj.deviceMountState == operationexecutor.DeviceGloballyMounted {
			globallyMountedVolumes = append(
				globallyMountedVolumes,
				asw.newAttachedVolume(&volumeObj))
		}
	}

	return globallyMountedVolumes
}

func (asw *actualStateOfWorld) GetAttachedVolumes() []AttachedVolume {
	asw.RLock()
	defer asw.RUnlock()
	allAttachedVolumes := make(
		[]AttachedVolume, 0 /* len */, len(asw.attachedVolumes) /* cap */)
	for _, volumeObj := range asw.attachedVolumes {
		allAttachedVolumes = append(
			allAttachedVolumes,
			asw.newAttachedVolume(&volumeObj))
	}

	return allAttachedVolumes
}

func (asw *actualStateOfWorld) GetUnmountedVolumes() []AttachedVolume {
	asw.RLock()
	defer asw.RUnlock()
	unmountedVolumes := make([]AttachedVolume, 0 /* len */, len(asw.attachedVolumes) /* cap */)
	for _, volumeObj := range asw.attachedVolumes {
		if len(volumeObj.mountedPods) == 0 {
			unmountedVolumes = append(
				unmountedVolumes,
				asw.newAttachedVolume(&volumeObj))
		}
	}

	return unmountedVolumes
}

func (asw *actualStateOfWorld) newAttachedVolume(
	attachedVolume *attachedVolume) AttachedVolume {
	return AttachedVolume{
		AttachedVolume: operationexecutor.AttachedVolume{
			VolumeName:         attachedVolume.volumeName,
			VolumeSpec:         attachedVolume.spec,
			NodeName:           asw.nodeName,
			PluginIsAttachable: attachedVolume.pluginIsAttachable,
			DevicePath:         attachedVolume.devicePath,
			DeviceMountPath:    attachedVolume.deviceMountPath,
			PluginName:         attachedVolume.pluginName},
		DeviceMountState: attachedVolume.deviceMountState,
	}
}

// Compile-time check to ensure volumeNotAttachedError implements the error interface
var _ error = volumeNotAttachedError{}

// volumeNotAttachedError is an error returned when PodExistsInVolume() fails to
// find specified volume in the list of attached volumes.
type volumeNotAttachedError struct {
	volumeName v1.UniqueVolumeName
}

func (err volumeNotAttachedError) Error() string {
	return fmt.Sprintf(
		"volumeName %q does not exist in the list of attached volumes",
		err.volumeName)
}

func newVolumeNotAttachedError(volumeName v1.UniqueVolumeName) error {
	return volumeNotAttachedError{
		volumeName: volumeName,
	}
}

// Compile-time check to ensure remountRequiredError implements the error interface
var _ error = remountRequiredError{}

// remountRequiredError is an error returned when PodExistsInVolume() found
// volume/pod attached/mounted but remountRequired was true, indicating the
// given volume should be remounted to the pod to reflect changes in the
// referencing pod.
type remountRequiredError struct {
	volumeName v1.UniqueVolumeName
	podName    volumetypes.UniquePodName
}

func (err remountRequiredError) Error() string {
	return fmt.Sprintf(
		"volumeName %q is mounted to %q but should be remounted",
		err.volumeName, err.podName)
}

func newRemountRequiredError(
	volumeName v1.UniqueVolumeName, podName volumetypes.UniquePodName) error {
	return remountRequiredError{
		volumeName: volumeName,
		podName:    podName,
	}
}

// fsResizeRequiredError is an error returned when PodExistsInVolume() found
// volume/pod attached/mounted but fsResizeRequired was true, indicating the
// given volume receives an resize request after attached/mounted.
type fsResizeRequiredError struct {
	volumeName v1.UniqueVolumeName
	podName    volumetypes.UniquePodName
}

func (err fsResizeRequiredError) Error() string {
	return fmt.Sprintf(
		"volumeName %q mounted to %q needs to resize file system",
		err.volumeName, err.podName)
}

func newFsResizeRequiredError(
	volumeName v1.UniqueVolumeName, podName volumetypes.UniquePodName) error {
	return fsResizeRequiredError{
		volumeName: volumeName,
		podName:    podName,
	}
}

// IsFSResizeRequiredError returns true if the specified error is a
// fsResizeRequiredError.
func IsFSResizeRequiredError(err error) bool {
	_, ok := err.(fsResizeRequiredError)
	return ok
}

// getMountedVolume constructs and returns a MountedVolume object from the given
// mountedPod and attachedVolume objects.
func getMountedVolume(
	mountedPod *mountedPod, attachedVolume *attachedVolume) MountedVolume {
	return MountedVolume{
		MountedVolume: operationexecutor.MountedVolume{
			PodName:             mountedPod.podName,
			VolumeName:          attachedVolume.volumeName,
			InnerVolumeSpecName: mountedPod.volumeSpec.Name(),
			OuterVolumeSpecName: mountedPod.outerVolumeSpecName,
			PluginName:          attachedVolume.pluginName,
			PodUID:              mountedPod.podUID,
			Mounter:             mountedPod.mounter,
			BlockVolumeMapper:   mountedPod.blockVolumeMapper,
			VolumeGidValue:      mountedPod.volumeGidValue,
			VolumeSpec:          mountedPod.volumeSpec,
			DeviceMountPath:     attachedVolume.deviceMountPath}}
}


Eldhús: The Little House of Music.
4 days. 16 bands. And everyone's invited! Inspired by Iceland presents Eldhús: The Little House of Music. It's the smallest concert off-venue at Iceland Airwaves 2012. Only 2 guests fit in the house where some of the hottest musical talent Iceland has to offer will perform over the course of the festival.
Check out the Inspired by Iceland facebook page for daily updates and a chance to win a place in the audience.
Performances will also be streamed live from the Inspired by Iceland website and shown on a screen between 2pm and 6pm each day at Ingólfstorg square for those in Reykjavík during the festival.


Once upon a time, in a small village a farmer was riding his cart with vegetables to the market in the nearest town. Since, it had rained heavily, the previous day, the roads were muddy and the potholes were filled. It was very difficult for the horses to pull the load through that wet mud.
Suddenly, the wheels of the cart sank in to the wet mud. The horses couldn't pull the cart anymore. The farmer stepped down from his cart and search all around. He could not fine anyone to help him.
The farmer started to feel dejected. He was cursing his bad luck. Looking up at the sky, he started shouting at the God. He was crying and whining for the whole day, without making any efforts to lift those wheels from the mud.
After a very long wait, God finally appeared before the farmer. He asked, "Do you think anyone can move the wheels of your cart by simply looking at it and crying over the bad luck? Nobody will help you unless you put some efforts to help yourself."
He added, "Now get up. Put your shoulders to the wheels and soon you will find the way out". The farmer realised his mistakes. He put his shoulders to the wheel and now the horses were able to pull the wheels out from the mire.
The farmer learnt his lesson. He apologised to God and continued his journey.


Our SPDIF interface board for the Raspberry Pi with inputs and outputs.
HiFiBerry Digi is a high-quality S/PDIF card for the Raspberry Pi. It uses the I2S sound port that connects directly to the CPU without the need for an additional USB conversion. It does not only feature an output (optical and electrical), but also inputs (both optical and electrical).


Upper Accent Side Stripes are designed to fit the front doors, rear doors, and bedside following the contour below the windows and the top of the truck bed. These are designed to fit the 2015 to Present Ford F-150 perfectly. They are pre-cut for the front doors, rear doors, cab, and bed, making installation a breeze.
Select options below to customize your F-150 Upper Side Stripes Design Style 01 graphics kit.
Add your custom text or custom logo to your Upper Side Stripes Design 01 graphics.
Select options below to customize your F-150 Upper Side Stripes Design Style 02 graphics kit.
Add your custom text or custom logo to your Upper Side Stripes Design 02 graphics.
This Upper Side Stripes vinyl graphics kit is professionally measured, designed, and produced to perfectly fit on the Upper Front Doors, Upper Rear Doors below windows, top of bed sides of the 2015-2019 Ford F-150.
You may see similar graphics to these elsewhere using alternate names such as Upper Side Stripes, Full Length Side Decals, Upper Side Stripes, Upper Side Graphics.
There are currently 2 design variations of the 2015 to Present Ford F-150 Upper Side Stripes available. If what you are looking for is not here, why not contact us and help us make it 3.
The Main Color of the Upper Side Stripes refers to the color associated bulk of the graphics which appears in the design images as light grey. Simply choose the color you want from the list, and we will produce the graphic in that color, along with the other option you select.
As well as custom alternate color combinations, text and logo options for these 2015 to Present Ford F-150 Upper Side Stripes graphics. You can also mix elements of several designs to create your own new design! Please contact us with your ideas, requests, and questions.
Upper Side Stripes: Ford F-150 Vinyl Graphics Decal Stripes Kit.
We make diy installation of this Upper Side Stripes Graphics kit on your 2015 to Present Ford F-150 as easy as possible by using the highest quality materials, ensuring a perfect fit, and offering installation insurance should anything go wrong!
We frequently add Upper Side Stripes design variations to our website. However, if there is something you are looking for that we don't currently have available on our website, we are also happy to custom design a variation of the Upper Side Stripes specially for you!


Celebrating contemporary shape and style while offering maximum comfort in the living room, the Wesley Chair by Precedent offers a knock out shape that's sure to draw some fans. Wesley has short, gently curved legs with chair arms that are wide and stop short as they create a curve for your back. The plush seat cushion is yours to customize, with two cushion options available, including UD Foam or PDS Foam and Down. For the latest in contemporary style and the finest comfort option for individual seating, the Wesley Chair by Precedent makes a fine candidate.
There's plenty of experience in crafting fine furniture where Precedent is concerned. For over thirty years, they have been devoted to providing home furniture collections with the perfect combination of comfort, quality and style. Their Modern Living Room Collection offers a wide range of sofas, sectionals, lounge chairs and ottomans in the latest contemporary shapes and styles. Experience Precedent in this colorful video shot in the DutchCrafters Sarastoa, Florida store.


What happens if you pre-pay your FHA mortgage? FHA home loans are known for having no pre-payment penalty but there may be certain steps the borrower is required to take in order for such pre-payments to be used as intended.
The date of your FHA loan may make an important difference in how you are to proceed; it's best to discuss pre-payment options with your loan officer ahead of time to learn what, if any, additional lender requirements may exist above and beyond the FHA loan standards we're discussing here.
What follows is NOT lender policy but the FHA loan rules. Lender requirements may add to or further develop these FHA guidelines.
FHA loan rules instruct the lender to accept a prepayment on FHA mortgages closed on or after January 21, 2015, "at any time and in any amount" according to page 557 of HUD 4000.1. "The Mortgagee must calculate the interest as of the date the prepayment is received, not as of the next Installment Due Date".
In cases where the FHA loan has closed on or after August 2, 1985 and before January 21, 2015, the lender is required to accept prepayments if the Borrower prepays the Mortgage in full on the first Day of any month in the term of the Mortgage. What happens if this condition is not followed by the borrower?
In such cases the lender is permitted to refuse to accept the prepayment until the first day of the following month; or accept the prepayment and require the payment of interest to the first Day of the next month.
HUD 4000.1 states, "For Prepayment in Full, this option may only be used if the Mortgagee has provided the Payoff Disclosure to the Borrower".
HUD 4000.1 states that a 30-Day Advance Prepayment Notice is required of the FHA borrower "to provide advance notice to the Mortgagee for prepayment of an FHA-insured Mortgage insured prior to August 2, 1985". In such cases the lender is required to accept prepayments on FHA mortgages when there is a 30 day advance prepayment notice, and prepays the FHA mortgage "in full on the first Day of any month in the term of the Mortgage".
For situations where the borrower wishes to prepay in full, "this option may only be used if the Mortgagee has provided the Payoff Disclosure to the Borrower".
Ask your loan officer for more information on individual lender requirements in addition to these rules.


text:
Severo Efraín Meza Mayorga, mais conhecido como Severo Meza (Veracruz, 9 de julho de 1986), é um futebolista mexicano que atua como zagueiro. Atualmente, joga pelo .

Títulos

Monterrey
 Campeonato Mexicano de Futebol: Apertura 2009, Apertura 2010
 Liga dos Campeões da CONCACAF: 2010–11, 2011–12

Ligações externas
 Perfil em transfermarkt

Futebolistas do México
Futebolistas do Club de Fútbol Monterrey
Futebolistas da Copa das Confederações FIFA de 2013

redpajama_set_name: RedPajamaWikipedia


How To Decorate A Side Table In A Living Room Paula Deen Round Side Table In Tobacco Traditional Side Tables And End Decor Uploaded by admin on Tuesday, August 7th, 2018 in category How To.
How To Decorate A Side Table In A Living Room Paula Deen Round Side Table In Tobacco Traditional Side Tables And End Decor - It is absolutely great to be in a accepted place where you can relax and be really comfortable. Whether it is certainly your room or the living area, it is certainly often such a fine sense to stay in a place that looks peaceful, beautiful and relaxing. This is why, innovative interior design and style can be very significant.
See also How To Decorate A Side Table In A Living Room Side Table Bar Cart from How To Topic.
Here we have another image How To Decorate A Side Table In A Living Room Round Style End Table featured under How To Decorate A Side Table In A Living Room Paula Deen Round Side Table In Tobacco Traditional Side Tables And End Decor. We hope you enjoyed it and if you want to download the pictures in high quality, simply right click the image and choose "Save As". Thanks for reading How To Decorate A Side Table In A Living Room Paula Deen Round Side Table In Tobacco Traditional Side Tables And End Decor.


text:
Scientists Are About to Bring This Extinct Australian Animal Back to Life
Nikolay Atanasova
It has been almost a century since the Tasmanian tiger was last spotted, but there is new hope that the extinct animal will thrive once again in the near future.
The striped carnivorous marsupial known as a thylacine, which used to roam the Australian wilderness, is one of the extinct animals that scientists are hoping to bring back to life.
It's safe to say the character Ian Malcolm from Jurassic Park would be quite unhappy.
The Tasmanian tiger could be reintroduced into the wild after a US biotechnology company pledged to recreate the animal almost 90 years after it was declared extincthttps://t.co/2Bp7iVMO1u
— Financial Times (@FinancialTimes) August 16, 2022
Some scientists argue that bringing the marsupial predator back could help restore its former ecosystems. But is "de-extinction" realistic? https://t.co/HPWmfOGZLm
— National Geographic (@NatGeo) August 16, 2022
The "de-extinction" U.S. biotech company Colossal Biosciences plans to use gene-editing technology to resurrect the extinct animal, an ambitious endeavor that will utilize the retrieval of ancient DNA and the manufacture of artificial offspring.
"We would strongly advocate that first and foremost we need to protect our biodiversity from further extinctions, but unfortunately we are not seeing a slowing down in species loss," said Andrew Pask, a professor of evolutionary biology at the University of Melbourne who has collaborated with Colossal Biosciences.
"This technology offers a chance to correct this and could be applied in exceptional circumstances where cornerstone species have been lost," he added.
De-extinction: scientists are planning the multimillion-dollar resurrection of the Tasmanian tiger https://t.co/ttpGLglacs
— Guardian news (@guardiannews) August 16, 2022
A team of genetic scientists is attempting to make the concept of "de-extinction" a reality. Over the coming decade, they plan to use gene editing to bring the long-dead Tasmanian tiger into today's world. https://t.co/SfsstYBXaV
— The Washington Post (@washingtonpost) August 17, 2022
This is not the first time that Colossal has made it known that they wish to bring back an extinct animal. The idea to bring woolly mammoths back into existence by the year 2027 was announced to the world by Colossal last year.
In contrast to mammoths, the Tasmanian tiger cannot point the finger of blame at natural processes for its demise. The animal's extinction can be attributed in large part to hunting by humans.
However it was Willy Batty, a farmer in Australia, who killed the last known thylacine in 1930. He did it to protect his chickens from being eaten by the animal.
The last surviving Tasmanian Tiger (named Benjamin) held in captivity at Beaumaris Zoo in Tasmania, Australia pic.twitter.com/GxzyhLCOsY
— Historic Vids (@historyinmemes) August 15, 2022
Even though their name suggests otherwise, Tasmanian tigers are actually marsupials, regardless of the fact that they appear to be a hybrid of a wild dog and a wild cat.
Professor Pask has made it abundantly clear that the objective is not to bring back the Tasmanian tiger as purely a scientific experiment but rather for the long term so that it can be reintroduced into the wild.
According to Pask, "To bring a healthy population of thylacines back, you can't bring back one or five."
"You're looking at bringing back a good number of animals that you can put back into the environment," he added.
The entire concept of bringing back extinct species is fraught with controversy in the scientific world, particularly due to the possible ethical repercussions that could result.
What if efforts to reintroduce species, such as the Tasmanian tiger, just result in their extinction once more? In what ways will the restoration of these animals into their natural habitat affect the native people who live there? Is it realistic for us to hope to forecast how well they will do, as well as how well other species will do when they come back?
Additionally, conservationists are concerned that if de-extinction becomes popular, it will divert resources away from the protection of species that we are still actually able to preserve.
More than 30 scientists collaborated on the research with the goal of accelerating the "huge grand challenge" of bringing the Tasmanian tiger back from the dead. According to Pask, the effort was the single most important contribution ever made to marsupial conservation in Australia.
He believes that the first joeys will be born in ten years.
Ben Lamm, the chief executive and other co-founder of Colossal, is even more optimistic and believes it will be possible to produce the first set of mammoth calves in less than six years.
"I think it's highly probable this could be the first animal we de-extinct," Lamm told the Guardian.
According to Pask, the rate at which the world is changing is too fast for the methods of conservation currently in use to preserve many endangered species, citing the devastating impact that bushfires have had on Australian animals.
If we want to put a stop to the loss of biodiversity, Pask explained: "We have to look at other technologies and novel ways to do that if we want to stop this biodiversity loss."
"We have no choice. I mean, it will lead to our own extinction if we lose 50% of biodiversity on Earth in the next 50 to 100 years," he added.

redpajama_set_name: RedPajamaCommonCrawl


Nanjangud: The newly-opened KSRTC bus stand in the temple town has been receiving a lot of criticisms from the passengers as the old bus stand has now been designated for taluk rural service thus inconveniencing hundreds of temple devotees, students and daily commuters.
The new bus stand is earmarked only for district centre and outstation destinations.
The passengers suggest that all buses can operate from the new bus stand and pass through old bus stand and Hullahalli Circle to facilitate the commuters.
Allegations are also heard that KSRTC buses were charging Rs.5 for students in city buses though authorities had announced that it would be free.
The daily bus pass issuing centre that is closed at Hullahalli Circle in Nanjangud.
Referring to all these problems, several organisations presented a memorandum to Nanjangud MLA Harshavardhan recently.
Speaking on the occasion, the MLA contended that the Rs. 8.5 crore new bus stand had good facilities. However, he pointed out that any new venture would have some hiccups and assured to address them after discussing with the officials.
Owing to shifting of the bus stand, private operators are said to be having a heyday near the old bus stand luring the passengers which possibly has reduced the revenue for KSRTC.
The daily pass issuing centre at Hullahalli Circle is said to be closed now adding further woes to the passengers.


text:
Mariusz Makowski (18. srpna 1958 Katovice, Polsko – 26. února 2019 Těšín) byl polský historik a muzeolog, od roku 1997 do 2010 předseda Matice Těšínské (Macierz Ziemi Cieszyńskiej). V roce 1981 absolvoval pobočku Uniwersytetu Śląskiego v Těšíně. Od roku 1980 pracuje v muzeu v Těšíně. Byl autorem četných výstav a publikací o dějinách Těšínského Slezska. V letech 1984–1988 a 1990–1994 byl radním v Těšíně.

Publikace
 Těšín, Český Těšín na starých pohlednicích a fotografiích = Cieszyn, Czeski Cieszyn na starych widokówkach i fotografiach. Třinec : Wart, 1999. 178 s. . (spoluautoři Henryk Wawreczka, Janusz Spyra)
 100 lat Domu Narodowego w Cieszynie : 1901–2001. Cieszyn : Cieszyński Ośrodek Kultury "Dom Narodowy", 2002. 96 s. .
 Šlechtická sídla na Těšínském Slezsku = Szlacheckie siedziby na Śląsku Cieszyńskim. Český Těšín ; Cieszyn : Regio ; Muzeum Śląska Cieszyńskiego, 2005. 350 s. .
 Těšínské události 19.–21. století = Cieszyńskie wydarzenia XIX-XXI wieku = Teschener Ereignisse des 19.–21. Jahrhunderts. Bystřice : Ducatus Teschinensis, 2010. 175 s. . (spoluautoři Irena Cichá, Janusz Spyra)

Reference

Externí odkazy

  Elektroniczny Słownik Biograficzny Śląska Cieszyńskiego
  Zmarł Mariusz Makowski

Polští historikové
Muzeologové
Muži
Narození v roce 1958
Narození 18. srpna
Narození v Katovicích
Úmrtí v roce 2019
Úmrtí 26. února
Úmrtí v Těšíně


In Year 4 we aim to have lots of fun learning about the world around us and ourselves.
We follow our school values and work together to develop our growth mindset so that we can be the best that we can be.
We are lucky to have a brand new web page to be able to share some of our exciting lessons and adventures with you, so do keep checking in!


text:
Prime Minister's Office of Malaysia > News > 2,500 B40 students get YTN 'MyBrighter Future' tertiary scholarships
2,500 B40 students get YTN 'MyBrighter Future' tertiary scholarships
September 11, 2020 September 14, 2020 News, Photo Gallery
KOTA KINABALU, Sept 11 — A total of 2,500 new B40 (Bottom 40 group) students nationwide were selected to receive the Yayasan Tenaga Nasional (YTN) 2020 'MyBrighter Future' Scholarship programme to further their studies in various fields at institutions of higher learning (IPTs).
Of that number, 154 are new students among low-income families in Sabah who were selected to receive the scholarship this year.
One of the recipients, Raiyre Roland from Papar, a first-year mechanical engineering student at Universiti Malaysia Sabah (UMS), when met by Bernama, said the YTN 'MyBrighter Future' scholarship will ease the study costs that would be incurred by him.
He said this at the YTN 2020 'MyBrighter Future' presentation ceremony by Prime Minister Tan Sri Muhyiddin Yassin at UMS here today.
Also present at the ceremony were Higher Education Minister Datuk Dr Noraini Ahmad, Higher Education Ministry secretary-general Datuk Seri Dr Mazlan Yusoff, Tenaga Nasional Berhad (TNB) chairman Datuk Seri Mahdzir Khalid, and TNB president and chief executive officer Datuk Seri Amir Hamzah Azizan.
At the ceremony, the prime minister also witnessed the signing of a note of cooperation between the government and TNB, to strengthen the cooperation and implementation of the 'MyBrighter Future' scholarship programme.
According to media reports, the 'MyBrighter Future' scholarship programme is for Bumiputera and non-Bumiputera students, from low-income families throughout Malaysia who are studying in certain fields or courses.
To date, a total of 315 students from Sabah have been sponsored since it was introduced in 2018, involving 225 students who are pursuing studies at the undergraduate level, 70 students (diploma) and the remaining 20 (certificate).
PM makes surprise visit to SAS to celebrate students' outstanding SPM results
SPM 2019 results show the effectiveness of the education system – PM
PM Muhyiddin presents Perdana Fellows to ministers
25 Individuals Sworn in As Political Secretaries to Ministers
31 Cabinet ministers all sworn in before King


text:
Bank of America Reports Second-Quarter 2019 Financial Results
Bank of America reported its second-quarter 2019 financial results today. The news release, supplemental filing and investor presentation can be accessed in the following ways:
This press release features multimedia. View the full release here: https://www.businesswire.com/news/home/20190717005354/en/
Bank of America newsroom at https://newsroom.bankofamerica.com
Ebdaa Bank set for Microfinance Cooperation with Qi Card, Iraq
The Executive Officer of Ebdaa Microfinance Bank, Dr. Khaled Al Ghazzawi, confirmed the Bank is willing, through the Arab Gulf Development Program (AGFUND), to provide the necessary expertise to support microfinance industry in all countries of the region, taking advantage of bank's experience accumulated it work in microfinance in the Kingdom of Bahrain over the past ten years.
During a meeting at his office at the Bank's headquarters"...
Iraqi dinar exchange rates (July 14)
SULAIMANI — The US dollar to Iraqi dinar (IQD) exchange rate remained up on the Kurdistan Region's currency markets on Sunday (July 14).
Broker Rawaz Jaza told NRT Digital Media that $100 was at 120,650 Iraqi dinars, 50 IQD higher than the previous day.
Jaza also reported that 100 British pounds was 250 IQD up to 150,500 Iraqi dinars, and 100 euros was 250"...
World Bank body to hear Agility's dispute with Iraq government
Kuwait logistics firm Agility said a World Bank body that arbitrates between foreign investors and states will hear its dispute with Iraq's government over the company's investment in the Iraqi telecom industry.
The International Centre for Settlement of Investment Disputes (Icsid) ruled it has jurisdiction to hear some of the claims filed by Agility against Iraq and will consider some of Agility's claims on the merits, the company"...
Fitch downgrades Turkey's debt after central bank chief dismissal
WASHINGTON — Ratings agency Fitch on Friday downgraded Turkey's sovereign debt by one notch to 'BB-' with a negative outlook, after President Recep Tayyip Erdogan sacked the governor of the central bank.
The firing of Murat Cetinkaya last weekend for failing to follow government instructions 'risks damaging already weak domestic confidence,' Fitch said in a statement.
It also could jeopardize foreign investment, which the country needs and create 'worsening economic"...
SULAIMANI — The US dollar to Iraqi dinar (IQD) exchange rate was up on the Kurdistan Region's currency markets on Saturday (July 13).
Jaza also reported that 100 British pounds was 250 IQD down to 150,250 Iraqi dinars, while 100 euros was 250"...
Iraqi dinar exchange rates (July 9)
SULAIMANI — The US dollar to Iraqi dinar (IQD) exchange rate was slightly up on the Kurdistan Region's currency markets on Tuesday (July 9).
Jaza also reported that 100 British pounds was 250 IQD up to 151,500 Iraqi dinars, while 100 euros was"...
Trade Bank of Iraq Expands into GCC, China to Lift Revenues
State-owned Trade Bank of Iraq (TBI) is expanding into China and the Gulf, seeking to lift its revenues from retail banking and international operations to 30 percent by 2022 from 25 percent now, its chairman said on Sunday.
The bank plans to open a representative office in China in 2020 and is upgrading its license in Abu Dhabi to an asset management company from a representative office, explained Faisal al-Haimus.
TBI's revenues totaled $550 million in 2018 with trade finance contributing"...
SULAIMANI — The US dollar to Iraqi dinar (IQD) exchange rate was stable on the Kurdistan Region's currency markets on Monday (July 8).
Broker Rawaz Jaza told NRT Digital Media that $100 was at 120,500 Iraqi dinars, maintaining the same rate as the previous day.
Jaza also reported that 100 British pounds was 250 IQD down to 151,250 Iraqi dinars, while 100 euros"...
SULAIMANI — The US dollar to Iraqi dinar (IQD) exchange rate remained up on the Kurdistan Region's currency markets on Sunday (July 7).
Broker Rawaz Jaza told NRT Digital Media that $100 was at 120,500 Iraqi dinars, 100 IQD higher than the previous day.
Jaza also reported that 100 British pounds was 500 IQD down to 151,000 Iraqi dinars, while 100 euros was"...


text:
Home Live Video LIVE: Sabres Hire Head Coach Ralph Kreuger
LIVE: Sabres Hire Head Coach Ralph Kreuger
WNYmedia Network
The Buffalo Sabres have hired Ralph Krueger as their next head coach in hopes of ending an eight-year playoff drought, the team announced Wednesday.
LIVE NOW: WATCH LIVE PRESS CONFERENCE WITH GM JASON BOTTERILL
The 59-year-old Krueger coached the Edmonton Oilers during the NHL's lockout-shortened season in 2012-13. He was fired by the team via Skype after the youth-laden Oilers finished 19-22-7.
Krueger has vast coaching experience, including overseeing Switzerland's national team to Olympic Winter Games appearances in 2002, 2006 and 2010.
"Throughout his career, Ralph has shown the ability to adapt to a variety of high-pressure environments while leading some of the world's elite players," Sabres general manager Jason Botterill said in a statement. "His strong communication skills, leadership and diverse background make him a uniquely qualified candidate to lead our team going forward."
Krueger returns to the NHL after spending the past five years as chairman of soccer's Southampton FC of the English Premier League. Krueger was born in Winnipeg, Manitoba, and played hockey professionally in Germany from 1979 to 1991.
He replaces Phil Housley, who was fired after two seasons. Last season, Buffalo won just 16 of its final 57 games following a 10-game winning streak in November.
In finishing 13th in the Eastern Conference, the Sabres joined the 2016-17 Philadelphia Flyers as the only teams in NHL history to miss the playoffs in a season in which they won at least 10 straight games.
The Sabres' playoff drought stands as the NHL's longest active streak.
Krueger said he will "strive to maximize the potential" of the Sabres and is "eager to get behind the bench and represent this passionate hockey city."
The hiring came as Botterill returned to Buffalo for a number of scouting meetings this week. He had been in Slovakia working as a management member of Canada's national team competing at the world championships.
Krueger's experience includes coaching Team Europe to second at the 2016 World Cup of Hockey. He also served as a special adviser to Canada's national team when it won gold at the 2014 Sochi Games.
Previous articleKrueger named head coach
Next articleNew Sabres Coach Ralph Krueger May Have Been/Probably Was, Undercover at Falley Allen


The Sharp GP2Y10 dust sensor can detect dust in air using the reflected infrared light, including very fine smoke particles. See how to use it with a microcontroller.
An open source code library for the ILI9163 LCD. Circuit diagram for connecting it to an ATmega128 and demo video are included.
The AVR Watchdog is an essential mechanism to protect long term run applications from code freezes affecting their functionality.
Learn how to create a single chip computer running BASIC.
Learn how to set your atmega to work with various external crystals, program the fusebits, and build a fusebit doctor to revive your AVRs, in case you wrote the wrong settings .
A good source for cheap AVR USB Programmers. USBasp modules.
My first microcontroller (Atmega8) experiments, tools, software, tips and photos.


text:
My Cork Week 2008 Experience
By admin on April 26, 2010 in Blog
It was the very early hours of the morning of July 13th last when we reached Crosshaven for Cork Week. A tough enough passage from Dun Laoghaire, against the wind the whole way, had taken more than 24 hours and arriving into Cork Harbour we were all feeling pretty tired and hoping we might be in time for the bar.
Arriving into Crosshaven by night can be pretty confusing at the best of times, but really nothing I have ever seen prepared me for the amazing scene before us when we turned the corner at Camden. There is a famous scene in the movie "Apocalypse Now" where Martin Sheen and his comrades having taken their boat up the Mekong River arrive at the Do Long Bridge and the gateway to another world. At the wheel of my own boat that night, trying to navigate into the Royal Cork, seeing the centre for Cork Week for the first time, I was totally bemused and all I could think was "the Do Long Bridge".
First there were lights. There were searchlights and everything was ablaze, every building, every pontoon, and every mast. So much light it looked to my tired eyes as if Crosshaven had grown and there was a bridge across the water. There was the noise, pounding music, cheering crowds and the sounds of revelry carrying over the water. As a final touch there were the RIBs whizzing by, full of laughing people, everyone obviously having enjoyed a tremendous night out.
I was so confused and overwhelmed by it all I nearly ran into the pier at Currabinny, but someone in a RIB from the Club soon found us and had us in our berth in minutes. It was 2am and we were hugely impressed that we could be found, recognised and assigned our place within minutes of arriving. No one even batted an eye at a weary group arriving in the early house and the only query was: "Did you see anyone behind you lads?".
But it was just our first experience of the hugely impressive organisation that was to mark everything about Cork Week 2008. We saw the same efficiency everywhere. On the racing front we competed in every race and the most that one of our starts was every delayed was ten minutes. On shore, the race office and results service were second to none, in fact they were probably too good for my liking and I was disqualified from one race after I tried to make off with the starter's inside mark. Anywhere else I would have gotten away with a 360. There was always someone in a RIB to push you into a tight berth, always a hot shower and always friendly advice available on just about everything.
We had an international crew. Three Australians, a couple from San Diego and the rest of us from Cork and Dublin. The Americans sail with us regularly, coming to Ireland every year for a week's racing. They own an identical Beneteau First 36 to ours and they arrived in Cork on the Sunday just for the week's racing. Despite sailing in Southern California, in ideal weather conditions all year round, they have never experienced anything like Cork.
We thought we might be short of crew early in the week and I put a notice on the race week internet site looking for a couple of people. I was overwhelmed by the response and took the first three people who called me, all Australians (one an emigrant from Carrigaline) who had come to Ireland specifically for Cork Week. I thought by the end of the week when our own crew would all have arrived we would lose some of our visitors, but by then we had all become such firm friends that there was absolutely no question of anyone not sailing. On the Friday it did look at one stage like we would have a crew of 13, but a late night in the fleshpots of Crosshaven induced a number of morning casualties and come race time, it was business as normal.
We had three or four people sleeping on the boat every night and the on shore facilities and catering made it a comfortable experience for everyone.
The weather was probably the only good week of a dreadful summer. We had just one rough day, the Tuesday, and we were scheduled for the Slalom Course that day. Gybing downwind in a strong breeze, spinnakers were blowing out all around us, so much so that the sail makers must have been standing at Roches Point rubbing their hands in glee. It was a million dollar wrecking race and once it was all over, great fun. The other variations on the race courses also worked well and the Trapezoid Course was a favourite among all of our crew.
We were all really impressed with the quality of the race officers, their decisiveness in getting races off on time meant that we got our full programme completed in the week and were never kept waiting around. We were in the IRC Class 1, but sailing in a Beneteau we were never going to be anyway competitive up against the racing machines.
We area all pretty experienced sailors and would have no interest in the Gentleman's, but we felt we were caught between two extremes of sailing. Maybe there could be a sub-category in the large IRC classes for boats like ours, giving us someone to race competitively against, while still sailing in a large fleet.
The most enjoyable parts of the week were the adrenaline rush inducing starts. Forty boats, each as big as an articulated truck, jockeying for position on a start line is not a sight or a feeling you are every likely to forget. Nor is the look of sheer terror on some of the faces. As one of our crew put it, you could spot the owner of every boat from a mile at the starts. They were the ones with the white faces; mouths open in horror and fear in their eyes. The crew were the ones laughing at the sheer exhilaration of it all.
One moment in particular sticks in my mind. On one beautiful day we were sailing back past Roches Point after two great races. I was sitting on the bow pulpit relaxing when my phone rang. It was someone from the office in RTE.
"Sorry Fergal, I know you are on holidays, is this a bad time?" "Listen," I said. "I'm, sitting n the bow of a sailing boat, the sun is shining and we've had a fantastic day. There are dolphins jumping around my feet and we're going on the town tonight, you couldn't have phoned me at a better time".
That summed up Cork Week for me. Great sailing, great socialising, making new friends and catching up with old ones. I arrived back in work feeling like I had been gone for a month. Absolutely exhausted but totally relaxed, the sign of a great holiday. 2008 was my third time sailing in Cork Week, roll on Crosshaven in 2010.
Group photo – Dan Hannigan (San Diego), Dan Jackson (Carrigaline and Sydney), Alicia Jackson (Waterford and Sydney), me (Cork), Lynn Hannigan (San Diego) and Noel McNamara (Dublin)
The secret of Cork Week's success cannot be attributed to any one rule or aspect of it's organisation. It's success is found in the eclectic mix of classes, competitors, good courses, good company, our team of dedicated volunteers and the good humour of our 10,000 visitors.
Three months and counting!
"Island Goat" to race at Cork Week
The Countdown Is On!
Visit The Royal Cork Yacht Club
Crew Available/Wanted
Experience Cork Week


In tire and auto parts stores, efficiency is everything, especially when you are competing with big name businesses. We developed SellWise Pro to give you a tire and auto parts store retail point of sale solution that saves you time and effort tracking inventory, so you can improve customer service, reduce overhead, and increase sales.
Our tire and auto parts retail point of sale software has fast, easy-to-use interface that makes selling a breeze and helps your cashiers avoid mistakes, ensuring you have reliable inventory reports and transaction data.
Use the HotKeys feature to set up easy to navigate menus of non-barcoded items like tires by size, as well as services and core charges. HotKeys help you ring up those items faster and with fewer errors at the right price, every time.
Electronic signature capture lets you record the signature of the company driver who bought on the owner's account, so you can always justify the expense and get your invoices paid.
Get detailed customer history reporting, trend analysis, VIP and loyalty tracking, and more at your fingertips to drive sales and wow your customers. Our powerful customer module lets you set up accounts receivable, payment terms, wholesale pricing, fleet vehicle tracking, and tax status to ensure all of those items are handled correctly without relying on the cashier to remember the details.
CAP tire and auto parts retail point of sale software lets you manage customers, vendors, employees, and accounting at the touch of a button, leaving more time for you to spend growing your business with our innovative marketing tools. If you can't beat 'em with pricing, then win customers with service and good old-fashioned know how.


text:
Middle Ages Browser Games
Welcome to the Xena fan page sword-and-Staff.com, here you'll find lots of information about the television series Xena: Warrior Princess, Xena and the DVD seasons and episodes in the overview. The various characters from the Xena series are presented, more Xena fan sites can also be found and various items such as the emergence of the television series Xena: their origin, we believe it is hardly the Hercules series owes.
Grepolis Online Game
A year ago InnoGames opened for lovers of browser games, the gates to ancient Greece. Essentially Grepolis offers much that is of different design strategy games already known, but the topic accordingly be presented differently. It begins on an island with a small Greek town, called a polis. The aim is, first, the local island to do a subject they intend to conquer other islands in the next step. It can forged alliances, raids and temples planned for the support of the local gods are built.
Runes of Magic Roleplay Browsergame
Runes of Magic is a fantasy role-play MMORPG category, which you can play for free online. Since it is the role-play a client online game, in addition to the registration of downloading a game software, the so-called clients, are needed. This can be found on the homepage of the client games, and on some partner sites.
The Tribes Online Browser Game
Browser games are more popular on the internet. The online game "The tribes" is a medieval browser game, in which there is a player on a medieval village, which is to be guided to glory and honor. This is similar to "The tribes" especially classic games such as the famous "Settlers".
Kapi Regnum Browsergame
Kapi Regnum is an online game in the category Business Games, which you can play for free online. Since this is a browser game, you have no games for other software such as online games and you can download from any computer that has an Internet connection to play.
Regnum online Browsergame
An online MMORPG that has no equal.
The online games sector is currently experiencing a boom unspeakable. Regnum Online is a MMORPG as well, but the similarities here to listen first.
Die Königreiche Strategy Browsergame
Are you ready for the ultimate strategy role-playing game that catapults you into another world? Are you prepared for the best of all medieval games and online games and browser games? Did you ever play the medieval online?
1 / 9123456789»
With a Galaxy S3 cell phone, you can also watch the Xena episodes in mobile television. Just open the Galaxy S3 leather bag, take your pick and enjoy the Xena video stream.
The Xena fan page sword-and-staff.com is filled with relevant content about the TV series Xena - Warrior Princess. You will find here the different seasons and episodes of Xena DVDs, a list of other Xena fan sites and exciting medieval games. Here you can watch all the videos and streams and Xena find additional background information on the Xena series.
Copyright © 2022 Sword and Staff. All rights reserved.- Imprint, Privacy Policy


One of the principles underpinning our understanding of ageing is that DNA damage induces a stress response that shifts cellular resources from growth towards maintenance. A contrasting and seemingly irreconcilable view is that prompting growth of, for example, skeletal muscle confers systemic benefit.
To investigate the robustness of these axioms, we induced muscle growth in a murine progeroid model through the use of activin receptor IIB ligand trap that dampens myostatin/activin signalling. Progeric mice were then investigated for neurological and muscle function as well as cellular profiling of the muscle, kidney, liver, and bone.
We show that muscle of Ercc1Δ/− progeroid mice undergoes severe wasting (decreases in hind limb muscle mass of 40–60% compared with normal mass), which is largely protected by attenuating myostatin/activin signalling using soluble activin receptor type IIB (sActRIIB) (increase of 30–62% compared with untreated progeric). sActRIIB‐treated progeroid mice maintained muscle activity (distance travel per hour: 5.6 m in untreated mice vs. 13.7 m in treated) and increased specific force (19.3 mN/mg in untreated vs. 24.0 mN/mg in treated). sActRIIb treatment of progeroid mice also improved satellite cell function especially their ability to proliferate on their native substrate (2.5 cells per fibre in untreated progeroids vs. 5.4 in sActRIIB‐treated progeroids after 72 h in culture). Besides direct protective effects on muscle, we show systemic improvements to other organs including the structure and function of the kidneys; there was a major decrease in the protein content in urine (albumin/creatinine of 4.9 sActRIIB treated vs. 15.7 in untreated), which is likely to be a result in the normalization of podocyte foot processes, which constitute the filtration apparatus (glomerular basement membrane thickness reduced from 224 to 177 nm following sActRIIB treatment). Treatment of the progeric mice with the activin ligand trap protected against the development of liver abnormalities including polyploidy (18.3% untreated vs. 8.1% treated) and osteoporosis (trabecular bone volume; 0.30 mm3 in treated progeroid mice vs. 0.14 mm3 in untreated mice, cortical bone volume; 0.30 mm3 in treated progeroid mice vs. 0.22 mm3 in untreated mice). The onset of neurological abnormalities was delayed (by ~5 weeks) and their severity reduced, overall sustaining health without affecting lifespan.
This study questions the notion that tissue growth and maintaining tissue function during ageing are incompatible mechanisms. It highlights the need for future investigations to assess the potential of therapies based on myostatin/activin blockade to compress morbidity and promote healthy ageing.
Alyodawi, K., Vermeij, W. P., Omairi, S., Kretz, O., Hopkinson, M., Solagna, F., Joch, B., Brandt, R. M. C., Barnhoorn, S., Vliet, N., Ridwan, Y., Essers, J., Mitchell, R., Morash, T., Pasternack, A., Ritvos, O., Matsakas, A., Collins‐Hooper, H., Huber, T. B., Hoeijmakers, J. H. J., and Patel, K. ( 2019) Compression of morbidity in a progeroid mouse model through the attenuation of myostatin/activin signalling. Journal of Cachexia, Sarcopenia and Muscle, https://doi.org/10.1002/jcsm.12404.


The people of floral Beach didn't pay a whole lot of mind to past history, especially when Bailey Fowler, the self-confessed killer, had been properly processed and convicted. They weren't even unduly concerned when, a year after the murder, Fowler walked away from the men's prison at San Luis Obispo, never to be seen again. After all, everyone knew Jean had been a wild kid. "Like mother, like daughter," some said--though never within hearing of Shana Timberlake, who, whatever her faults, still mourned her murdered child.
Kinsey Millhone takes on a case that comes alive again after seventeen years.


Paper towel roll is pretty short though, I think you want it to be longer than strike range.
defensive is different than knocking them out of food drive.
As most snakes get older and bigger, then aren't as defensive as they grow more confident.
Some take a lot more work than others.
Hook training plus shield usage usually can work to get them out, then gentle and secure handling over time can help knock out the defensiveness. Some are just more touchy than others and some are always going to be crabby about handling.
Funny I have read this thread not long ago and now after getting a Boa and had it recommended must say it's a good read. When I was at the pet store buying my Boa the gal that assisted me just went right in with a hook and picked her up. Needless to say the snake was not happy and striking at the worker who admitted the snake doesn't much care for her. Kinda rings a bell with the recommendation in this write up to not use to pick up.
I figure I can train all three of my snakes this way, seems like a consistent way to communicate it's time for handling.
Behira was rearing to go tonight and wanted food. She was ready to strike and darty and had a fast tongue, etc.
The lights were on (I always feed at night with the lights off - and that's when I get door strikes from her), but she was still in "hunt" mode as it was getting late and near lights out and feeding time (although she's off by 10 days ).
I used the hook to calm here down and spontaneously shot an iPhone video of it (one handed - sorry for the poor camera work, and for the socks with crocks - it's cold here in CT and it's not like I wore them out or knew I was going to shoot a video ).
I hope it's helpful for everyone, especially about reading snake body language.
I use a drumstick. lol I just give them a rub and if they look like they are in a mood to be handled I'll handle them. If not, I let it go. Just for the boas. I don't do anything special for the BPs. I just pick them up.
Seriously, I don't worry about Shayna (BP) at all. She has about the weakest food response of any snake I've ever met. She usually take the F/T rat gently and drags into her house quietly to eat. She also doesn't have a mean/defensive bone in her body.


It's true that the early bird often catches the worm, so here at All Vintage Watches we like to help you stay ahead of the crowd. Sign up for Early Access to All Vintage Watches today and we'll alert you, by email, as soon as new watches are available, 12 hours before they go on sale to the general public.
Of course, availability of all our watches is on a first-come, first-served basis, but we also offer a 10% discount on the normal purchase price, exclusively available to Early Access subscribers. Stay in the know, and avoid peak prices, by joining Early Access right away.


Pick the type of space that's best for you. If you have any questions, contact us or drop in for a free half-day!
Private Office memberships require a minimum six-month commitment; other memberships may be changed or canceled anytime. Groups of five or more please contact us.
If you enjoy working from varied and diverse spaces, this is for you! This is the best package to increase your network as you utilize our open layout to its best use. Get your work done and grow your network at the same time.
Are you working on a side business after your 9-5 corporate job? We admire you and we know the struggle, because that's how we created Colombo Cooperative! Use any of our varied workspaces and connect with other like-minded people putting in time after-hours chasing their dreams, just like you.
If you'd like the same desk each time you come in, along with a lockable cabinet, this option is for you. A dedicated desk also works great for small teams to work closely together, while also being close to the open community layout.
This is perfect for our entrepreneurs who want their own enclosed, lockable space. Our private offices provide you the privacy you need if you're in phone meetings every day or if you work closely with a partner. As an added bonus, you also get the luxury of extra storage space!
Want to be a part of our community, but don't need a workspace? Our community membership is a great way to stay connected with all our great people, be included in events, and be part of our member directory. Use our physical address for your business as well, including receiving mail.
Want to use our business services, but pay the member rates? This low-cost membership pays for itself based on the business services discounts.
If you need a refreshing space to touch down and get a productive day of work done and want to meet some cool people at the same time, this is for you.
Want to do a trial run of coworking? Traveling to Colombo and want to stay productive? Interested in getting to know more locals in a professional environment? This package is perfect for you!


We have a 15-page document called: THE NO NONSENSE GUIDE TO HELP YOU PREPARE A STATEMENT OF YOUR CASE. Nowhere (nowhere!) will you find a better explanation of what a Case Statement is all about— and how to write one that is brilliant, exciting, and motivating.
It explains the role of the Case. It may surprise you to learn that the overriding objective is not to have the material read. That's essential, of course. But the Case's overriding responsibility is to move the reader to action. That's what it's all about.
You can access this document here. Or if you would like us to send you a bound copy, call us and we'll ship it.
And by the way, if you want much more extensive information on how to write a Case Statement, call us for a copy of Jerry Panas', MAKING THE CASE. There has never been anything written that is quite as helpful in preparing you for the Case. The book is superb. And fun and funny to read (not totally a bad idea for a subject as serious as writing a Case.) Or you can order the book here online.
E-mail us or call— and we'll explain why we write the Case before any interviews are undertaken. And we'll tell you how we use it and why it makes such an extraordinary difference.
On a regular basis, we also write Case Statements for clients and other institutions that haven't quite made the decision yet to engage us for their campaigns or consulting. (But they will!).
No one writes a more effective and motivating Case Statement than our firm. Well…, of course. Remember, we wrote the book!


to the extent that the application of those provisions would prevent or seriously impair the achievement of the purposes in question.
(d) Article 21(1) (objections to processing).
(b) as regards the disapplication of Article 15(1) to (3), the results of the research or any resulting statistics are not made available in a form which identifies a data subject."
"(1) The listed GDPR provisions do not apply to personal data processed for archiving purposes in the public interest to the extent that the application of those provisions would prevent or seriously impair the achievement of those purposes.
(3) The exemption in sub-paragraph (1) is available only where the personal data is processed in accordance with Article 89(1) of the GDPR (as supplemented by section 19)."
(b) Article 15(3) of the GDPR (reasonable fees for provision of further copies).
(b) specify what the guidance must include.
(1) This section applies where a controller is a credit reference agency (within the meaning of section 145(8) of the Consumer Credit Act 1974).
(2) The controller's obligations under Article 15(1) to (3) of the GDPR (confirmation of processing, access to data and safeguards for third country transfers) are taken to apply only to personal data relating to the data subject's financial standing, unless the data subject has indicated a contrary intention.
106 Recital 63 (63) A data subject should have the right of access to personal data which have been collected concerning him or her, and to exercise that right easily and at reasonable intervals, in order to be aware of, and verify, the lawfulness of the processing. This includes the right for data subjects to have access to data concerning their health, for example the data in their medical records containing information such as diagnoses, examination results, assessments by treating physicians and any treatment or interventions provided. Every data subject should therefore have the right to know and obtain communication in particular with regard to the purposes for which the personal data are processed, where possible the period for which the personal data are processed, the recipients of the personal data, the logic involved in any automatic personal data processing and, at least when based on profiling, the consequences of such processing. Where possible, the controller should be able to provide remote access to a secure system which would provide the data subject with direct access to his or her personal data. That right should not adversely affect the rights or freedoms of others, including trade secrets or intellectual property and in particular the copyright protecting the software. However, the result of those considerations should not be a refusal to provide all information to the data subject. Where the controller processes a large quantity of information concerning the data subject, the controller should be able to request that, before the information is delivered, the data subject specify the information or processing activities to which the request relates.
107 Recital 64 (64) The controller should use all reasonable measures to verify the identity of a data subject who requests access, in particular in the context of online services and online identifiers. A controller should not retain personal data for the sole purpose of being able to react to potential requests.
108 Recital 73 (73) Restrictions concerning specific principles and the rights of information, access to and rectification or erasure of personal data, the right to data portability, the right to object, decisions based on profiling, as well as the communication of a personal data breach to a data subject and certain related obligations of the controllers may be imposed by Union or Member State law, as far as necessary and proportionate in a democratic society to safeguard public security, including the protection of human life especially in response to natural or manmade disasters, the prevention, investigation and prosecution of criminal offences or the execution of criminal penalties, including the safeguarding against and the prevention of threats to public security, or of breaches of ethics for regulated professions, other important objectives of general public interest of the Union or of a Member State, in particular an important economic or financial interest of the Union or of a Member State, the keeping of public registers kept for reasons of general public interest, further processing of archived personal data to provide specific information related to the political behaviour under former totalitarian state regimes or the protection of the data subject or the rights and freedoms of others, including social protection, public health and humanitarian purposes. Those restrictions should be in accordance with the requirements set out in the Charter and in the European Convention for the Protection of Human Rights and Fundamental Freedoms.


When you have a business challenge, such as communicating with a complex target audience, increasing revenue, or growing your influence, that's where we come in.
We provide you with free initial advice on different ways you can overcome your challenges to achieve your goals. It's then up to you to choose to implement one of our recommended solutions on your own or with our help.
It's simple and we're confident of the results you'll get.
The great thing is that you get practical advice to help you both now and into the future. Our focus is on delivering you both short-term gains and long-term advantage.
You'll also free up your time to focus on what you do best.
If you want solutions to your business problems, book an appointment with us today.


Newswise — Researchers at UT Southwestern Medical Center have for the first time used drug-treated blood stem cells to repair heart damage in an animal model, results that might point to methods for healing injuries from heart attacks or disease.
In the study, researchers screened about 147,000 molecules to find one that could transform human blood stem cells into a form resembling immature heart cells. When they implanted blood stem cells activated by this compound into injured rodent hearts, the human cells took root and improved the animals' heart function.
"The clinical potential is enormous," said Dr. Jay Schneider, assistant professor of internal medicine and senior author of the study, which appears online this week and in a future issue of the Proceedings of the National Academy of Sciences.
Despite medical advances in treating and preventing heart attacks, once the heart is damaged it cannot repair itself, said Dr. Schneider, a cardiologist.
"Heart attack is a man-made problem," he said. "It's a function of increased longevity and atherosclerosis, which have occurred at no other time in human evolution."
In the first stage of the current study, which involved mouse stem cells, the researchers screened some 147,000 compounds in UT Southwestern's Small Molecule Library to see which ones would activate genes known to be at work in the early stages of heart development.
This initial screening sifted out about 1,600 compounds, but the researchers narrowed their focus to a related group of molecules, among the most potent and easy to make, called Shz for sulfonyl-hydrazone.
The researchers then tested the effects of one Shz compound, Shz-3, a molecular variant synthesized by chemists at UT Southwestern, on human blood stem cells. These cells, called PBMCs for peripheral blood mononuclear cells, were cultured with Shz-3 for three days, then for seven days without the drug.
Tests showed that the Shz-treated cells began to create RNAs and proteins found only in heart cells. They were then implanted into the hearts of rats with heart damage. After a week, the function of the rats' hearts had significantly improved, and after three weeks, the organs contracted as strongly as they did before the damage. Tests showed that the human cells were alive and had incorporated themselves into the heart tissue, although the researchers could not tell whether the human cells had become fully functional, contracting heart cells.
"This functional test is a good first step," Dr. Schneider said "What this shows is that this drug can act on blood stem cells that are already being used in other clinical trials. This may speed its movement into clinical trials for heart repair."
Shz compounds do not appear to be toxic in mice, and because the human blood stem cells are washed for seven days after treatment, the compounds are likely not to be harmful to humans, although further tests are needed, Dr. Schneider said.
Further studies will examine precisely what the Shz drugs are doing to the cells, and to identify additional chemical signals that might drive the cells toward a more mature form of heart cell, the researchers said.
Other UT Southwestern researchers in internal medicine involved in the study were lead author Dr. Hesham Sadek, instructor; Britta Hannack, research assistant; Dr. Elizabeth Choe and Dr. Jessica Wang, former residents; Dr. Shuaib Latif, former cardiology fellow; Dr. Mary Garry, former assistant professor; Dr. Daniel Garry, former associate professor; Jamie Longgood, senior research associate in biochemistry; Dr. Douglas Frantz, assistant professor of biochemistry; Dr. Eric Olson, chairman of molecular biology; and Dr. Jenny Hsieh, assistant professor of molecular biology.
The work was supported by the Donald W. Reynolds Foundation, the Esther A. and Joseph Klingenstein Fund, the Ellison Medical Foundation, the Texas Higher Education Coordinating Board, the Welch Foundation and the Haberecht Wild-Hare Idea Program.


Technology is transforming the way we do business – so why are some in New Zealand's primary sector lagging behind?
Tasked with lifting the awareness and use of precision agriculture across NZ's primary sector, chair of Precision Agriculture Association Roger Robson-Williams has spent the best part of the last 20 years looking at the benefits technology can bring - benefits he says could be a game changer.
A recent ANZ survey of agri customers showed 45 per cent were using technology to help them measure and monitor their environmental footprint, but the agri sector in general has been slow to adopt.
Robson-Williams' guess as to the reason behind the slow uptake is because the economic case for investing in technology is not always clear.
"I don't get the impression we have a very clear strategy for how we develop both the agri-tech sector for its own export value, but also to help support our primary production sectors," he says.
NZ's primary sector drives the economy; creates jobs and puts food on tables around the world but productivity growth has largely relied on intensification.
With future expansion challenged by the impact of land use on water quality, particularly in dairy, precision farming offers an opportunity for new productivity gains and ensures that as an agricultural nation and exporter NZ stays ahead of the game.
"What farmers are trying to do with precision technologies is to manage as much of the uncertainty and variability as they can," Robson-Williams says.
The easiest way to understand precision agri, or precision farming, is to think of it as everything which makes the practice of farming more accurate and controlled when it comes to the growing of crops and raising livestock.
"Done in the right way, you can get increased productivity, reduced environmental impact – including lower nutrient losses and fewer greenhouse gas emissions - and a compelling and verifiable provenance story," Robson-Williams says.
A key component of this approach to farming is the use of information technology alongside things like GPS guidance, irrigation systems, sensors, robotics, drones, variable rate technology and soil sampling.
Those using technology in their agri-businesses are quick to point out the benefits, particularly when it comes to meeting consumer expectation and the changing environmental regulations around farming.
Te Awamutu dairy farmer John Hayward says the days of writing everything in a little yellow book and putting it in your top pocket are long gone.
"For us, technology is a big part of what we are doing, and it's making our day-to-day life simpler," he says.
Halo allows them to measure all the water usage on farm, a weather station measures rain fall, soil moisture and soil temperature and they also measure the milk temperature in the vat.
All the data is recorded by TagI.t technology and can be exported to stakeholders, like the Regional Council, to show they are farming within water consents and managing their environmental footprint.
This type of measuring and monitoring allows Hayward to understand the environmental impact of his operation and how to mitigate it.
"If you own property in New Zealand, you have a responsibility to know what your footprint is and know how you are going to mitigate it," Hayward says.
Further south in Nelson, Hop grower Cam Ealam is using technology to optimise the use of nutrients to his crops.
Ealam has installed moisture meters in the hop garden which record the moisture content and temperature of the soil and also help monitor nutrient levels in the soil.
"We can actually monitor or track when to put fertilizer applications on, and track how the plants are taking up nutrients," he says. "Alongside this you can see where there have been high rainfall events, and where there is leaching.
It's easy to see how better targeting of inputs can give the same or even greater level of production with fewer inputs but Robson-Williams says there is even greater potential beyond traditional precision farming with sensing and sorting technology and machine vision.
"Instead of harvesting all the kiwifruit or apples and putting them all in one bin and then subsequently sorting and grading them we asked if there were smarter ways we could sort and grade them on the orchard," he says.
The fast growing tech sector, which is now the third largest and fastest growing export sector, worth over $NZ6.3 billion in 2015 and employing 5 per cent of the NZ workforce, is increasingly finding solutions to global problems.
Robotics Plus is developing innovative orchard robotics and Compac has developed world leading technology in sensing and sorting technology for the packhouse.
Engineer Craig Piggott's GPS solar-powered cow collar Halter can self-herd cows, send data about their behaviour, emotions and health to a farmer's phone and also keep them away from waterways.
Halter could completely do away with the need for fences.
Robson-Williams thinks New Zealand could do better to support and nurture home-grown Kiwi innovation to solve some problems.
"The NZ agtech sector is a complicated ecosystem of start-ups along with small and larger companies doing some neat stuff but often somewhat in isolation," he says.
The opportunity to support agtech to improve New Zealand's agriculture sector appears clear; how to do that, less so.
Water trading is driving Australian agriculture's competitive advantage – and providing new avenues for sustainability.
New Zealand faces many challenges to ensure they reach their emissions targets by 2050.


text:
Aussies Welcome 2010
Fires, flooding, and cyclones wreaked havoc on Australia in 2009, but the nation is putting the past behind them as they entered 2010 with fireworks and celebration. "We are all now engaged in nation-building for recovery, nation-building for the future," said Prime Minister Kevin Rudd. To celebrate, over 1.5 million people gathered around Sydney Harbour to watch 5,000 kilograms of explosives in what Australian politician Kristina Keneally called "the best show on earth." Melbourne and Brisbane also displayed big firework shows, but most Aussies across the nation rang in the new year with the grand old tradition of beer drinking.
Read it at The Australian