text:
package org.pentaho.di.trans.steps.propertyinput;

import java.util.List;
import java.util.Map;

import org.apache.commons.vfs.FileObject;
import org.pentaho.di.core.CheckResult;
import org.pentaho.di.core.CheckResultInterface;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.Counter;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleStepException;
import org.pentaho.di.core.exception.KettleXMLException;
import org.pentaho.di.core.fileinput.FileInputList;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMeta;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.core.variables.VariableSpace;
import org.pentaho.di.core.vfs.KettleVFS;
import org.pentaho.di.core.xml.XMLHandler;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.repository.ObjectId;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.resource.ResourceDefinition;
import org.pentaho.di.resource.ResourceNamingInterface;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.BaseStepMeta;
import org.pentaho.di.trans.step.StepDataInterface;
import org.pentaho.di.trans.step.StepInterface;
import org.pentaho.di.trans.step.StepMeta;
import org.pentaho.di.trans.step.StepMetaInterface;
import org.w3c.dom.Node;

public class PropertyInputMeta extends BaseStepMeta implements StepMetaInterface
{
	private static Class<?> PKG = PropertyInputMeta.class; // for i18n purposes, needed by Translator2!!   $NON-NLS-1$

	public static final String[] RequiredFilesDesc = new String[] { BaseMessages.getString(PKG, "System.Combo.No"), BaseMessages.getString(PKG, "System.Combo.Yes") };
	public static final String[] RequiredFilesCode = new String[] {"N", "Y"};

	public static final String DEFAULT_ENCODING="UTF-8";

	private String encoding;

	private String fileType;
	public static final String[] fileTypeDesc = new String[] {BaseMessages.getString(PKG, "PropertyInputMeta.FileType.Property"),BaseMessages.getString(PKG, "PropertyInputMeta.FileType.Ini")};
	public static final String[] fileTypeCode = new String[] {"property", "ini"};
	public static final int FILE_TYPE_PROPERTY = 0;
	public static final int FILE_TYPE_INI = 1;

	/** Array of filenames */
	private  String  fileName[];

	/** Wildcard or filemask (regular expression) */
	private  String  fileMask[];

	/** Wildcard or filemask to exclude (regular expression) */
	private String             excludeFileMask[];

	/** Flag indicating that we should include the filename in the output */
	private  boolean includeFilename;

	/** Array of boolean values as string, indicating if a file is required. */
	private  String  fileRequired[];

	/** Array of boolean values as string, indicating if we need to fetch sub folders. */
	private  String  includeSubFolders[];

	/** Flag indicating that we should reset RowNum for each file */
	private boolean resetRowNumber;

	/** Flag do variable substitution for value */
	private boolean resolvevaluevariable;

	/** The name of the field in the output containing the filename */
	private  String  filenameField;

	/** Flag indicating that a row number field should be included in the output */
	private  boolean includeRowNumber;

	/** The name of the field in the output containing the row number*/
	private  String  rowNumberField;

	/** The maximum number or lines to read */
	private  long  rowLimit;

	/** The fields to import... */
	private PropertyInputField inputFields[];

	/** file name from previous fields **/
	private boolean filefield;

	private boolean isaddresult;

	private String dynamicFilenameField;

	private static final String YES = "Y";

    public final static String type_trim_code[] = { "none", "left", "right", "both" };

    public final static String column_code[] = { "key", "value" };

	/** Flag indicating that a INI file section field should be included in the output */
	private  boolean includeIniSection;

	/** The name of the field in the output containing the INI file section*/
	private String iniSectionField;

	private String section;

    /** Additional fields  **/
    private String shortFileFieldName;
    private String pathFieldName;
    private String hiddenFieldName;
    private String lastModificationTimeFieldName;
    private String uriNameFieldName;
    private String rootUriNameFieldName;
    private String extensionFieldName;
    private String sizeFieldName;

	public PropertyInputMeta()
	{
		super(); // allocate BaseStepMeta
	}
	/**
	 * @return Returns the extensionFieldName.
	 */
    public String getExtensionField()
    {
    	return extensionFieldName;
    }
    /**
	 * @param field The extensionFieldName to set.
	 */
    public void setExtensionField(String field)
    {
    	extensionFieldName=field;
    }
    /**
	 * @return Returns the sizeFieldName.
	 */
    public String getSizeField()
    {
    	return sizeFieldName;
    }
    /**
	 * @param field The sizeFieldName to set.
	 */
    public void setSizeField(String field)
    {
    	sizeFieldName=field;
    }
	/**
	 * @return Returns the shortFileFieldName.
	 */
    public String getShortFileNameField()
    {
    	return shortFileFieldName;
    }
    /**
	 * @param field The shortFileFieldName to set.
	 */
    public void setShortFileNameField(String field)
    {
    	shortFileFieldName=field;
    }

	/**
	 * @return Returns the pathFieldName.
	 */
    public String getPathField()
    {
    	return pathFieldName;
    }
    /**
	 * @param field The pathFieldName to set.
	 */
    public void setPathField(String field)
    {
    	this.pathFieldName=field;
    }
	/**
	 * @return Returns the hiddenFieldName.
	 */
    public String isHiddenField()
    {
    	return hiddenFieldName;
    }
    /**
	 * @param field The hiddenFieldName to set.
	 */
    public void setIsHiddenField(String field)
    {
    	hiddenFieldName=field;
    }
	/**
	 * @return Returns the lastModificationTimeFieldName.
	 */
    public String getLastModificationDateField()
    {
    	return lastModificationTimeFieldName;
    }
    /**
	 * @param field The lastModificationTimeFieldName to set.
	 */
    public void setLastModificationDateField(String field)
    {
    	lastModificationTimeFieldName=field;
    }
    /**
	 * @return Returns the uriNameFieldName.
	 */
    public String getUriField()
    {
    	return uriNameFieldName;
    }
    /**
	 * @param field The uriNameFieldName to set.
	 */
    public void setUriField(String field)
    {
    	uriNameFieldName=field;
    }
    /**
	 * @return Returns the uriNameFieldName.
	 */
    public String getRootUriField()
    {
    	return rootUriNameFieldName;
    }
    /**
	 * @param field The rootUriNameFieldName to set.
	 */
    public void setRootUriField(String field)
    {
    	rootUriNameFieldName=field;
    }

	/**
     * @return Returns the input fields.
     */
    public PropertyInputField[] getInputFields()
    {
        return inputFields;
    }

    /**
     * @param inputFields The input fields to set.
     */
    public void setInputFields(PropertyInputField[] inputFields)
    {
        this.inputFields = inputFields;
    }

    /**
     * @return Returns the fileMask.
     */
    public String[] getFileMask()
    {
        return fileMask;
    }

    /**
     * @param fileMask The fileMask to set.
     */
    public void setFileMask(String[] fileMask)
    {
        this.fileMask = fileMask;
    }

    /**
     * @return Returns the fileName.
     */
    public String[] getFileName()
    {
        return fileName;
    }
	/**
	 * @return Returns the excludeFileMask.
	 */
	public String[] getExludeFileMask()
	{
		return excludeFileMask;
	}
	/**
	 * @param excludeFileMask The excludeFileMask to set.
	 */
	public void setExcludeFileMask(String[] excludeFileMask)
	{
		this.excludeFileMask = excludeFileMask;
	}
    public String[] getFileRequired() {
		return this.fileRequired;
	}

	public void setFileRequired(String[] fileRequiredin) {
		for (int i=0;i<fileRequiredin.length;i++)
		{
			this.fileRequired[i] = getRequiredFilesCode(fileRequiredin[i]);
		}
	}
	public String[] getIncludeSubFolders() {
		return includeSubFolders;
	}

	public void setIncludeSubFolders(String[] includeSubFoldersin) {
		for (int i=0;i<includeSubFoldersin.length;i++)
		{
			this.includeSubFolders[i] = getRequiredFilesCode(includeSubFoldersin[i]);
		}
	}
	 public String getRequiredFilesCode(String tt)
	    {
	   	if(tt==null) return RequiredFilesCode[0];
			if(tt.equals(RequiredFilesDesc[1]))
				return RequiredFilesCode[1];
			else
				return RequiredFilesCode[0];
	    }
	  public String getRequiredFilesDesc(String tt)
	  {
	 	if(tt==null) return RequiredFilesDesc[0];
			if(tt.equals(RequiredFilesCode[1]))
				return RequiredFilesDesc[1];
			else
				return RequiredFilesDesc[0];
	  }
    /**
     * @param fileName The fileName to set.
     */
    public void setFileName(String[] fileName)
    {
        this.fileName = fileName;
    }

    /**
     * @return Returns the filenameField.
     */
    public String getFilenameField()
    {
        return filenameField;
    }

    /**
     * @return Returns the dynamically defined filename field (to read from previous steps).
     */
    public String getDynamicFilenameField()
    {
        return dynamicFilenameField;
    }

    /**
     * @param dynamicFilenameField the dynamically defined filename field (to read from previous steps)
     */
    public void setDynamicFilenameField(String dynamicFilenameField)
    {
        this.dynamicFilenameField = dynamicFilenameField;
    }

    /**
     * @param filenameField The filenameField to set.
     */
    public void setFilenameField(String filenameField)
    {
        this.filenameField = filenameField;
    }

    /**
     * @return Returns the includeFilename.
     */
    public boolean includeFilename()
    {
        return includeFilename;
    }

    /**
     * @param includeFilename The includeFilename to set.
     */
    public void setIncludeFilename(boolean includeFilename)
    {
        this.includeFilename = includeFilename;
    }
    public static String getFileTypeCode(int i) {
		if (i < 0 || i >= fileTypeCode.length)
			return fileTypeCode[0];
		return fileTypeCode[i];
	}
	public static int getFileTypeByDesc(String tt) {
		if (tt == null)
			return 0;

		for (int i = 0; i < fileTypeDesc.length; i++) {
			if (fileTypeDesc[i].equalsIgnoreCase(tt))
				return i;
		}
		// If this fails, try to match using the code.
		return getFileTypeByCode(tt);
	}
	public static int getFileTypeByCode(String tt) {
		if (tt == null)
			return 0;

		for (int i = 0; i < fileTypeCode.length; i++) {
			if (fileTypeCode[i].equalsIgnoreCase(tt))
				return i;
		}
		return 0;
	}
	public static String getFileTypeDesc(int i) {
		if (i < 0 || i >= fileTypeDesc.length)
			return fileTypeDesc[0];
		return fileTypeDesc[i];
	}
	public void setFileType(String filetype)
	{
		this.fileType=filetype;
	}
	public String getFileType()
	{
		return fileType;
	}
    /**
     * @param includeIniSection The includeIniSection to set.
     */
    public void setIncludeIniSection(boolean includeIniSection)
    {
        this.includeIniSection = includeIniSection;
    }

    /**
     * @return Returns the includeIniSection.
     */
    public boolean includeIniSection()
    {
        return includeIniSection;
    }
    /**
     * @param encoding The encoding to set.
     */
    public void setEncoding(String encoding)
    {
        this.encoding = encoding;
    }

    /**
     *  @return Returns encoding.
     */
    public String getEncoding()
    {
        return encoding;
    }
    /**
     * @param iniSectionField The iniSectionField to set.
     */
    public void setINISectionField(String iniSectionField)
    {
        this.iniSectionField = iniSectionField;
    }

    /**
     * @return Returns the iniSectionField.
     */
    public String getINISectionField()
    {
        return iniSectionField;
    }

    /**
     * @param section The section to set.
     */
    public void setSection(String section)
    {
        this.section = section;
    }

    /**
     * @return Returns the section.
     */
    public String getSection()
    {
        return section;
    }

    /**
     * @return Returns the includeRowNumber.
     */
    public boolean includeRowNumber()
    {
        return includeRowNumber;
    }

    /**
     * @return Returns the File field.
     */
    public boolean isFileField()
    {
        return filefield;
    }
    /**
     * @param filefield The filefield to set.
     */
    public void setFileField(boolean filefield)
    {
        this.filefield = filefield;
    }

    /**
     * @return Returns the resetRowNumber.
     */
    public boolean resetRowNumber()
    {
        return resetRowNumber;
    }

    /**
     * @param includeRowNumber The includeRowNumber to set.
     */
    public void setIncludeRowNumber(boolean includeRowNumber)
    {
        this.includeRowNumber = includeRowNumber;
    }

    /**
     * @param isaddresult The isaddresult to set.
     */
    public void setAddResultFile(boolean isaddresult)
    {
        this.isaddresult = isaddresult;
    }

    /**
     *  @return Returns isaddresult.
     */
    public boolean isAddResultFile()
    {
        return isaddresult;
    }

    /**
     * @param resetRowNumber The resetRowNumber to set.
     */
    public void setResetRowNumber(boolean resetRowNumber)
    {
        this.resetRowNumber = resetRowNumber;
    }

    /**
     * @param resolvevaluevariable The resolvevaluevariable to set.
     */
    public void setResolveValueVariable(boolean resolvevaluevariable)
    {
        this.resolvevaluevariable=resolvevaluevariable;
    }

    /**
     *  @return Returns resolvevaluevariable.
     */
    public boolean isResolveValueVariable()
    {
        return resolvevaluevariable;
    }
    /**
     * @return Returns the rowLimit.
     */
    public long getRowLimit()
    {
        return rowLimit;
    }

    /**
     * @param rowLimit The rowLimit to set.
     */
    public void setRowLimit(long rowLimit)
    {
        this.rowLimit = rowLimit;
    }

    /**
     * @return Returns the rowNumberField.
     */
    public String getRowNumberField()
    {
        return rowNumberField;
    }

    /**
     * @param rowNumberField The rowNumberField to set.
     */
    public void setRowNumberField(String rowNumberField)
    {
        this.rowNumberField = rowNumberField;
    }

    public void loadXML(Node stepnode, List<DatabaseMeta> databases, Map<String, Counter> counters)
	throws KettleXMLException
	{
    	readData(stepnode);
	}

	public Object clone()
	{
		PropertyInputMeta retval = (PropertyInputMeta)super.clone();
		int nrFiles  = fileName.length;
		int nrFields = inputFields.length;
		retval.allocate(nrFiles, nrFields);
		for (int i=0;i<nrFiles;i++)
		{
			retval.fileName[i]     = fileName[i];
			retval.fileMask[i]     = fileMask[i];
            retval.excludeFileMask[i] = excludeFileMask[i];
			retval.fileRequired[i] = fileRequired[i];
			retval.includeSubFolders[i] = includeSubFolders[i];
		}
		for (int i=0;i<nrFields;i++)
		{
            if (inputFields[i]!=null)
            {
                retval.inputFields[i] = (PropertyInputField)inputFields[i].clone();
            }
		}

		return retval;
	}

    public String getXML()
    {
        StringBuffer retval=new StringBuffer(500);
        retval.append("    ").append(XMLHandler.addTagValue("file_type",         fileType));
        retval.append("    ").append(XMLHandler.addTagValue("encoding",         encoding));
        retval.append("    ").append(XMLHandler.addTagValue("include",         includeFilename));
        retval.append("    ").append(XMLHandler.addTagValue("include_field",   filenameField));
        retval.append("    ").append(XMLHandler.addTagValue("filename_Field",  dynamicFilenameField));
        retval.append("    ").append(XMLHandler.addTagValue("rownum",          includeRowNumber));
        retval.append("    ").append(XMLHandler.addTagValue("isaddresult",     isaddresult));
        retval.append("    ").append(XMLHandler.addTagValue("filefield",       filefield));
        retval.append("    ").append(XMLHandler.addTagValue("rownum_field",    rowNumberField));
        retval.append("    ").append(XMLHandler.addTagValue("resetrownumber",  resetRowNumber));
        retval.append("    ").append(XMLHandler.addTagValue("resolvevaluevariable",  resolvevaluevariable));
        retval.append("    ").append(XMLHandler.addTagValue("ini_section",          includeIniSection));
        retval.append("    ").append(XMLHandler.addTagValue("ini_section_field",    iniSectionField));
        retval.append("    ").append(XMLHandler.addTagValue("section",  section));
        retval.append("    <file>").append(Const.CR);
        for (int i=0;i<fileName.length;i++)
        {
            retval.append("      ").append(XMLHandler.addTagValue("name",     fileName[i]));
			retval.append("      ").append(XMLHandler.addTagValue("exclude_filemask", excludeFileMask[i]));
            retval.append("      ").append(XMLHandler.addTagValue("filemask", fileMask[i]));
			retval.append("      ").append(XMLHandler.addTagValue("file_required", fileRequired[i]));
			retval.append("      ").append(XMLHandler.addTagValue("include_subfolders", includeSubFolders[i]));
        }
        retval.append("    </file>").append(Const.CR);

        /*
		 * Describe the fields to read
		 */
		retval.append("    <fields>").append(Const.CR);
		for (int i=0;i<inputFields.length;i++)
		{
			retval.append("      <field>").append(Const.CR);
			retval.append("        ").append(XMLHandler.addTagValue("name",      inputFields[i].getName()) );
			retval.append("        ").append(XMLHandler.addTagValue("column",      inputFields[i].getColumnCode()));
			retval.append("        ").append(XMLHandler.addTagValue("type",      inputFields[i].getTypeDesc()) );
            retval.append("        ").append(XMLHandler.addTagValue("format", inputFields[i].getFormat()));
            retval.append("        ").append(XMLHandler.addTagValue("length",    inputFields[i].getLength()) );
            retval.append("        ").append(XMLHandler.addTagValue("precision", inputFields[i].getPrecision()));
            retval.append("        ").append(XMLHandler.addTagValue("currency", inputFields[i].getCurrencySymbol()));
            retval.append("        ").append(XMLHandler.addTagValue("decimal", inputFields[i].getDecimalSymbol()));
            retval.append("        ").append(XMLHandler.addTagValue("group", inputFields[i].getGroupSymbol()));
			retval.append("        ").append(XMLHandler.addTagValue("trim_type", inputFields[i].getTrimTypeCode() ) );
			retval.append("        ").append(XMLHandler.addTagValue("repeat",    inputFields[i].isRepeated()) );
			retval.append("      </field>").append(Const.CR);
		}
		retval.append("    </fields>").append(Const.CR);
        retval.append("    ").append(XMLHandler.addTagValue("limit", rowLimit));
		retval.append("    ").append(XMLHandler.addTagValue("shortFileFieldName", shortFileFieldName));
		retval.append("    ").append(XMLHandler.addTagValue("pathFieldName", pathFieldName));
		retval.append("    ").append(XMLHandler.addTagValue("hiddenFieldName", hiddenFieldName));
		retval.append("    ").append(XMLHandler.addTagValue("lastModificationTimeFieldName", lastModificationTimeFieldName));
		retval.append("    ").append(XMLHandler.addTagValue("uriNameFieldName", uriNameFieldName));
		retval.append("    ").append(XMLHandler.addTagValue("rootUriNameFieldName", rootUriNameFieldName));
		retval.append("    ").append(XMLHandler.addTagValue("extensionFieldName", extensionFieldName));
		retval.append("    ").append(XMLHandler.addTagValue("sizeFieldName", sizeFieldName));
        return retval.toString();
    }

	private void readData(Node stepnode) throws KettleXMLException
	{
		try
		{
			fileType     = XMLHandler.getTagValue(stepnode, "file_type");
			encoding     = XMLHandler.getTagValue(stepnode, "encoding");
			includeFilename   = "Y".equalsIgnoreCase(XMLHandler.getTagValue(stepnode, "include"));
			filenameField     = XMLHandler.getTagValue(stepnode, "include_field");
			includeRowNumber  = "Y".equalsIgnoreCase(XMLHandler.getTagValue(stepnode, "rownum"));

			String addresult=XMLHandler.getTagValue(stepnode, "isaddresult");
			if(Const.isEmpty(addresult))
				isaddresult=true;
			else
				isaddresult  = "Y".equalsIgnoreCase(addresult);
			section    = XMLHandler.getTagValue(stepnode, "section");
			iniSectionField    = XMLHandler.getTagValue(stepnode, "ini_section_field");
			includeIniSection  = "Y".equalsIgnoreCase(XMLHandler.getTagValue(stepnode, "ini_section"));
			filefield  = "Y".equalsIgnoreCase(XMLHandler.getTagValue(stepnode, "filefield"));
			rowNumberField    = XMLHandler.getTagValue(stepnode, "rownum_field");
			dynamicFilenameField    = XMLHandler.getTagValue(stepnode, "filename_Field");
			resetRowNumber  = "Y".equalsIgnoreCase(XMLHandler.getTagValue(stepnode, "resetrownumber"));
			resolvevaluevariable  = "Y".equalsIgnoreCase(XMLHandler.getTagValue(stepnode, "resolvevaluevariable"));
			Node filenode   = XMLHandler.getSubNode(stepnode,  "file");
			Node fields     = XMLHandler.getSubNode(stepnode,  "fields");
			int nrFiles     = XMLHandler.countNodes(filenode,  "name");
			int nrFields    = XMLHandler.countNodes(fields,    "field");

			allocate(nrFiles, nrFields);

			for (int i=0;i<nrFiles;i++)
			{
				Node filenamenode = XMLHandler.getSubNodeByNr(filenode, "name", i);
				Node filemasknode = XMLHandler.getSubNodeByNr(filenode, "filemask", i);
				Node excludefilemasknode     = XMLHandler.getSubNodeByNr(filenode, "exclude_filemask", i);
				Node fileRequirednode = XMLHandler.getSubNodeByNr(filenode, "file_required", i);
				Node includeSubFoldersnode = XMLHandler.getSubNodeByNr(filenode, "include_subfolders", i);
				fileName[i] = XMLHandler.getNodeValue(filenamenode);
				fileMask[i] = XMLHandler.getNodeValue(filemasknode);
				excludeFileMask[i]    = XMLHandler.getNodeValue(excludefilemasknode);
				fileRequired[i] = XMLHandler.getNodeValue(fileRequirednode);
				includeSubFolders[i] = XMLHandler.getNodeValue(includeSubFoldersnode);
			}

			for (int i=0;i<nrFields;i++)
			{
				Node fnode = XMLHandler.getSubNodeByNr(fields, "field", i);
				inputFields[i] = new PropertyInputField();

				inputFields[i].setName( XMLHandler.getTagValue(fnode, "name") );
				inputFields[i].setColumn( getColumnByCode(XMLHandler.getTagValue(fnode, "column")) );
				inputFields[i].setType( ValueMeta.getType(XMLHandler.getTagValue(fnode, "type")) );
				inputFields[i].setLength( Const.toInt(XMLHandler.getTagValue(fnode, "length"), -1) );
				inputFields[i].setPrecision( Const.toInt(XMLHandler.getTagValue(fnode, "precision"), -1) );
				String srepeat      = XMLHandler.getTagValue(fnode, "repeat");
				inputFields[i].setTrimType( getTrimTypeByCode(XMLHandler.getTagValue(fnode, "trim_type")) );

				if (srepeat!=null) inputFields[i].setRepeated( YES.equalsIgnoreCase(srepeat) );
				else               inputFields[i].setRepeated( false );

				inputFields[i].setFormat(XMLHandler.getTagValue(fnode, "format"));
				inputFields[i].setCurrencySymbol(XMLHandler.getTagValue(fnode, "currency"));
				inputFields[i].setDecimalSymbol(XMLHandler.getTagValue(fnode, "decimal"));
				inputFields[i].setGroupSymbol(XMLHandler.getTagValue(fnode, "group"));

			}

			// Is there a limit on the number of rows we process?
			rowLimit = Const.toLong(XMLHandler.getTagValue(stepnode, "limit"), 0L);
			shortFileFieldName = XMLHandler.getTagValue(stepnode, "shortFileFieldName");
			pathFieldName = XMLHandler.getTagValue(stepnode, "pathFieldName");
			hiddenFieldName = XMLHandler.getTagValue(stepnode, "hiddenFieldName");
			lastModificationTimeFieldName = XMLHandler.getTagValue(stepnode, "lastModificationTimeFieldName");
			uriNameFieldName = XMLHandler.getTagValue(stepnode, "uriNameFieldName");
			rootUriNameFieldName = XMLHandler.getTagValue(stepnode, "rootUriNameFieldName");
			extensionFieldName = XMLHandler.getTagValue(stepnode, "extensionFieldName");
			sizeFieldName = XMLHandler.getTagValue(stepnode, "sizeFieldName");

		}
		catch(Exception e)
		{
			throw new KettleXMLException("Unable to load step info from XML", e);
		}
	}

	public void allocate(int nrfiles, int nrfields)
	{
		fileName   = new String [nrfiles];
		fileMask   = new String [nrfiles];
		excludeFileMask = new String[nrfiles];
		fileRequired   = new String [nrfiles];
		includeSubFolders   = new String [nrfiles];
		inputFields = new PropertyInputField[nrfields];
	}

	public void setDefault()
	{
		 shortFileFieldName=null;
		    pathFieldName=null;
		    hiddenFieldName=null;
		    lastModificationTimeFieldName=null;
		    uriNameFieldName=null;
		    rootUriNameFieldName=null;
		    extensionFieldName=null;
		    sizeFieldName=null;

		fileType=fileTypeCode[0];
		section="";
		encoding=DEFAULT_ENCODING;
		includeIniSection=false;
		iniSectionField="";
		resolvevaluevariable=false;
		isaddresult=true;
		filefield=false;
		includeFilename  = false;
		filenameField    = "";
		includeRowNumber = false;
		rowNumberField   = "";
		dynamicFilenameField ="";

		int nrFiles  =0;
		int nrFields =0;

		allocate(nrFiles, nrFields);

		for (int i=0;i<nrFiles;i++)
		{
			fileName[i]="filename"+(i+1);
			fileMask[i]="";
			excludeFileMask[i]="";
			fileRequired[i] = RequiredFilesCode[0];
			includeSubFolders[i] = RequiredFilesCode[0];
		}

		for (int i=0;i<nrFields;i++)
		{
		    inputFields[i] = new PropertyInputField("field"+(i+1));
		}

		rowLimit=0;
	}
	public void getFields(RowMetaInterface r, String name, RowMetaInterface info[], StepMeta nextStep, VariableSpace space) throws KettleStepException
	{

		int i;
		for (i=0;i<inputFields.length;i++)
		{
		    PropertyInputField field = inputFields[i];

			int type=field.getType();
			if (type==ValueMeta.TYPE_NONE) type=ValueMeta.TYPE_STRING;
			ValueMetaInterface v=new ValueMeta(space.environmentSubstitute(field.getName()), type);
			v.setLength(field.getLength());
			v.setPrecision(field.getPrecision());
			v.setOrigin(name);
			v.setConversionMask(field.getFormat());
	        v.setDecimalSymbol(field.getDecimalSymbol());
	        v.setGroupingSymbol(field.getGroupSymbol());
	        v.setCurrencySymbol(field.getCurrencySymbol());
			r.addValueMeta(v);
		}
		String realFilenameField=space.environmentSubstitute(filenameField);
		if (includeFilename && !Const.isEmpty(realFilenameField))
		{
			ValueMetaInterface v = new ValueMeta(realFilenameField, ValueMeta.TYPE_STRING);
			v.setLength(500);
			v.setPrecision(-1);
			v.setOrigin(name);
			r.addValueMeta(v);
		}

		String realRowNumberField=space.environmentSubstitute(rowNumberField);
		if (includeRowNumber && !Const.isEmpty(realRowNumberField))
		{
			ValueMetaInterface v = new ValueMeta(realRowNumberField, ValueMeta.TYPE_INTEGER);
			v.setLength(ValueMetaInterface.DEFAULT_INTEGER_LENGTH, 0);
			v.setOrigin(name);
			r.addValueMeta(v);
		}
		String realSectionField=space.environmentSubstitute(iniSectionField);
		if (includeIniSection && !Const.isEmpty(realSectionField))
		{
			ValueMetaInterface v = new ValueMeta(realSectionField,  ValueMeta.TYPE_STRING);
			v.setLength(500);
			v.setPrecision(-1);
			v.setOrigin(name);
			r.addValueMeta(v);
		}
		// Add additional fields

		if(getShortFileNameField()!=null && getShortFileNameField().length()>0)
		{
			ValueMetaInterface v = new ValueMeta(space.environmentSubstitute(getShortFileNameField()), ValueMeta.TYPE_STRING);
			v.setLength(100, -1);
			v.setOrigin(name);
			r.addValueMeta(v);
		}
		if(getExtensionField()!=null && getExtensionField().length()>0)
		{
			ValueMetaInterface v = new ValueMeta(space.environmentSubstitute(getExtensionField()), ValueMeta.TYPE_STRING);
			v.setLength(100, -1);
			v.setOrigin(name);
			r.addValueMeta(v);
		}
		if(getPathField()!=null && getPathField().length()>0)
		{
			ValueMetaInterface v = new ValueMeta(space.environmentSubstitute(getPathField()), ValueMeta.TYPE_STRING);
			v.setLength(100, -1);
			v.setOrigin(name);
			r.addValueMeta(v);
		}
		if(getSizeField()!=null && getSizeField().length()>0)
		{
			ValueMetaInterface v = new ValueMeta(space.environmentSubstitute(getSizeField()), ValueMeta.TYPE_INTEGER);
			v.setOrigin(name);
			v.setLength(9);
			r.addValueMeta(v);
		}
		if(isHiddenField()!=null && isHiddenField().length()>0)
		{
			ValueMetaInterface v = new ValueMeta(space.environmentSubstitute(isHiddenField()), ValueMeta.TYPE_BOOLEAN);
			v.setOrigin(name);
			r.addValueMeta(v);
		}

		if(getLastModificationDateField()!=null && getLastModificationDateField().length()>0)
		{
			ValueMetaInterface v = new ValueMeta(space.environmentSubstitute(getLastModificationDateField()), ValueMeta.TYPE_DATE);
			v.setOrigin(name);
			r.addValueMeta(v);
		}
		if(getUriField()!=null && getUriField().length()>0)
		{
			ValueMetaInterface v = new ValueMeta(space.environmentSubstitute(getUriField()), ValueMeta.TYPE_STRING);
			v.setLength(100, -1);
			v.setOrigin(name);
			r.addValueMeta(v);
		}

		if(getRootUriField()!=null && getRootUriField().length()>0)
		{
			ValueMetaInterface v = new ValueMeta(space.environmentSubstitute(getRootUriField()), ValueMeta.TYPE_STRING);
			v.setLength(100, -1);
			v.setOrigin(name);
			r.addValueMeta(v);
		}
	}

	  public final static int getTrimTypeByCode(String tt)
		{
			if (tt!=null)
			{
			    for (int i=0;i<type_trim_code.length;i++)
			    {
				    if (type_trim_code[i].equalsIgnoreCase(tt)) return i;
			    }
			}
			return 0;
		}
	  public final static int getColumnByCode(String tt)
		{
			if (tt!=null)
			{
			    for (int i=0;i<column_code.length;i++)
			    {
				    if (column_code[i].equalsIgnoreCase(tt)) return i;
			    }
			}
			return 0;
		}

	public void readRep(Repository rep, ObjectId id_step, List<DatabaseMeta> databases, Map<String, Counter> counters)
	throws KettleException
	{
		try
		{
			fileType     = rep.getStepAttributeString (id_step, "file_type");
			section     = rep.getStepAttributeString (id_step, "section");
			encoding     = rep.getStepAttributeString (id_step, "encoding");
			includeIniSection  = rep.getStepAttributeBoolean(id_step, "ini_section");
			iniSectionField    = rep.getStepAttributeString (id_step, "ini_section_field");
			includeFilename   = rep.getStepAttributeBoolean(id_step, "include");
			filenameField     = rep.getStepAttributeString (id_step, "include_field");
			dynamicFilenameField  = rep.getStepAttributeString(id_step, "filename_Field");
			includeRowNumber  = rep.getStepAttributeBoolean(id_step, "rownum");

			String addresult  = rep.getStepAttributeString(id_step, "isaddresult");
			if(Const.isEmpty(addresult))
				isaddresult=true;
			else
				isaddresult  = rep.getStepAttributeBoolean(id_step, "isaddresult");

			filefield  = rep.getStepAttributeBoolean(id_step, "filefield");
			rowNumberField    = rep.getStepAttributeString (id_step, "rownum_field");
			resetRowNumber     = rep.getStepAttributeBoolean (id_step, "reset_rownumber");
			resolvevaluevariable= rep.getStepAttributeBoolean (id_step, "resolve_value_variable");

			rowLimit          = rep.getStepAttributeInteger(id_step, "limit");
			int nrFiles       = rep.countNrStepAttributes(id_step, "file_name");
			int nrFields      = rep.countNrStepAttributes(id_step, "field_name");

			allocate(nrFiles, nrFields);

			for (int i=0;i<nrFiles;i++)
			{
				fileName[i] =      rep.getStepAttributeString (id_step, i, "file_name"    );
				fileMask[i] =      rep.getStepAttributeString (id_step, i, "file_mask"    );
				excludeFileMask[i] = rep.getStepAttributeString(id_step, i, "exclude_file_mask");
				fileRequired[i] = rep.getStepAttributeString(id_step, i, "file_required");
                if(!YES.equalsIgnoreCase(fileRequired[i]))
                	fileRequired[i] = RequiredFilesCode[0];
                includeSubFolders[i] = rep.getStepAttributeString(id_step, i, "include_subfolders");
                if(!YES.equalsIgnoreCase(includeSubFolders[i]))
                	includeSubFolders[i] = RequiredFilesCode[0];
			}

			for (int i=0;i<nrFields;i++)
			{
			    PropertyInputField field = new PropertyInputField();

				field.setName( rep.getStepAttributeString (id_step, i, "field_name") );
				field.setColumn(PropertyInputField.getColumnByCode(rep.getStepAttributeString (id_step, i, "field_column") ) );
				field.setType(ValueMeta.getType( rep.getStepAttributeString (id_step, i, "field_type") ) );
				field.setFormat( rep.getStepAttributeString (id_step, i, "field_format") );
				field.setCurrencySymbol( rep.getStepAttributeString (id_step, i, "field_currency") );
				field.setDecimalSymbol( rep.getStepAttributeString (id_step, i, "field_decimal") );
				field.setGroupSymbol( rep.getStepAttributeString (id_step, i, "field_group") );
				field.setLength( (int)rep.getStepAttributeInteger(id_step, i, "field_length") );
				field.setPrecision( (int)rep.getStepAttributeInteger(id_step, i, "field_precision") );
				field.setTrimType( PropertyInputField.getTrimTypeByCode( rep.getStepAttributeString (id_step, i, "field_trim_type") ));
				field.setRepeated( rep.getStepAttributeBoolean(id_step, i, "field_repeat") );

				inputFields[i] = field;
			}
			shortFileFieldName = rep.getStepAttributeString(id_step, "shortFileFieldName");
			pathFieldName = rep.getStepAttributeString(id_step, "pathFieldName");
			hiddenFieldName = rep.getStepAttributeString(id_step, "hiddenFieldName");
			lastModificationTimeFieldName = rep.getStepAttributeString(id_step, "lastModificationTimeFieldName");
			rootUriNameFieldName = rep.getStepAttributeString(id_step, "rootUriNameFieldName");
			extensionFieldName = rep.getStepAttributeString(id_step, "extensionFieldName");
			sizeFieldName = rep.getStepAttributeString(id_step, "sizeFieldName");
        }
		catch(Exception e)
		{
			throw new KettleException(BaseMessages.getString(PKG, "PropertyInputMeta.Exception.ErrorReadingRepository"), e);
		}
	}

	public void saveRep(Repository rep, ObjectId id_transformation, ObjectId id_step)
		throws KettleException
	{
		try
		{
			rep.saveStepAttribute(id_transformation, id_step, "file_type",   fileType);
			rep.saveStepAttribute(id_transformation, id_step, "section",   section);
			rep.saveStepAttribute(id_transformation, id_step, "encoding",   encoding);
			rep.saveStepAttribute(id_transformation, id_step, "ini_section",          includeIniSection);
			rep.saveStepAttribute(id_transformation, id_step, "ini_section_field",    iniSectionField);
			rep.saveStepAttribute(id_transformation, id_step, "include",         includeFilename);
			rep.saveStepAttribute(id_transformation, id_step, "include_field",   filenameField);
			rep.saveStepAttribute(id_transformation, id_step, "rownum",          includeRowNumber);
			rep.saveStepAttribute(id_transformation, id_step, "isaddresult",     isaddresult);
			rep.saveStepAttribute(id_transformation, id_step, "filefield",          filefield);
			rep.saveStepAttribute(id_transformation, id_step, "filename_Field",    dynamicFilenameField);
			rep.saveStepAttribute(id_transformation, id_step, "rownum_field",    rowNumberField);
			rep.saveStepAttribute(id_transformation, id_step, "limit",           rowLimit);
			rep.saveStepAttribute(id_transformation, id_step, "reset_rownumber",  resetRowNumber);
			rep.saveStepAttribute(id_transformation, id_step, "resolve_value_variable",  resolvevaluevariable);

			for (int i=0;i<fileName.length;i++)
			{
				rep.saveStepAttribute(id_transformation, id_step, i, "file_name",     fileName[i]);
				rep.saveStepAttribute(id_transformation, id_step, i, "file_mask",     fileMask[i]);
				rep.saveStepAttribute(id_transformation, id_step, i, "exclude_file_mask", excludeFileMask[i]);
				rep.saveStepAttribute(id_transformation, id_step, i, "file_required", fileRequired[i]);
				rep.saveStepAttribute(id_transformation, id_step, i, "include_subfolders", includeSubFolders[i]);
			}

			for (int i=0;i<inputFields.length;i++)
			{
			    PropertyInputField field = inputFields[i];

				rep.saveStepAttribute(id_transformation, id_step, i, "field_name",          field.getName());
				rep.saveStepAttribute(id_transformation, id_step, i, "field_column",        field.getColumnCode());
				rep.saveStepAttribute(id_transformation, id_step, i, "field_type",          field.getTypeDesc());
				rep.saveStepAttribute(id_transformation, id_step, i, "field_format",        field.getFormat());
				rep.saveStepAttribute(id_transformation, id_step, i, "field_currency",      field.getCurrencySymbol());
				rep.saveStepAttribute(id_transformation, id_step, i, "field_decimal",       field.getDecimalSymbol());
				rep.saveStepAttribute(id_transformation, id_step, i, "field_group",         field.getGroupSymbol());
				rep.saveStepAttribute(id_transformation, id_step, i, "field_length",        field.getLength());
				rep.saveStepAttribute(id_transformation, id_step, i, "field_precision",     field.getPrecision());
				rep.saveStepAttribute(id_transformation, id_step, i, "field_trim_type",     field.getTrimTypeCode());
				rep.saveStepAttribute(id_transformation, id_step, i, "field_repeat",        field.isRepeated());

			}
			rep.saveStepAttribute(id_transformation, id_step, "shortFileFieldName", shortFileFieldName);
			rep.saveStepAttribute(id_transformation, id_step, "pathFieldName", pathFieldName);
			rep.saveStepAttribute(id_transformation, id_step, "hiddenFieldName", hiddenFieldName);
			rep.saveStepAttribute(id_transformation, id_step, "lastModificationTimeFieldName", lastModificationTimeFieldName);
			rep.saveStepAttribute(id_transformation, id_step, "uriNameFieldName", uriNameFieldName);
			rep.saveStepAttribute(id_transformation, id_step, "rootUriNameFieldName", rootUriNameFieldName);
			rep.saveStepAttribute(id_transformation, id_step, "extensionFieldName", extensionFieldName);
		}
		catch(Exception e)
		{
			throw new KettleException(BaseMessages.getString(PKG, "PropertyInputMeta.Exception.ErrorSavingToRepository", ""+id_step), e);
		}
	}

	public FileInputList  getFiles(VariableSpace space)
	{
        String required[] = new String[fileName.length];
        boolean subdirs[] = new boolean[fileName.length]; // boolean arrays are defaulted to false.
        for (int i=0;i<required.length; required[i]="Y", i++); //$NON-NLS-1$
        return FileInputList.createFileList(space, fileName, fileMask, excludeFileMask, required, subdirs);

	}

	public void check(List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta, RowMetaInterface prev, String input[], String output[], RowMetaInterface info)
	{

		CheckResult cr;

		// See if we get input...
		if (input.length>0)
		{
			cr = new CheckResult(CheckResult.TYPE_RESULT_ERROR, BaseMessages.getString(PKG, "PropertyInputMeta.CheckResult.NoInputExpected"), stepMeta);
			remarks.add(cr);
		}
		else
		{
			cr = new CheckResult(CheckResult.TYPE_RESULT_OK, BaseMessages.getString(PKG, "PropertyInputMeta.CheckResult.NoInput"), stepMeta);
			remarks.add(cr);
		}

        FileInputList fileInputList = getFiles(transMeta);

		if (fileInputList==null || fileInputList.getFiles().size()==0)
		{
			cr = new CheckResult(CheckResult.TYPE_RESULT_ERROR, BaseMessages.getString(PKG, "PropertyInputMeta.CheckResult.NoFiles"), stepMeta);
			remarks.add(cr);
		}
		else
		{
			cr = new CheckResult(CheckResult.TYPE_RESULT_OK, BaseMessages.getString(PKG, "PropertyInputMeta.CheckResult.FilesOk", ""+fileInputList.getFiles().size()), stepMeta);
			remarks.add(cr);
		}

	}

	public StepInterface getStep(StepMeta stepMeta, StepDataInterface stepDataInterface, int cnr, TransMeta tr, Trans trans)
	{
		return new PropertyInput(stepMeta, stepDataInterface, cnr, tr, trans);
	}

	public StepDataInterface getStepData()
	{
		return new PropertyInputData();
	}
    public boolean supportsErrorHandling()
    {
        return true;
    }

	/**
	 * Since the exported transformation that runs this will reside in a ZIP file, we can't reference files relatively.
	 * So what this does is turn the name of files into absolute paths OR it simply includes the resource in the ZIP file.
	 * For now, we'll simply turn it into an absolute path and pray that the file is on a shared drive or something like that.

	 * TODO: create options to configure this behavior
	 */
	public String exportResources(VariableSpace space, Map<String, ResourceDefinition> definitions, ResourceNamingInterface resourceNamingInterface, Repository repository) throws KettleException {
		try {
			// The object that we're modifying here is a copy of the original!
			// So let's change the filename from relative to absolute by grabbing the file object...
			// In case the name of the file comes from previous steps, forget about this!
			//
			if (!filefield) {
	            for (int i=0;i<fileName.length;i++) {
	              FileObject fileObject = KettleVFS.getFileObject(space.environmentSubstitute(fileName[i]), space);
                  fileName[i] = resourceNamingInterface.nameResource(fileObject, space, Const.isEmpty(fileMask[i]));
	            }
			}
			return null;
		} catch (Exception e) {
			throw new KettleException(e); //$NON-NLS-1$
		}
	}

}


This was Posted by Soulspeak a few days ago (thank you).
This 24-minute video is an interview with Laura Eisenhower — Granddaughter of military leader and President, Dwight D. Eisenhower.
Maybe a lot of people have already figured that out but "I" hadn't. So when I heard her say that, I had an "ah ha" moment.
My comments: There's something going on with the above 2-Bullet Points and the 2 Bullet Points below. I tried to read past them and continue through the interview but I keep being pulled back to those entries. I'm feeling that the 2 above and 2 below are not only connected to each other, somehow, but they are also "coded" for Humanity. Like a hidden set of instructions… hidden in plain sight.
This might be a little over-simplistic but I have a strong feeling that "we" (Humanity?, someone?) is supposed to "energetically" create a "Tachyon Healing Chamber" over a Ley Line, which will run-through the "Israel Key Code" (mentioned below) and then activate that Key Code.
Then there's another image. It shows electronic Symbols, like a circuitboard diagram, with the Earth in the center.
Then there's a picture of "Ashtar", a Star Visitor Commander, with the word "ENOUGH!" over his head.
Note: Even if these pieces are not true, using them as a mental exercise can still expand our minds.
Some say at least 1 city has been found 1-to 3-miles below the ice in Antarctica.
Some say there is "water" or "firmament" above the Sky.
What "IF" all of the above is true but has a slightly wrong perspective?
What "IF" those Beings knew they needed to be a part of what this planet is about to experience? They timed their Hibernation Systems so they would wake-up either at a certain "Time Point" or at the start of some major Event.
Before entering those Sleeping Chambers, they used their exotic (highly-advanced) technologies to "shield" / "hide" their city, their Ships and their technologies. To accomplish this, they drew fresh water up from below their ground and sprayed it above their Living Space (above their city) and, at the same Time, this water instantly froze. As we would fill an attic or the space behind a wall with expanding foam-insulation, they did the same thing but with instantly-freezing water. They created this thick, ice-blanket partly to protect themselves from Natural disasters and some of the scanners and weapons of other Beings but they also knew that the inhabitants of this planet (the Humans on the surface), would not be able to detect or enter their city until they evolved to a certain frequency.
Then, either because the timing is right or the Event has begun, their technologies would slowly bring them back to full consciousness AND it would melt that protective ice layer. Maybe, just "maybe" this is why the glaciers on Antarctica are melting and cracking.
I'm not sure I remember Cobra telling us the "Strangelet Bombs" have been removed. Even so, the thought of just 1 more obstacle before the "Event" and the removal of the "Veil" is really were my focus is.
This means "ALL" of the Toplet Bombs do not have to be removed before the Resistance Movement will actually do something everyone will experience. Cobra's statement also confuses me a bit… In previous Postings, I thought Cobra stated that "Toplet" Bombs were so powerful that ONE of them could severely damage this Solar System (or something like that)… but now he's saying… once the number of those bombs is below a certain level they won't be able to harm anyone. So I'm confused. Which is it?
Of course, Sylvia and I completely behind the idea that the big-change is now very, very close.
Note: One of Cobra's links is to a site which quotes someone named: "Sorcha Faal". "Some say" this person is a CIA agent who "sometimes" gives out half-truth information.
This 5-minute video is an interview with a former Navy SEAL who has gone "off the clock" (my words), in order to create a network of highly-skilled people who are dedicated to going after the "elites" who are involved in pedophilia. He set up a non-profit organization and is now raising money to make a film which will expose what is really going on.
He says there have already been over 3,000 arrests just since January.
My comments: He looks like a Navy SEAL, a real fighter. If his team ever decides to make some of the arrests themselves, the "elites" won't have a chance. With his team's contacts and skill-level, the "elite" could never "run" or "hide" from these people.
Now that I think about it though, my 1st wife once told me she used to know a guy who had been in jail a few times. He told her that the inmates do NOT like it when another inmate has done ANY harm to children. He said any inmate who has mistreated a child will be severely dealt with.
So "elites", it looks like you only have ONE choice after all. Just leave all your money in a small pile at the top of that cliff. I'm sure some passersby can use it for "good".
…and because I don't want to forget anything I wanted to include in that Post.
As for THIS Post… I wrote-out the following items and then started my research, looking for information on any of the "Rabbit Holes" that "I" Track. However, after reading several titles, a few articles and watching a few videos, there was nothing that "I" saw which wanted to be included.
I don't feel right Posting information which only contains my personal comments. The information I Track is much more important than the subtle energy interactions between me and Sylvia but I will not include "Rabbit Hole" information just to have "filler" for that night's Posting.
As I've mentioned in previous Posts… today I also had a strong feeling that Sylvia is somehow connected to "Agartha" (Inner Earth). Today, as I tuned-in to this, Sylvia sent me the word: "learning". With this, she included a "sense" that she's taking some Classes. It feels as though she's learning about Agartha… what life is like there, how those people do various things, that part of the Earth, what they eat, the animals, how they travel, the cities, how their technologies work, etc.
In order to write this out, just now, I tuned into this energy again and 1 facet of it unfolded… Because Sylvia is "learning" about "Agartha", it means she has never been there before this.
Some say the Agarthans were once "surface dwellers", like the rest of us here now but at some point (maybe during the high-point of Atlantean corruption) they went to the Inner Earth, in order to get away from the problems that were mounting on the surface of this planet. "IF" all of the above is real and true, then maybe Sylvia and I had our last Earthbound incarnation just before the fall of Atlantis. I have a feeling that Sylvia and I have not incarnated into 3D energy since then because we were simply enjoying ourselves doing other things but have returned now because me, Sylvia and MANY others were asked to return here, in order to help with this transition we now going through.
Some say the Light Workers and the negative Star Forces are currently battling each other. This doesn't feel right to me. So I don't know if it's true. However, because My Sylvia is "learning", it means SHE is not involved with any fighting. So either there "isn't" any fighting or "she's just not involved with it". Either way, I know my girl is safe.
As each of us raises our frequency, we will "Evolve" and, "maybe", change TimeLines. Because of this (or "feedback" that this is happening), some say we will see those people who have not yet raised their vibration less often.
I don't understand why those people who are stuck in the lower (than us) vibrations wouldn't simply instantly be known as "crossed-over". So they're no longer a part of our current TimeLine. (Thinking out loud now… I guess it's because… If those people DO raise their frequencies, maybe a few months from now, the "Matrix" (the "master program" of this illusion) wouldn't be able to explain the "re-appearance" of those people.
When Sylvia and I started this current job (November 1, 2016), we actually changed TimeLines AND, in doing so, we've left behind some members of our "Soul Group" AND gained a few members of a different Soul Group.
I say this because: 1) In the restaurants, stores and workplace, that we visit on a regular basis, we haven't found any of those "comfort people"… those people (strangers) who we instantly have a "comfortable feeling" / "don't I know you?" sense when we're around them… AND 2) because Sylvia and I HAVE interacted with people who are… not "un-comfortable" to us but simply feel as though they're a bit "foreign" to our energies.
Just after Breakfast this morning, Sylvia and I were outside when I noticed the light on the Moon. When I lined-up the part of the Moon with the light to the location of the Sun, they didn't match. I'm not the 1st person to notice this.
This is a 2-hour video Interview, in 2-parts, with Clif High.
Several years ago, he created "Web Bots" — software which moves through various web pages collecting certain types of data. Then analyzing that information and creating reports which "may' show social trends in the future.
At the 5:20-mark, he states that he "just by chance", discovered the origin of the "Flat Earth" information, a few years ago. He says it initially came from the "Department of Defense" in the Pentagon. He says the "Flat Earth" information is "dis-info".
My comment: I'm still on the fence with the "Flat Earth" / "Sphere Earth" information. So I'm not trying to dampen either side of that equation. I'm simply stating what Clif High said on that video.
Around the 9:55-mark, he talks about "Fukishima" and how the west coast of the U.S. has been affected by the wind and water carrying the radiation. He also mentioned large numbers of sea-life being destroyed by this.
My comments: As soon as I heard him state that about the sea-life… in my head, I saw that scene in the movie "Close Encounters" where some of the people were driving through the restricted, "do not enter" area where some of the cows had been shot by the military, in order to make everyone believe the air was unsafe.
From the things "I" Track, there are no longer any damaging effects from Fukishima. That radioactive energy, "IF" it ever existed, has been nullified by the Star Visitors.
So is the Cabal doing something in the Pacific Ocean that they want to cover-up? Maybe they have purposely destroyed those sea animals, in order to "make us" believe that "Fukishima" really does have radiation. Only Time will tell.
I'm still sensing that we're all on a "Positive" TimeLine. So please use your "Heart" center, when watching the computer animation that appears in the video, which, "supposedly", shows how the radiation traveled around the Earth.
Around the 34:50-mark, he explains that the Moon is hollow, that it's older than the Earth and that it was parked "just so", in order to give us eclipses, etc.
He explains how the Moon affects women every 28-days and men every 29.45-days.
Around the 53-mark, he talks about Antarctica and its "Atlantis" connection.
The "Smithsonian Institute" is nothing more than "paradigm control".
Be sure to visit Cobra's website, in order to see the images and links provided and to read the instructions for this Meditation.


Stalking is a crime that affects millions of people each year, with profound mental, physical, and financial effects for victims. In a technological world, new forms of stalking arose through online interactive mediums such as Twitter, blogs, Facebook, and email. Cyberstalking has many of the same ramifications as traditional stalking but with some new twists.
Timothy L. Allsup, Recent Development, United States v. Cassidy: The Federal Interstate Stalking Statute and Freedom of Speech, 13 N.C. J.L. & Tech. On. 227 (2012), http://cite.ncjolt.org/13NCJOLTOnlineEd227.
Stephanie L. Kimbro, Regulatory Barriers to the Growth of Multijurisdictional Virtual Law Firms and Potential First Steps to Their Removal, 13 N.C. J.L. & Tech. On. 165 (2012), http://cite.ncjolt.org/13NCJOLTOnlineEd165.
Peter B. Rutledge, TRIPS and BITs: An Essay on Compulsory Licenses, Expropriation, and International Arbitration, 13 N.C. J.L. & Tech. On. 149 (2012), http://cite.ncjolt.org/13NCJOLTOnlineEd149.
Laura N. Gasaway, Symposium Introduction, 13 N.C. J.L. & Tech. On. 147 (2012), http://cite.ncjolt.org/13NCJOLTOnlineEd147.
David W. Roadcap, Recent Development, Global-Tech Appliances, Inc. v. SEB S.A. and the Creation of a Flexible Blindness Standard for Induced Patent Infringement, 13 N.C. J.L. & Tech. On. 117 (2011), http://cite.ncjolt.org/13NCJOLTOnlineEd117.
Robert B. Norris, Recent Development, It's All Fun and Games Until Someone Gets Hurt: Brown v. Entertainment Merchants Assoc. and the Problem of Interactivity, 13 N.C. J.L. & Tech. On. 81 (2011), http://cite.ncjolt.org/13NCJOLTOnlineEd81.
Marc D. Macenko & Bentley J. Olive, Recent Development, That's Easy! I Can Do That with Pen and Paper!: Why the Mental Steps Doctrine Could Bring an End to Patent Protection for Software, 13 N.C. J.L. & Tech. On. 61 (2011), http://cite.ncjolt.org/13NCJOLTOnlineEd61.
Jennifer K. Kanzelberger, Recent Development, Brownmark Films, LLC v. Comedy Partners: Why Fair Users Should Be Able to Rely on Fair Use, 13 N.C. J.L. & Tech. On. 35 (2011), http://cite.ncjolt.org/13NCJOLTOnlineEd35.


text:
Aoc: An Objective-C-in-C++ Library
==================================

By Philip M. Hubbard, 2013

Overview
--------

Aoc is a library for using some of Apple's Objective-C libraries with C++ code.  The Objective-C functionality supported includes access to a computer's video camera, tracking of faces in video images, and rendering with OpenGL in an application window.  While the library was designed to be relatively general, it was implemented to meet the needs of the Facetious application.

Implementation
--------------

`Aoc::CppAVFoundationCamera` is a C++ class that maintains an instance of the Objective-C `AVFoundationCamera` class, which accesses a computer's video camera.  Clients use `Aoc::CppAVFoundationCamera` as a base class, with a derived class redefining a virtual function that gets called with a `CGImageRef` for each captured frame of video.  The Objective-C code allocates some memory that must be managed by an autorelease pool; the main thread of a Cocoa application will have such a pool, but if the `Aoc::CppAVFoundationCamera` instance is owned by another thread, the instance can create its own pool if specified by an argument to its constructor.

`Aoc::CppCIDetector` is a C++ class that maintains an instance of the Objective-C `CIDetector` class, which detects human faces in images.  Its function to perform detection takes a `CGImageRef` and fills a vector with `Aoc::CppCIDetector::Face` instances, each specifying the rectangular region for a detected face.  Since `CIDetector` can take a relatively long time to perform detection, it makes sense to use `Aoc::CppCIDetector` in a worker thread instead of the main application thread; the `Aoc::CppCIDetector` constructor thus has an argument to specify that it should create its own Objective-C autorelease pool, as discussed above for `Aoc::CppAVFoundationCamera`.

`AocNSOpenGLView` is an Objective-C class that derives from `NSOpenGLView`, the main class for displaying OpenGL renderings in a Cocoa application.  So that the code to generate the rendering can be written in C++, `AocNSOpenGLView` delegates redraw and resizing operations to an instance of the C++ class `Aoc::CppNSOpenGLBase`.  This class serves as a base class, with a derived class adding custom OpenGL-related behaviors by redefining virtual functions.  `Aoc::CppNSOpenGLBase` also has virtual functions that the derived class can redefine for event handling, like processing key presses.  Since this event processing may require redrawing, the derived class is given an instance of the `Aoc::CppNSOpenGLRequester` class, whose API includes a function for requesting a redraw.

Although the implementation of `AocNSOpenGLView` calls C++ code via `Aoc::CppNSOpenGLBase`, its external API is pure Objective-C, so it can be used in an Objective-C Cocoa application.  A bit of indirection is needed, therefore, to get `AocNSOpenGLView` to create an instance of a particular C++ class derived from `Aoc::CppNSOpenGLBase`.  `Aoc::CppNSOpenGLBase` has a static function, `setCreator(…)`, which takes the function `AocNSOpenGLView` will call to create the instance of the C++ class derived from `Aoc::CppNSOpenGLBase`.  This static function can be called from a helper function which appears to be pure C code to the Objective-C application's AppDelegate instance.  For example, say that the C++ class derived from `Aoc::CppNSOpenGLBase` is `MyAppOpenGL` defined in MyAppOpenGL.{h,cpp}.  The pure C function can be defined in MyAppInit.{h,cpp} and used by the `AppDelegate` as follows:

  MyAppOpenGL.h:

    #include "Aoc/AocCppNSOpenGLBase.h"

    class MyAppOpenGL : public Aoc::CppNSOpenGLBase { ... };

  MyAppInit.h:

    // Note that this file is very simple, so it can be imported as
    // valid Objective-C code in addition to being included as
    // valid C++ code.
    void myAppInit();

  MyAppInit.cpp:

    #include "MyAppOpenGL.h"

    Aoc::CppNSOpenGLBase* myAppCreator(Aoc::CppNSOpenGLRequestor* r)
    { return new MyAppOpenGL(r); }

    // Note the specification that this function is plain C, so it
    // can be called by Objective-C code.
    extern "C" void myAppInit()
    { Aoc::CppNSOpenGLBase::setCreator(myAppCreator); }

  AppDelegate.m:

    import "MyAppInit.h"

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    { myAppInit(); ... }

Building

Since Aoc is designed to work with Cocoa libraries, it requires an Apple OS X platform.  It uses the following frameworks: ApplicationServices.framework, AVFoundation.framework, CoreMedia.framework, OpenGL.framework, QuartzCore.framework.  Aoc also requires a compiler that supports Objective-C++ in addition to Objective-C and C++.  The particular version of Xcode used for Facetious development was 4.6.3.  The Xcode project settings are stored in Aoc.xcodeproj/project.pbxproj.

Aoc also depends on Aut, A Utility Toolkit, which has some error-reporting API that AocNSOpenGLView sets up to display messages with the NSAlert class.

The Xcode project build settings assume that all code---Aoc, Aut and any other projects used by an application---are siblings at the same level in the directory hierarchy.  Aoc and Aut have header files in a "src" subdirectory.  So in the Aoc project build settings, the "Header Search Paths" is set to "$(SRCROOT)/../Aut/src", allowing Aoc code to have include statements like the following:

	#include "AutAlert.h"

Similarly, an application using Aoc should have a build setting with "Header Search Paths" that includes "$(SRCROOT)/../Aoc/src" so it can have include statements like the following:

	#include "AocCppAVFoundationCamera.h"

The project has a build setting of "Installation Directory" to "@rpath".  This setting allows the library to be found when it is embedded in an application bundle.  The application should have a build setting of "Runpath Search Paths" to "@loader_path/../Frameworks" and a "Copy Files" build phase to copy the library into the Frameworks section of its bundle.

Future Work

* `Aoc::CppAVFoundationCamera` should have API to control the options for `AVFoundationCamera`.

* The `Aoc::CppAVFoundationCamera` code for converting the video image to a `CGImageRef` may not be as efficient as it could be (although it did not appear to be a problem in profiling of the Facetious application).

* `Aoc::CppAVFoundationCamera` should have better error handling for cases like dropped frames.

* `Aoc::CppCIDetector` should have API to control the options for `CIDetector`.

* `Aoc::CppNSOpenGLBase` should have virtual functions for a more complete set of events, beyond key presses.

redpajama_set_name: RedPajamaGithub


Forklift training specialists, crane, gondola, scissor lift and platform lift since 1990.
Formation CC became a training organization in the early 2000s and our mission is to increase safety and productivity of your business by offering training services and consulting in the field of material handling equipment.
The training on forklift enables the operator (forklift operator) to better identify hazards when moving with or without load on the workplace.
The training on elevating platforms identifies characteristics mostly related to the operation of the lifting system; the scissor, the mast and articulated arm or telescopic (platform), while taking into account the compulsory wearing of safety harnesses.
The training about gondolas (aerial work).
The training for overhead cranes requires the user to receive theoretical and practical training from the inspection of components, to the rules and guidelines on the working environment and safety measures for handling heavy loads.
We can offer customized training, tailored to your company because of your work environment while complying with safety standards. Each participant who passes the practical evaluation of training, will receive a certificate (permit) certifying that success.


Danforth Apartments make up Phase 2 of the landmark Fortis Quay development. The 113 luxury apartments spread over this 15-storey tower will be very popular with the large number of young professionals who live and work in Salford Quays - a vibrant business centre and a beautiful recreation area.
The premium two bedroom apartments included within Danforth Apartments are perfect for the many professionals who work in Salford Quays and MediaCityUK. This development is the second phase of the landmark Fortis Quay development which has proven to be extremely popular with investors to date.
These large two bedroom apartments are an average size of 646 sqft and offer residents the highest quality modern living as well as being within easy reach of the shops, restaurants and bars of MediaCityUK. On top of that, the Metrolink tram service operates two stations close to Fortis Quay via which residents will be have easy and quick access to Manchester city centre and all of the amenities and culture on offer there.
Phase 1 of Fortis Quay sold out very quickly and interest in Phase 2 is very high so please enquire today for more details.


text:
DogsLife · Breed O Pedia · Japanese Spitz
Japanese Spitz: Dog Facts, Breed Information and Care Advice
A cheerful and affectionate breed, the Japanese Spitz is known for its loyalty and devotion.
The Japanese Spitz is a relatively new breed and was only introduced to the UK and Ireland in 1976. Their origins are quite obscure, but they are known to have originated from the far north of America and were bred by American Eskimos. In 1923, a small group of Spitz were discovered among rescue cargo from Canada at the time of the great Japanese earthquake. The dogs were taken into care but it wasn't really known what kind of Spitz they were, although it is presumed they were of the American Eskimo variety. They were then cross-bred during the 1930s with a breed called the Russian Spitz, which had been brought back to Japan by soldiers returning from service in Russian Manchuria. In this way, the Japanese Spitz as we know it today came into existence.
Although the Japanese Spitz is now well established, it is still a relatively unknown and rare dog in Australia. Elizabeth Chapman, a Japanese Spitz breeder from Victoria, shares some advice on the personality, energy level and care requirements of this fascinating breed.
Cheerful and affectionate
The Japanese Spitz is known to be a very cheerful and affectionate breed that requires a loving, enriched environment in which to thrive. It is well known for its loyalty and devotion to any loving home. This bold little dog makes a great watchdog and will alert owners when it feels it's necessary. They are quite wary of strangers but will accept them once they are introduced by their owners. These dogs also get along wonderfully with children and other pets. As with all breeds, however, children should be supervised when playing with the dogs. Socialisation and training are a must from a young age to ensure a well-mannered and adjusted adult dog.
The Japanese Spitz is a family dog and thrives on human companionship. It will fit in with people in most situations as long as it receives plenty of love and affection. The Japanese Spitz does not adapt well to solitary life in a backyard and would prefer to be inside with the family. They enjoy being wherever you are and will normally attach themselves to one member of the family and be their every shadow. This loving breed can live quite happily indoors as long as it gets adequate exercise.
Active breed
Quite an active little breed, the Japanese Spitz enjoys a daily walk or run in the park, which will also help keep it fit and happy. It will benefit from a regular chance to run off leash in a safe area. This breed requires an average-size backyard that is fully fenced. Breeders also recommend regular exercise to stop these pooches from becoming bored and getting up to mischief. The Japanese Spitz is very intelligent and quite easy to train as long as you are consistent. They are eager to please and learn quite quickly. The breed also excels in agility, flyball and obedience and loves to play a game of fetch or Frisbee.
Despite its beautiful long, pure white coat, the Japanese Spitz is a low-maintenance breed. Its coat is very easy to look after due to its texture. Mud and dirt will fall off and can be brushed out very easily. A regular brush or comb is needed to keep the coat from matting, and will require a little extra brushing when shedding, which only occurs once a year.
Check for good bloodlines
The Japanese Spitz is quite a healthy breed but can suffer from patella luxation (slipping patella) and can also be prone to runny eyes, but this is rarely caused by any serious eye defect. Many of these issues have been eliminated due to good breeding practices. Ask your breeder about bloodlines as responsible breeders will try to reduce the chances of your Japanese Spitz developing inherited problems.
The lifespan of this breed ranges from between 12 to 15 years. If you have the time and dedication for one of these admirable dogs, you will have a proud and affectionate companion for many years.
Care and exercise
This alert and lively dog is happy to be exercised with a walk or a game of catch. It is not demanding as long as its family is in sight. With a thick double coat, this breed must be brushed on a regular basis. When the coat starts to shed, it can take a lot of brushing to remove the dead coat. It is not a clipped breed and good brushing, right down to the skin, is essential to keep this dog looking beautiful and healthy.
With his lively, affectionate nature and compact size, the Japanese Spitz is well suited to all ages in the family. Exercise requirements are not high and it is quite happy living in a small area. Be prepared to spend at least half an hour, every second day keeping its coat properly groomed.
This relatively rare breed but is becoming more widely known. Its gentle and alert nature makes it the perfect addition to many loving homes.
Like the look of the Samoyed but would like something more compact and not as much coat? The Japanese Spitz is the answer. This pure white dog with its profuse, stand-off coat knows it is as pretty as a picture and struts just to show off. Standing between 30cm and 36cm at the shoulder and weighing 7-10 kilos, it is an ideal size for a family pet or a personal companion. Although affectionate and friendly, it can be wary of strangers and this makes it a good watch-dog.
The Japanese Spitz is said to be the first breed to receive official recognition in Japan as a purebred. This dainty dog has a characteristic Spitz-type pointed muzzle, small, round, black nose and dark almond eyes with black rims. Its triangular ears peek out from its mane which covers neck, shoulders and chest. Its tail is curled over the back and is covered in long hair. Face, ears and lower legs are covered in short hair.

redpajama_set_name: RedPajamaCommonCrawl


Let's be honest, Japanese citizen or not you are very much aware that "The Last: Naruto The Movie" began its theatrical run in Japan over the weekend and, whether or not you've found a way to watch it, you're immeasurably existed that somewhere in the world someone has. This is the calibre of the "Naruto" fandom; a mass of crazy fanatics with enough power to bring down OTHER fandoms.
Thanks to Marvel films, the world has now been conditioned to stay until the very end of the credits to nab a sneak peak of the next project to come which makes me hate going to see movies with fellow SnapThirty writer Kane Bugeja because we could be seeing a re-release of the movie "Love Actually" and he'd make us wait all the way until the end to see if something happens…not that we'd be going to see it or anything. Well those who went to go see "The Last: Naruto The Movie" this weekend were delivered a little message after the film that stated the next "Naruto" project will kick off in the August of 2015.
What featured alongside this piece of dialogue was an image of Naruto's own son Bolt in coloured Manga form as well as some sketches of other characters which is leading most people to believe this is the Manga project Masashi Kishimoto spoke about just as the current Manga series ended. Whatever it may be…it IS very exciting and I'm sure fans of the long-running series cannot wait to see what's to come next.


Does Our Future Keep Going Around in Circles Or Will Other Options Bring the Fans Back?
Now that some people have driven on the Charlotte "roval" and pronounced that racing there likely won't end NASCAR as we know it, maybe it's time once again to explore the other variations on oval track racing that we might use to regain some of our sport's lost luster. Having been a champion of that innovative approach for some time, I'll gladly attempt to advance the conversation here.
** Split some races into two or three separate features - not stages - with separate purses and points.
** Have "triathlon" events, featuring a portion of the race on an oval, a portion on a road course, and a portion on a dirt track. There's already a growing movement within the sport called "democross," which uses courses that are partially paved and partially dirt, so this seems like a logical next step.
** Have celebrities or selected fans race go-karts between segments of the race, with their performance determining restart positions for the drivers.
From my point of view, all of those remain on the table.
Also, we've talked many times about Curtis Turner's suggestion of putting a speed bump on the backstretch at Charlotte. I'd combine that with a former promoter up here in Pennsylvania who had a "construction zone" for one lower division, with traffic cones narrowing the track to a single lane at the end of the front stretch. It made for exciting moments and could translate to Cup.
Just imagine these cars with numbers and (some of them) sponsors.
Ooooo . . . caution for an incident in Turn Three.
Note that the cars also sort of looked like cars back then.
But here's what's new. The growth entertainment industry remains video/computer games, and if NASCAR wants to appeal to the video/computer game generation, it needs to pick up some elements of that world. The Monster Girls are a step in the right direction, but the one thing I see in most of the games is that they have increasing levels of difficulty. Maybe that's where we need to go with racing.
This might be a few years away.
These may not be great ideas, but somebody has the variants that would qualify, and if we can find them, maybe we can come up with something that will please enough new fans and hold onto enough old ones to at least keep the sport going until driverless cars take over.
Sometimes when I'm looking for photos for these articles, I see ones I can't use but love so much I can't give them up. Here's one, Dale Earnhardt and his dad, Ralph, at the old Concord Speedway.
The photo below was even harder to not blow up and put on the wall. My hero as a young race fan, Ray Hendrick, in 1976 after winning his second World Service Life 300 Late Model Sportsman race at Charlotte. The Charlotte event and the Permatex 300 the day before the Daytona 500 were the penultimate contests for weekly racers, and when Rapid Ray was in his prime, he could beat just about anybody, anywhere.
"Mr. Modified" was pretty good in a speedway late model, too.


text:
Linux replaces Windows in one German state's bid for software independence
Thread starter Gandalf_The_Grey
https://www.windowscentral.com/linux-replaces-windows-one-german-states-bid-software-independence
Schleswig-Holstein plans to swap out roughly 25,000 PCs from Windows to Linux.
Microsoft Office will also be replaced by Libre Office.
The goal is to move the public sector in the direction of free and open-source software.
When one thinks of business or government computing, Windows and Microsoft Office are typically the de-facto go-to. But that's not the case anymore for the German state of Schleswig-Holstein, which is planning on converting its public sector machines to the Linux and Libre side of the force by 2026.
This shift will involve around 25,000 PCs in total, as reported by the Document Foundation (additional figures can be found in Schleswig-Holstein's plan documentation [via Heise]). The idea behind the change is that free and open-source software should be given priority. A benefit from moving to Linux and Libre is forecasted to be saving money on licensing costs, though there are expense complications to be considered in terms of the migration itself and the costs of operational infrastructure when conducting state business through Linux and other open-source software.
The rise of cloud solutions is one of the reasons this open-source agenda may succeed where previous German attempts haven't. The most notable previous attempt was the LiMux plan that was set to convert Munich to open-source software. That plan fell apart for a variety of reasons, with some claiming it was due to software conflicts brought about by Linux (via Ars Technica). There's more to the LiMux saga; it's a bit of a rabbit hole that includes accusations of corporate backscratching. But at least on the surface, the reasons for Munich's retreat to Windows are straightforward.
Time will tell if Schleswig-Holstein's initiative ends up the same way. For now, goodbye Windows 10 and Windows 11, and hello Tux.
Reactions: CyberTech, The_King, SeriousHoax and 3 others
That's good for them..
Reactions: The_King
Grab your popcorn and read the comments:
25,000 German state computers will bid goodbye to Windows and say Hello to Linux
Schleswig-Holstein, a German state, has announced that it's moving away from Microsoft Office to LibreOffice. This will be followed by a bigger move from Windows to open-source Linux by end of 2026.
www.neowin.net
Reactions: silversurfer and Gandalf_The_Grey
Didn't they try the same thing a few years back and it failed? They ended up going back to Microsoft.
Reactions: CyberTech, silversurfer and Gandalf_The_Grey
russ0408 said:
Yes, from that article:
The most notable previous attempt was the LiMux plan that was set to convert Munich to open-source software. That plan fell apart for a variety of reasons, with some claiming it was due to software conflicts brought about by Linux (via Ars Technica).
Reactions: CyberTech and silversurfer
Microsoft Another German state fails to replace Microsoft software
Hardware & Technology News
Hardware & Technology News Dec 30, 2021
upnorth
Q&A Win11SysCheck and WhyNotWin11 tell you why your PC is incompatible with Windows 11
Windows 10 Jul 1, 2021
show-Zi
Ransomware The Hard Truth about Ransomware
Threat Analysis Jul 7, 2021
plat1098
Microsoft Stop feeding bugs to millions of users
Windows 10 Jun 19, 2020
Opened by accident a hacked email and noticed a new process in task manager
blocTore
Windows Malware Removal Help & Support
Windows Malware Removal Help & Support Dec 21, 2020


Bella has been tearing up my closet everyday, dressing up as Mary. Blessing to see Christmas through the eyes of a little girl.
Bella had been tugging on both Jay and I, trying to get us to listen, but we were preoccupied with getting Ompa (Jay's father) settled into his new room at the Hospice center. Jay, my husband leaned over and placed a napkin on Ompa's chest so he wouldn't dribble his chocolate pudding. It was late, close to 10pm, and the measly Greek salad eaten at noon was long gone. We felt drained and tired, but happy Oma (Jay's mother) could go home to a quiet home and sleep through the night without Ompa waking her up.
"How long do I need to stay here?" Ompa said.
I caught the worried expression cross Oma's face.
"Bella, we don't have time for you to finish. We have to go. It's late," Jay said.
"But, I have to." Bella hung her head, her lip quivered.
The gift of cousins when you don't have sisters.
I led her down the hallway towards the children's room, where she'd started coloring her picture. When we entered a frail man sat watching the television in a chair. Bella glanced shyly at him before making her way to the other side of the room and sitting at the table.
"Ten minutes," I reminded her.
She nodded and got to work. Coloring as fast as her little fingers could.
I looked back at the man, all skin and bones, a grayish tint to his skin. By the looks of him, I knew he wouldn't be here at Christmas. He was a picture of death.
I glanced back at Bella's colorful picture. She was trying harder to stay in the lines these days, instead of scribbling wildly across the page, her fingers held the crayon tighter, and she switched colors for different parts. The face was still blue, the hands red, but she was taking more pride in her work.
Now, I understood why it was so important to her. It was a gift. It would be her last gift to him, albeit we didn't know that at the time. The last of many things…our last hug…our last kiss…our last goodbye.
"He's going to love it," I said.
The gift of wide open spaces, when you need to breathe and just be.
We wandered back down the quiet hallways towards his room. Opened doors revealed human suffering, spirits longing to be free of their crumbling shells. We reached Ompa's room finding everyone had left except jay who stood by his father's bed.
"Are you finished?" Jay said.
"It was for Ompa," I said.
"Oh, why didn't you tell me?" Jay said, picking her up.
She beamed and kissed him before Jay set her back down.
"Thank you dear," Ompa said. "I'm going to set it right here, so I can see it." He placed it on his nightstand.
The gift of a new baby and every smile. Meet our new cousin. Ompa was able to meet her a week before he passed.
That night, I didn't realize how important Bella's gift would be because I didn't know Ompa would become incoherent a few days later and pass away seven days after that. The gift held more value because of its timing. I learned a powerful lesson from my four- year- old girl. Don't be so preoccupied with my surroundings that I miss the gift. Don't be so preoccupied with the ugly things, that we miss the simple blessings right in front of us.
This Christmas, as we celebrate the birth of our Savior Jesus Christ, we can become so preoccupied with all the beautiful wrappings of Christmas that we miss the true gift inside. We can also become disheartened by all the angry voices, turmoil, or our own personal circumstances that we'll want to skip over the Christmas season and jump right into another work week…another year.
My grapefruit tree finally gave us fruit!!!
Yet, the fact remains darkness can never absorb light. The tiniest of lights can pierce the greatest darkness, just like Bella's artwork brought a smile to a dying man lying in a Hospice bed a few days before Thanksgiving.
There is a gift this Christmas that can bring light to any situation in your life, the gift of a Savior, who came to conquer death– to give life– to anyone who accepts Him. May you remember to look past the wrapping and bows, to keep your hearts off the dark things of this world and on the colorful picture of a God who loves you.
May your day be filled with the light of Jesus Christ and may you recognize the daily gifts that come outside of packages.
The blessings of grandparents… This was colored by my son Colin.
Previous Post When Consumerism and Perfectionism Rob Your Spiritualism.
what a powerful message! Thank you Honey!
Welcome to Outdoorsy! My sister used to say "We smell outdoorsy!" after we played outside. It seemed as if the aromas of fresh air and grass bathed our skin. I'm still a lover of nature and often find God reveals the truths in His word through His creation. Just like the fresh air, what He reveals through the earth and animals stick as well.
I'm hoping you'll stay awhile. Grab a cup of coffee or a sweet iced tea and let me share a bit of inspiration from the great outdoors. Maybe, you'll feel the desire to get a little outdoorsy too.
There's a new blog post on Outdoorsy, titled Funny Thing About Breast's." Check it out at www.tammycarteradams.com. Find the direct link on my home page.
There's a new blog post at Outdoorsy. Flipping Pages can be read at www.tammycarteradams.com. For a direct link see my profile page.
Catch the new blog post on Outdoorsy, "Bella's Gift." Can be read at www.tammycarteradams.com. Find the direct link on my profile page. Have a Merry Christmas everyone!
There's a Christmas blog at www.tammycarteradams.com. You can find the direct link on my homepage. Merry Christmas!
In case you missed last week's blog "Finding Your Place," you can read it at www.tammycarteradams.com. Direct link on my home page. This is Bella's place to nap at our farmhouse.
There's a new blog post on Outdoorsy. Is multitasking actually hurting us? Find out at www.tammycarteradams.com. You can find the direct link on my profile page. Enjoy!


text:
Video: 32-year-old rookie Johnson wins fight against much bigger John Scott
By Ryan DadounApr 14, 2014, 8:56 AM EDT
Buffalo and the Islanders were eliminated long before they wrapped up the season with New York's 4-3 shootout win over the Sabres on Sunday. Consequently, it was a game that had very little meaning to the two franchises, but it's still likely to stick out in at least one player's mind.
At the age of 32, New York's Justin Johnson was playing in just his second NHL game and the minor-league enforcer got the opportunity to spar with 6'8″ John Scott. The Sabres forward is about seven inches taller than Johnson and that gap is apparent when the fighters stood face-to-face.
At first it looked like it would be a predictably one-sided brawl, but Johnson battled back and knocked Scott to the ice:
Johnson has five points and 183 penalty minutes in 48 games with the Bridgeport Sound Tigers this season.
Born in Anchorage, Alaska, he's slowly climbed his way up the ranks. He spent four seasons playing for the University of of Alaska-Anchorage, following by parts of five campaigns in the ECHL. He didn't even make his AHL debut until 2010-11, but he hasn't fallen below that level since.
Follow @RyanDadoun
Tags: Buffalo Sabres, John Scott, Justin Johnson, New York Islanders