text:
#include <syslog.h>
#include <dirent.h>
#include <pwd.h>
#include <grp.h>

#include "ltfs_fuse.h"
#include "libltfs/ltfs.h"
#include "ltfs_copyright.h"
#include "libltfs/pathname.h"
#include "libltfs/plugin.h"
#include "libltfs/dcache.h"
#include "libltfs/index_criteria.h"
#include "libltfs/ltfssnmp.h"
#include "libltfs/kmi.h"
#include "libltfs/tape.h"

volatile char *copyright = LTFS_COPYRIGHT_0"\n"LTFS_COPYRIGHT_1"\n"LTFS_COPYRIGHT_2"\n";

/* Defined in src/ltfs.c */
extern struct fuse_operations ltfs_ops;
/* Defined in messages/ */
extern char bin_ltfs_dat[];

/**
 * Command line parsing
 */
enum {
	KEY_HELP,
	KEY_VERSION,
	KEY_VERBOSE,
	KEY_ADVANCED_HELP,
};

#define LTFS_OPT(templ,offset,value) { templ, offsetof(struct ltfs_fuse_data, offset), value }
#define LTFS_OPT_KEY(templ, key)     { templ, -1U, key }

/* Forward declarations */
int single_drive_main(struct fuse_args *args, struct ltfs_fuse_data *priv);

static struct fuse_opt ltfs_options_pass1[] = {
	LTFS_OPT("config_file=%s",         config_file, 0),
	LTFS_OPT_KEY("-a",                 KEY_ADVANCED_HELP),
	FUSE_OPT_KEY("-h",                 KEY_HELP),
	FUSE_OPT_KEY("--help",             KEY_HELP),
	FUSE_OPT_KEY("-V",                 KEY_VERSION),
	FUSE_OPT_KEY("--version",          KEY_VERSION),
	FUSE_OPT_END
};

static struct fuse_opt ltfs_options[] = {
	LTFS_OPT("devname=%s",             devname, 0),
	LTFS_OPT("work_directory=%s",      work_directory, 0),
	LTFS_OPT("atime",                  atime, 1),
	LTFS_OPT("noatime",                atime, 0),
	LTFS_OPT("tape_backend=%s",        tape_backend_name, 0),
	LTFS_OPT("iosched_backend=%s",     iosched_backend_name, 0),
	LTFS_OPT("kmi_backend=%s",         kmi_backend_name, 0),
	LTFS_OPT("umask=%s",               force_umask, 0),
	LTFS_OPT("fmask=%s",               force_fmask, 0),
	LTFS_OPT("dmask=%s",               force_dmask, 0),
	LTFS_OPT("uid=%s",                 force_uid, 0),
	LTFS_OPT("gid=%s",                 force_gid, 0),
	LTFS_OPT("min_pool_size=%s",       force_min_pool, 0),
	LTFS_OPT("max_pool_size=%s",       force_max_pool, 0),
	LTFS_OPT("rules=%s",               index_rules, 0),
	LTFS_OPT("quiet",                  verbose, LTFS_WARN),
	LTFS_OPT("trace",                  verbose, LTFS_DEBUG),
	LTFS_OPT("syslogtrace",            verbose, LTFS_DEBUG * 100 + LTFS_DEBUG),
	LTFS_OPT("fulltrace",              verbose, LTFS_TRACE),
	LTFS_OPT("verbose=%d",             verbose, 0),
	LTFS_OPT("eject",                  eject, 1),
	LTFS_OPT("noeject",                eject, 0),
	LTFS_OPT("sync_type=%s",           sync_type_str, 0),
	LTFS_OPT("force_mount_no_eod",     skip_eod_check, 1),
	LTFS_OPT("device_list",            device_list, 1),
	LTFS_OPT("rollback_mount=%s",      rollback_str, 0),
	LTFS_OPT("release_device",         release_device, 1),
	LTFS_OPT("allow_other",            allow_other, 1),
	LTFS_OPT("noallow_other",          allow_other, 0),
	LTFS_OPT("capture_index=%s",       capture_dir, 0),
	LTFS_OPT("symlink_type=%s",        symlink_str, 0),
	LTFS_OPT("scsi_append_only_mode=%s", str_append_only_mode, 0),
	LTFS_OPT_KEY("-a",                 KEY_ADVANCED_HELP),
	FUSE_OPT_KEY("-h",                 KEY_HELP),
	FUSE_OPT_KEY("--help",             KEY_HELP),
	FUSE_OPT_KEY("-V",                 KEY_VERSION),
	FUSE_OPT_KEY("--version",          KEY_VERSION),
	FUSE_OPT_END
};

void single_drive_advanced_usage(const char *default_driver, struct ltfs_fuse_data *priv)
{
	ltfsresult(14401I);                              /* LTFS options: */
	ltfsresult(14403I);                              /* -o devname=<dev> */
	ltfsresult(14413I, LTFS_CONFIG_FILE);            /* -o config_file=<file> */
	ltfsresult(14404I, LTFS_DEFAULT_WORK_DIR);       /* -o work_directory=<dir> */
	ltfsresult(14414I);                              /* -o atime */
	ltfsresult(14440I);                              /* -o noatime */
	ltfsresult(14415I, default_driver);              /* -o tape_backend=<name> */
	ltfsresult(14416I, config_file_get_default_plugin("iosched", priv->config)); /* -o iosched_backend=<name> */
	ltfsresult(14455I, config_file_get_default_plugin("kmi", priv->config));     /* -o kmi_backend=<name> */
	ltfsresult(14417I);                              /* -o umask=<mode> */
	ltfsresult(14418I);                              /* -o fmask=<mode> */
	ltfsresult(14419I);                              /* -o dmask=<mode> */
	ltfsresult(14420I, LTFS_MIN_CACHE_SIZE_DEFAULT); /* -o min_pool_size=<num> */
	ltfsresult(14421I, LTFS_MAX_CACHE_SIZE_DEFAULT); /* -o max_pool_size=<num> */
	ltfsresult(14422I);                              /* -o rules=<rule[,rule]> */
	ltfsresult(14423I);                              /* -o quiet */
	ltfsresult(14405I);                              /* -o trace */
	ltfsresult(14467I);                              /* -o syslogtrace */
	ltfsresult(14424I);                              /* -o fulltrace */
	ltfsresult(14441I, LTFS_INFO);                   /* -o verbose=<num> */
	ltfsresult(14425I);                              /* -o eject */
	ltfsresult(14439I);                              /* -o noeject */
	ltfsresult(14427I, LONG_MAX / 60);               /* -o sync_type=type */
	ltfsresult(14443I);                              /* -o force_mount_no_eod */
	ltfsresult(14436I);                              /* -o device_list */
	ltfsresult(14437I);                              /* -o rollback_mount */
	ltfsresult(14448I);                              /* -o release_device */
	ltfsresult(14461I);                              /* -o symlink_type=type */
	ltfsresult(14456I);                              /* -o capture_index */
	ltfsresult(14463I);                              /* -o scsi_append_only_mode=<on|off> */
	ltfsresult(14406I);                              /* -a */
	ltfsresult(14407I);                              /* -V, --version */
	ltfsresult(14408I);                              /* -h, --help */
	/* TODO: future use for WORM */
	/* set worm rollback flag and rollback_str by this option */
	/* ltfsresult(14468I); */ /* -o rollback_mount_no_eod */
}

void usage(char *progname, struct ltfs_fuse_data *priv)
{
	int ret;
	const char *default_driver = config_file_get_default_plugin("tape", priv->config);
	const char *default_device = NULL;

	if (! priv->advanced_help) {
		if (! priv->tape_backend_name)
			priv->tape_backend_name = default_driver;

		ret = plugin_load(&priv->tape_plugin, "tape", priv->tape_backend_name, priv->config);
		if (ret == 0)
			default_device = ltfs_default_device_name(priv->tape_plugin.ops);

		ltfsresult(14400I, progname);                    /* usage: %s mountpoint [options] */
		fprintf(stderr, "\n");
		ltfsresult(14401I);                              /* LTFS options: */
		if (default_device)
			ltfsresult(14402I, default_device);          /* -o devname=<dev> */
		else
			ltfsresult(14403I);                          /* -o devname=<dev> */
		ltfsresult(14404I, LTFS_DEFAULT_WORK_DIR);       /* -o work_directory=<dir> */
		ltfsresult(14405I);                              /* -o trace */
		ltfsresult(14425I);                              /* -o eject */
		ltfsresult(14427I, LONG_MAX / 60);               /* -o sync_type=type */
		ltfsresult(14443I);                              /* -o force_mount_no_eod */
		ltfsresult(14436I);                              /* -o device_list */
		ltfsresult(14437I);                              /* -o rollback_mount */
		ltfsresult(14448I);                              /* -o release_device */
		ltfsresult(14461I);                              /* -o symlink_type=type */
		ltfsresult(14406I);                              /* -a */
		ltfsresult(14407I);                              /* -V, --version */
		ltfsresult(14408I);                              /* -h, --help */
		fprintf(stderr, "\n");
		ltfsresult(14409I);                              /* FUSE options: */
		ltfsresult(14410I);                              /* -o umask=M */
		ltfsresult(14411I);                              /* -o uid=N */
		ltfsresult(14412I);                              /* -o gid=N */
		fprintf(stderr, "\n");
		fprintf(stderr, "\n");

		if (ret == 0)
			plugin_unload(&priv->tape_plugin);
	} else {
		fprintf(stderr, "\n");
		single_drive_advanced_usage(default_driver, priv);
		fprintf(stderr, "\n");
		plugin_usage(progname, "driver", priv->config);
		plugin_usage(progname, "kmi", priv->config);
	}
}

mode_t parse_mode(char *input)
{
	if (! input || strlen(input) != 3)
		return (mode_t)-1;
	if (input[0] < '0' || input[0] > '7' ||
		input[1] < '0' || input[1] > '7' ||
		input[2] < '0' || input[2] > '7')
		return (mode_t)-1;
	return ((input[0] - '0') << 6) | ((input[1] - '0') << 3) | (input[2] - '0');
}

uid_t parse_uid(const char *input)
{
	const char *i;
	struct passwd *pw = getpwnam(input);
	if (pw)
		return pw->pw_uid;
	if (input[0] == '\0')
		return (uid_t)-1;
	for (i=input; *i; ++i)
		if (*i < '0' || *i > '9')
			return (uid_t)-1;
	return strtoul(input, NULL, 10);
}

gid_t parse_gid(const char *input)
{
	const char *i;
	struct group *gr = getgrnam(input);
	if (gr)
		return gr->gr_gid;
	if (input[0] == '\0')
		return (gid_t)-1;
	for (i=input; *i; ++i)
		if (*i < '0' || *i > '9')
			return (gid_t)-1;
	return strtoul(input, NULL, 10);
}

size_t parse_size_t(const char *input)
{
	const char *i;
	if (input[0] == '\0')
		return 0;
	for (i=input; *i; i++)
		if (*i < '0' || *i > '9')
			return 0;
	return strtoull(input, NULL, 10);
}

/**
 * Parse permissions, including mount-time overrides. This is roughly the same behavior as
 * NTFS-3g, except that fmask and dmask override umask regardless of argument order.
 */
int permissions_setup(struct ltfs_fuse_data *priv)
{
	mode_t mode;

	/* Set defaults */
	priv->perm_override = false;
	priv->mount_uid = geteuid();
	priv->mount_gid = getegid();
	priv->file_mode = S_IFREG | 0777;
	priv->dir_mode = S_IFDIR | 0777;

	/* User ID override */
	if (priv->force_uid) {
		priv->perm_override = true;
		priv->mount_uid = parse_uid(priv->force_uid);
		if (priv->mount_uid == (uid_t)-1) {
			/* Invalid UID */
			ltfsmsg(LTFS_ERR, 14079E, priv->force_uid);
			return -1;
		}
		free(priv->force_uid);
	}

	/* Group ID override */
	if (priv->force_gid) {
		priv->perm_override = true;
		priv->mount_gid = parse_gid(priv->force_gid);
		if (priv->mount_gid == (gid_t)-1) {
			/* Invalid GID */
			ltfsmsg(LTFS_ERR, 14080E, priv->force_gid);
			return -1;
		}
		free(priv->force_gid);
	}

	/* Global (file and directory) permissions override */
	if (priv->force_umask) {
		priv->perm_override = true;
		mode = parse_mode(priv->force_umask);
		if (mode == (mode_t)-1) {
			/* Invalid umask */
			ltfsmsg(LTFS_ERR, 14006E, priv->force_umask);
			return -1;
		}
		priv->file_mode = (S_IFREG | 0777) & ~mode;
		priv->dir_mode = (S_IFDIR | 0777) & ~mode;
		free(priv->force_umask);
	}

	/* File permissions override */
	if (priv->force_fmask) {
		priv->perm_override = true;
		mode = parse_mode(priv->force_fmask);
		if (mode == (mode_t)-1) {
			/* Invalid fmask */
			ltfsmsg(LTFS_ERR, 14007E, priv->force_fmask);
			return -1;
		}
		priv->file_mode = (S_IFREG | 0777) & ~mode;
		free(priv->force_fmask);
	}

	/* Directory permissions override */
	if (priv->force_dmask) {
		priv->perm_override = true;
		mode = parse_mode(priv->force_dmask);
		if (mode == (mode_t)-1) {
			/* Invalid dmask */
			ltfsmsg(LTFS_ERR, 14008E, priv->force_dmask);
			return -1;
		}
		priv->dir_mode = (S_IFDIR | 0777) & ~mode;
		free(priv->force_dmask);
	}

/* Uncomment to apply the current umask to the default permissions, as vfat does.
	mode = umask(0);
	umask(mode);
	if (! priv->force_umask && ! priv->force_fmask)
		priv->file_mode = (S_IFREG | 0777) & ~mode;
	if (! priv->force_umask && ! priv->force_dmask)
		priv->dir_mode = (S_IFDIR | 0777) & ~mode;
*/

	return 0;
}

int ltfs_parse_options(void *priv_data, const char *arg, int key, struct fuse_args *outargs)
{
	struct ltfs_fuse_data *priv = (struct ltfs_fuse_data *) priv_data;
	const char *fuse_options[] = { "-f", "-d", "-s", NULL };
	bool valid_fuse_option = false;
	int i;

	switch(key) {
		case KEY_VERSION:
			ltfsresult(14058I, PACKAGE_NAME, PACKAGE_VERSION);
			ltfsresult(14058I, "LTFS Format Specification", LTFS_INDEX_VERSION_STR);
			exit(0);
		case KEY_ADVANCED_HELP:
			priv->advanced_help = true;
			valid_fuse_option = false;
			/* fall through */
		case FUSE_OPT_KEY_OPT:
		case FUSE_OPT_KEY_NONOPT:
			for (i=0; arg && fuse_options[i]; ++i) {
				if (! strcmp(arg, fuse_options[i])) {
					valid_fuse_option = true;
					break;
				}
			}
			if (! priv->advanced_help) {
				if (! valid_fuse_option && key == FUSE_OPT_KEY_OPT && arg && arg[0] == '-') {
					/* invalid option */
					ltfsmsg(LTFS_ERR, 9010E, arg);
				} else
					break;
			}
			/* fall through */
		case KEY_HELP:
		default:
			if (! priv->first_parsing_pass) {
				fuse_opt_add_arg(outargs, "-h");
				if (priv->advanced_help)
					fuse_main(outargs->argc, outargs->argv, &ltfs_ops, NULL);
				usage(outargs->argv[0], priv);
				exit(key == KEY_HELP ? 0 : 1);
			}
	}

	return 1;
}

int mkdir_p(const char *path, mode_t mode)
{
	char *ptr, buf[strlen(path)+1];
	struct stat statbuf;
	int ret;

	sprintf(buf, "%s", path);
	ret = stat(path, &statbuf);
	if (ret == 0)
		return 0;

	for (ptr=(buf[0] == '/') ? &buf[1] : buf; *ptr; ++ptr) {
		bool last = ptr[1] == '\0';
		if (*ptr == '/')
			*ptr = '\0';
		if (*ptr == '\0' || last) {
			ret = mkdir(buf, mode);
			if (ret && errno != EEXIST) {
				ltfsmsg(LTFS_ERR, 9014E, path, strerror(errno));
				return 1;
			}
			if (! last)
				*(ptr++) = '/';
		}
	}
	return 0;
}

static int create_workdir(struct ltfs_fuse_data *priv)
{
	struct stat statbuf;
	int ret;

	ret = stat(priv->work_directory, &statbuf);
	if (ret < 0) {
		ret = mkdir_p(priv->work_directory, S_IRWXU | S_IRWXG | S_IRWXO);
		if (ret < 0) {
			/* Failed to create work directory */
			ltfsmsg(LTFS_ERR, 14004E, ret);
			return ret;
		}
	} else if (! S_ISDIR(statbuf.st_mode)) {
		/* Path exists but is not a directory */
		ltfsmsg(LTFS_ERR, 14005E, priv->work_directory);
		return -ENOTDIR;
	}

	return 0;
}

int validate_sync_option(struct ltfs_fuse_data *priv)
{
	char *sync_time_str, *end_time_str;

	/* Search time description and devide option string*/
	if (priv->sync_type_str) {
		priv->sync_time = -1;
		sync_time_str = strchr(priv->sync_type_str, '@');
		if (sync_time_str) {
			*sync_time_str = '\0';
			sync_time_str++;
		}
	} else {
		priv->sync_type = LTFS_SYNC_TIME;
		priv->sync_time = LTFS_SYNC_PERIOD_DEFAULT;
		return 0;
	}

	/* Detect sync type */
	if (strcasecmp(priv->sync_type_str, "time") == 0)
		priv->sync_type = LTFS_SYNC_TIME;
	else if (strcasecmp(priv->sync_type_str, "close") == 0)
		priv->sync_type = LTFS_SYNC_CLOSE;
	else if (strcasecmp(priv->sync_type_str, "unmount") == 0)
		priv->sync_type = LTFS_SYNC_UNMOUNT;
	else {
		ltfsmsg(LTFS_ERR, 14061E, priv->sync_type_str);
		return 1;
	}

	/* If type is sync by time, convert option to sync time */
	if (priv->sync_type == LTFS_SYNC_TIME) {
		if (sync_time_str && strlen(sync_time_str) != 0) {
			errno = 0;
			priv->sync_time = strtol(sync_time_str, &end_time_str, 10);
			if (sync_time_str == end_time_str) {
				ltfsmsg(LTFS_ERR, 14060E, sync_time_str);
				return 1;
			}
			if ((priv->sync_time == LONG_MAX || priv->sync_time == LONG_MIN) && errno != 0) {
				ltfsmsg(LTFS_ERR, 14067E, sync_time_str);
				return 1;
			}
			if (priv->sync_time < 0) {
				ltfsmsg(LTFS_ERR, 14066E);
				return 1;
			}
			if (priv->sync_time > (LONG_MAX / 60) || priv->sync_time < (LONG_MIN / 60)) {
				ltfsmsg(LTFS_ERR, 14068E, priv->sync_time);
				return 1;
			}
			priv->sync_time *= 60; /* Convert minutes to seconds*/
		} else
			priv->sync_time = LTFS_SYNC_PERIOD_DEFAULT;
	} else
		priv->sync_time = LTFS_SYNC_PERIOD_DEFAULT;

	if (priv->sync_type == LTFS_SYNC_TIME && priv->sync_time == 0) {
		ltfsmsg(LTFS_INFO, 14062I);
		priv->sync_type = LTFS_SYNC_UNMOUNT;
	}

	/* Restore original string*/
	if (sync_time_str) {
		sync_time_str--;
		*sync_time_str = '@';
	}

	return 0;
}

static int show_device_list(struct ltfs_fuse_data *priv)
{
	int ret;

	/* Load tape backend */
	if (priv->tape_backend_name == NULL)
		priv->tape_backend_name = config_file_get_default_plugin("tape", priv->config);
	ret = plugin_load(&priv->tape_plugin, "tape", priv->tape_backend_name, priv->config);
	if (ret < 0) {
		ltfsmsg(LTFS_ERR, 14054E, ret);
		return 1;
	}

	/* Print device list */
	ret = ltfs_print_device_list(priv->tape_plugin.ops);

	/* Unload tape backend */
	plugin_unload(&priv->tape_plugin);

	return ret ? 1 : 0;
}

int main(int argc, char **argv)
{
	int ret, i, cmd_args_len;
	struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
	struct ltfs_fuse_data *priv = (struct ltfs_fuse_data *) calloc(1, sizeof(struct ltfs_fuse_data));
	char *lang, **mount_options, **snmp_options, *cmd_args;
	void *message_handle;

	priv->verbose = LTFS_INFO;
	priv->allow_other = (geteuid() == 0) ? 1 : 0;
	priv->pid_orig = getpid();

	/* Check for LANG variable and set it to en_US.UTF-8 if it is unset. */
	lang = getenv("LANG");
	if (! lang) {
		fprintf(stderr, "LTFS9015W Setting the locale to 'en_US.UTF-8'. If this is wrong, please set the LANG environment variable before starting ltfs.\n");
		ret = setenv("LANG", "en_US.UTF-8", 1);
		if (ret) {
			fprintf(stderr, "LTFS9016E Cannot set the LANG environment variable\n");
			return 1;
		}
	}

	/* Start up libltfs with the default logging level. User overrides are
	 * processed later, after command line parsing. */
	openlog("ltfs", LOG_PID, LOG_USER);
	ret = ltfs_init(LTFS_INFO, true, true);
	if (ret < 0) {
		/* Failed to initialize libltfs */
		ltfsmsg(LTFS_ERR, 10000E, ret);
	}

	/* Register messages with libltfs */
	ret = ltfsprintf_load_plugin("bin_ltfs", bin_ltfs_dat, &message_handle);
	if (ret < 0) {
		ltfsmsg(LTFS_ERR, 10012E, ret);
		return 1;
	}

	if (! priv) {
		ltfsmsg(LTFS_ERR, 10001E, "main: private data");
		return 1;
	}

	/* Parse command line options to pick up the configuration file */
	priv->first_parsing_pass = true;
	ret = fuse_opt_parse(&args, priv, ltfs_options_pass1, ltfs_parse_options);
	if (ret < 0) {
		ltfsmsg(LTFS_ERR, 9001E);
		return 1;
	}

	/* Load the configuration file */
	ret = config_file_load(priv->config_file, &priv->config);
	if (ret < 0) {
		ltfsmsg(LTFS_ERR, 10008E, ret);
		return 1;
	}

	/* Get snmp option value from configuration file */
	snmp_options = config_file_get_options("snmp", priv->config);
	if (snmp_options) {
		priv->snmp_enabled = false;
		for (i=0; snmp_options[i]; ++i) {
			if (! strcmp(snmp_options[i], "enabled"))
				priv->snmp_enabled = true;
			else if (! strncmp(snmp_options[i], "deffile ", 8)) {
				ret = asprintf(&priv->snmp_deffile, "%s", snmp_options[i]+8);
				if (ret < 0) {
					ltfsmsg(LTFS_ERR, 10001E, "library_main: snmp_deffile");
					priv->snmp_enabled = false;
					break;
				}
			}
			free(snmp_options[i]);
		}
		if (priv->snmp_enabled)
			ltfs_snmp_init(priv->snmp_deffile);
		free(snmp_options);
	}

	/* Bring in extra mount options set in the config file */
	mount_options = config_file_get_options("single-drive", priv->config);
	if (! mount_options)
		return 1;
	for (i=0; mount_options[i]; ++i) {
		ret = fuse_opt_insert_arg(&args, i+1, mount_options[i]);
		if (ret < 0) {
			/* Could not enable FUSE option */
			ltfsmsg(LTFS_ERR, 14001E, mount_options[i], ret);
			return 1;
		}
		free(mount_options[i]);
	}
	free(mount_options);

	/* Parse command line options again, this time for real */
	priv->first_parsing_pass = false;
	ret = fuse_opt_parse(&args, priv, ltfs_options, ltfs_parse_options);
	if (ret < 0) {
		ltfsmsg(LTFS_ERR, 9001E);
		return 1;
	}

	/* Set the logging level */
	if (priv->verbose > 100)
		ltfs_set_syslog_level(priv->verbose / 100);
	ltfs_set_log_level(priv->verbose % 100);

	/* LTFS starting */
	ltfsmsg(LTFS_INFO, 14000I, PACKAGE_NAME, PACKAGE_VERSION, priv->verbose);
	ltfsmsg(LTFS_INFO, 14058I, "LTFS Format Specification", LTFS_INDEX_VERSION_STR);

	/* Show command line arguments */
	for (i = 0, cmd_args_len = 0 ; i < argc; i++) {
		cmd_args_len += strlen(argv[i]) + 1;
	}
	cmd_args = calloc(1, cmd_args_len + 1);
	if (!cmd_args) {
		/* Memory allocation failed */
		ltfsmsg(LTFS_ERR, 10001E, "ltfs (arguments)");
		return -ENOMEM;
	}
	strcat(cmd_args, argv[0]);
	for (i = 1; i < argc; i++) {
		strcat(cmd_args, " ");
		strcat(cmd_args, argv[i]);
	}
	ltfsmsg(LTFS_INFO, 14104I, cmd_args);
	free(cmd_args);

	/* Show build time information */
	ltfsmsg(LTFS_INFO, 14105I, BUILD_SYS_FOR);
	ltfsmsg(LTFS_INFO, 14106I, BUILD_SYS_GCC);

	/* Show run time information */
	show_runtime_system_info();

	/* Show avaliable tape device list */
	if (priv->device_list) {
		ret = show_device_list(priv);
		ltfs_finish();
		return (ret != 0) ? 0 : 1;
	}

	/* Validate sync option */
	ret = validate_sync_option(priv);
	if (ret != 0)
		return 1; /* Error message was already displayed */

	/* Print the active sync mode */
	switch(priv->sync_type) {
		case LTFS_SYNC_TIME:
			ltfsmsg(LTFS_INFO, 14063I, "time", priv->sync_time);
			break;
		case LTFS_SYNC_CLOSE:
			ltfsmsg(LTFS_INFO, 14064I, "close");
			break;
		case LTFS_SYNC_UNMOUNT:
			ltfsmsg(LTFS_INFO, 14064I, "unmount");
			break;
		default:
			ltfsmsg(LTFS_ERR, 14065E, priv->sync_type);
			return 1;
	}

	/* Enable correct permissions checking in the kernel if any permission overrides are set */
	ret = fuse_opt_add_arg(&args, "-odefault_permissions");
	if (ret < 0) {
		/* Could not enable FUSE option */
		ltfsmsg(LTFS_ERR, 14001E, "default_permissions", ret);
		return 1;
	}

	/* Let all users access this filesystem by default */
	if (priv->allow_other) {
		ret = fuse_opt_add_arg(&args, "-oallow_other");
		if (ret < 0) {
			/* Could not enable FUSE option */
			ltfsmsg(LTFS_ERR, 14001E, "allow_other", ret);
			return 1;
		}
	}

	/* Unlink objects from the file system instead of having them renamed to .fuse_hidden */
	ret = fuse_opt_add_arg(&args, "-ohard_remove");
	if (ret < 0) {
		/* Could not enable FUSE option */
		ltfsmsg(LTFS_ERR, 14001E, "hard_remove", ret);
		return 1;
	}

	/* perform reads synchronously */
	ret = fuse_opt_add_arg(&args, "-osync_read");
	if (ret < 0) {
		/* Could not enable FUSE option */
		ltfsmsg(LTFS_ERR, 14001E, "sync_read", ret);
		return 1;
	}

#ifdef __APPLE__
    /* Change MacFUSE timeout from 60 secs to 3100 secs (41mins) */
    /* 3100 secs comes from the timeout value of locate/space, it is the most longest timeout value  */
    /* in the commands used by LTFS. Actually the timeout value of locate/space is 2500 secs,        */
    /* we set the MacFUSE as the timeout value of locate/space + 10 mins. Because MacFUSE timeout    */
    /* should come after the drive command timeout.                                                  */
	fuse_opt_add_arg(&args, "-odaemon_timeout=3100");
	if (ret < 0) {
		/* Could not enable FUSE option */
		ltfsmsg(LTFS_ERR, 14001E, "daemon_timeout", ret);
		return 1;
	}
	/*
	 *  Disable vnode cache to return correct owner.
	 *  LTFS will return the owner as accessed user, vnode cache will return previous user
	 *  when the cache is hot.
	 */
	fuse_opt_add_arg(&args, "-onovncache");
	if (ret < 0) {
		/* Could not enable FUSE option */
		ltfsmsg(LTFS_ERR, 14001E, "novncache", ret);
		return 1;
	}
#endif

#if FUSE_VERSION >= 28
	/* For FUSE 2.8 or higher, automatically enable big_writes */
	ret = fuse_opt_add_arg(&args, "-obig_writes");
	if (ret < 0) {
		/* Could not enable FUSE option */
		ltfsmsg(LTFS_ERR, 14001E, "big_writes", ret);
		return 1;
	}
#endif

	/* Set up permissions based on mount options and current user information */
	ret = permissions_setup(priv);
	if (ret < 0) {
		/* Failed to set up permissions */
		ltfsmsg(LTFS_ERR, 14002E, ret);
		usage(argv[0], priv);
		return 1;
	}

	/* Bring in some configuration defaults if needed */
	if (priv->tape_backend_name == NULL) {
		priv->tape_backend_name = config_file_get_default_plugin("tape", priv->config);
		if (priv->tape_backend_name == NULL) {
			/* No driver plugin configured and no default found */
			ltfsmsg(LTFS_ERR, 14056E);
			return 1;
		}
	}
	if (priv->iosched_backend_name == NULL)
		priv->iosched_backend_name = config_file_get_default_plugin("iosched", priv->config);
	if (priv->iosched_backend_name && strcmp(priv->iosched_backend_name, "none") == 0)
		priv->iosched_backend_name = NULL;
	if (priv->kmi_backend_name == NULL)
		priv->kmi_backend_name = config_file_get_default_plugin("kmi", priv->config);
	if (priv->kmi_backend_name && strcmp(priv->kmi_backend_name, "none") == 0)
		priv->kmi_backend_name = NULL;
	if (priv->work_directory == NULL || ! strcmp(priv->work_directory, ""))
		priv->work_directory = LTFS_DEFAULT_WORK_DIR;
	if (priv->force_min_pool) {
		priv->min_pool_size = parse_size_t(priv->force_min_pool);
		if (priv->min_pool_size == 0) {
			ltfsmsg(LTFS_ERR, 14109E);
			return 1;
		}
	} else
		priv->min_pool_size = LTFS_MIN_CACHE_SIZE_DEFAULT;
	if (priv->force_max_pool) {
		priv->max_pool_size = parse_size_t(priv->force_max_pool);
		if (priv->max_pool_size == 0) {
			ltfsmsg(LTFS_ERR, 14110E);
			return 1;
		}
	} else
		priv->max_pool_size = LTFS_MAX_CACHE_SIZE_DEFAULT;
	if (priv->min_pool_size > priv->max_pool_size) {
		/* Min pool size cannot be greater than max pool size */
		ltfsmsg(LTFS_ERR, 14003E, (int)priv->min_pool_size, (int)priv->max_pool_size);
		return 1;
	}

	/* Make sure work directory exists */
	ret = create_workdir(priv);
	if (ret < 0)
		return 1;

	/* Load plugins */
	ret = plugin_load(&priv->tape_plugin, "tape", priv->tape_backend_name, priv->config);
	if (ret < 0) {
		ltfsmsg(LTFS_ERR, 14054E, ret);
		return 1;
	}
	if (priv->iosched_backend_name) {
		ret = plugin_load(&priv->iosched_plugin, "iosched", priv->iosched_backend_name,
			priv->config);
		if (ret < 0) {
			ltfsmsg(LTFS_ERR, 14055E, ret);
			return 1;
		}
	}
	if (priv->kmi_backend_name) {
		ret = plugin_load(&priv->kmi_plugin, "kmi", priv->kmi_backend_name,
			priv->config);
		if (ret < 0) {
			ltfsmsg(LTFS_ERR, 14057E, ret);
			return 1;
		}
	}

	/* Make sure we have a device name */
	if (! priv->devname) {
		/* Accept no devname when accessible index file is specified by '-o rollback_mount' */
		if ( !priv->rollback_str || access(priv->rollback_str, R_OK) ) {
			priv->devname = ltfs_default_device_name(priv->tape_plugin.ops);
			if (! priv->devname) {
				/* The backend \'%s\' does not have a default device */
				ltfsmsg(LTFS_ERR, 14009E, priv->tape_backend_name);
				return 1;
			}
		}
	}

	/* Initialize filesystem component in libltfs */
	ret = ltfs_fs_init();
	if (ret)
		return 1;

	/* Invoke the single drive main operations */
	ret = ltfs_mutex_init(&priv->file_table_lock);
	if (ret) {
		/*  Cannot initialize open file table */
		ltfsmsg(LTFS_ERR, 14114E);
		return 1;
	}
	ret = single_drive_main(&args, priv);

	/* Send a trap of LTFS termination */
	if (priv->snmp_enabled)
		ltfs_snmp_finish();

	/* Unload plugins */
	if (priv->iosched_backend_name)
		plugin_unload(&priv->iosched_plugin);
	if (priv->kmi_backend_name)
		plugin_unload(&priv->kmi_plugin);
	plugin_unload(&priv->tape_plugin);

	/* Free data structures */
	ltfsprintf_unload_plugin(message_handle);
	ltfs_finish();
	config_file_free(priv->config);
	free(priv);
	fuse_opt_free_args(&args);

	return ret;
}

int single_drive_main(struct fuse_args *args, struct ltfs_fuse_data *priv)
{
	int ret, altret, fd = -1;
	char *index_rules_utf8;
	char *fsname_base = "-ofsname=ltfs:";
	char *fsname;
	char *invalid_start;
#ifdef __APPLE__
	char *opt_volname = NULL;
#endif
	char *mountpoint = NULL;
	struct fuse_args tmpa=FUSE_ARGS_INIT(0, NULL);
	int i;
	bool is_worm = false, is_ro = false;

	if (priv->devname) {
		fsname = calloc(1, strlen(fsname_base) + strlen(priv->devname) + 1);
	} else if (priv->rollback_str) {
		fsname = calloc(1, strlen(fsname_base) + strlen(priv->rollback_str) + 1);
	} else {
		fsname = calloc(1, strlen(fsname_base) + 1);
	}
	if (!fsname) {
		/* Memory allocation failed */
		ltfsmsg(LTFS_ERR, 10001E, "fsname");
		return -ENOMEM;
	}
	/*  Setup signal handler to terminate cleanly */
	ret = ltfs_set_signal_handlers();
	if (ret < 0) {
		ltfsmsg(LTFS_ERR, 10013E);
		return 1;
	}

	/* Validate rollback_mount option */
	if (priv->rollback_str) {
		if (access(priv->rollback_str, R_OK)) {
			errno = 0;
			priv->rollback_gen = strtoul(priv->rollback_str, &invalid_start, 0);
			if( (*invalid_start != '\0') || priv->rollback_gen == 0 ) {
				ltfsmsg(LTFS_ERR, 14091E, priv->rollback_str);
				return 1;
			}
		}
	}

	/* Validate append_only_mode */
	if (priv->str_append_only_mode) {
		if (strcasecmp(priv->str_append_only_mode, "on") == 0)
			priv->append_only_mode = 1;
		else if (strcasecmp(priv->str_append_only_mode, "off") == 0)
			priv->append_only_mode = 0;
		else {
			ltfsmsg(LTFS_ERR, 14115E, priv->str_append_only_mode);
			return 1;
		}
	} else
		priv->append_only_mode = 1;

	if (priv->eject == 0 && priv->append_only_mode != 0) {
		/* Append only mode need to eject a cartridge at unmount to clear the mode on drive setting */
		/* To avoid cartridge ejection at unmount, disable append only mode at the moount with noeject option */
		priv->append_only_mode = 0;
		ltfsmsg(LTFS_INFO, 14095I);
	}

	/* If the local inode space is big enough, have FUSE pass through our UIDs as inode
	 * numbers instead of generating its own. */
	if (sizeof(ino_t) >= 8) {
		ret = fuse_opt_add_arg(args, "-ouse_ino");
		if (ret < 0) {
			/* Could not enable FUSE option */
			ltfsmsg(LTFS_ERR, 14001E, "use_ino", ret);
			return 1;
		}
	}

	/* Set file system name to "ltfs:devname" in case FUSE doesn't pick it up */
	strcpy(fsname, fsname_base);
	if (priv->devname) {
		strcat(fsname, priv->devname);
	} else if (priv->rollback_str) {
		strcat(fsname, priv->rollback_str);
	}
	ret = fuse_opt_add_arg(args, fsname);
	if (ret < 0) {
		/* Could not enable FUSE option */
		ltfsmsg(LTFS_ERR, 14001E, "fsname", ret);
		return 1;
	}

	/* Allocate the LTFS volume structure */
	if (ltfs_volume_alloc("ltfs", &priv->data) < 0) {
		/* Could not allocate LTFS volume structure */
		ltfsmsg(LTFS_ERR, 14011E);
		return 1;
	}
	ltfs_use_atime(priv->atime, priv->data);
	ltfs_set_work_dir(priv->work_directory, priv->data);

	if (priv->devname) {
		if (ltfs_device_open(priv->devname, priv->tape_plugin.ops, priv->data) < 0) {
			/* Could not open device */
			ltfsmsg(LTFS_ERR, 10004E, priv->devname);
			ltfs_volume_free(&priv->data);
			return 1;
		}

		if (priv->release_device) {
			ltfs_release_medium(priv->data);
			ltfs_device_close(priv->data);
			ltfs_volume_free(&priv->data);
			return 0;
		}

		/* Parse backend options */
		if (ltfs_parse_tape_backend_opts(args, priv->data)) {
			/* Backend option parsing failed */
			ltfsmsg(LTFS_ERR, 14012E);
			ltfs_volume_free(&priv->data);
			return 1;
		}

		if (priv->kmi_backend_name) {
			if (kmi_init(&priv->kmi_plugin, priv->data) < 0) {
				/* Encryption function disabled. */
				ltfsmsg(LTFS_ERR, 14089E);
				ltfs_volume_free(&priv->data);
				return 1;
			}

			if (ltfs_parse_kmi_backend_opts(args, priv->data)) {
				/* Backend option parsing failed */
				ltfsmsg(LTFS_ERR, 14090E);
				ltfs_volume_free(&priv->data);
				return 1;
			}

			if (tape_clear_key(priv->data->device, priv->data->kmi_handle) < 0)
				return 1;
		}

		/* Setup tape drive */
		ltfs_load_tape(priv->data);
		ret = ltfs_wait_device_ready(priv->data);
		if (ret < 0) {
			ltfsmsg(LTFS_ERR, 14075E);
			ltfs_volume_free(&priv->data);
			return 1;
		}

		priv->data->append_only_mode = (bool)priv->append_only_mode;
		if (ltfs_setup_device(priv->data)) {
			ltfsmsg(LTFS_ERR, 14075E);
			ltfs_volume_free(&priv->data);
			return 1;
		}

		/* Check EOD validation is skipped or not */
		if (priv->skip_eod_check) {
			ltfsmsg(LTFS_INFO, 14076I);
			ltfsmsg(LTFS_INFO, 14077I);
			ltfs_set_eod_check(! priv->skip_eod_check, priv->data);
		}

		/* Validate symbolic link type */
		priv->data->livelink = false;
		if (priv->symlink_str) {
			if (strcasecmp(priv->symlink_str, "live") == 0)
				priv->data->livelink = true;
			else if (strcasecmp(priv->symlink_str, "posix") == 0)
				priv->data->livelink = false;
			else {
				ltfsmsg(LTFS_ERR, 14093E, priv->symlink_str);
				return 1;
			}
			ltfsmsg(LTFS_INFO, 14092I, priv->symlink_str);
		}

		/* Mount the volume */
		ltfs_set_traverse_mode(TRAVERSE_BACKWARD, priv->data);
		if (priv->rollback_str) {
			if (ltfs_mount_indexfile(priv->rollback_str, true, priv->data) < 0) {
				ltfsmsg(LTFS_ERR, 14013E, "index file");
				ltfs_volume_free(&priv->data);
				return 1;
			}
		} else {
			if (ltfs_mount(false, false, false, false, priv->rollback_gen, priv->data) < 0) {
				ltfsmsg(LTFS_ERR, 14013E, "device");
				ltfs_volume_free(&priv->data);
				return 1;
			}
		}

		ret = tape_get_worm_status(priv->data->device, &is_worm);
		if (ret != 0 || is_worm) {
			ltfsmsg(LTFS_ERR, 14116E, ret);
			ltfs_volume_free(&priv->data);
			return 1;
		}

		/* Set up index criteria */
		if (priv->index_rules) {
			ret = pathname_format(priv->index_rules, &index_rules_utf8, false, false);
			if (ret < 0) {
				/* Could not format data placement rules. */
				ltfsmsg(LTFS_ERR, 14016E, ret);
				ltfs_volume_free(&priv->data);
				return 1;
			}
			ret = ltfs_override_policy(index_rules_utf8, false, priv->data);
			free(index_rules_utf8);
			if (ret == -LTFS_POLICY_IMMUTABLE) {
				/* Volume doesn't allow override. Ignoring user-specified criteria. */
				ltfsmsg(LTFS_WARN, 14015W);
			} else if (ret < 0) {
				/* Could not parse data placement rules */
				ltfsmsg(LTFS_ERR, 14017E, ret);
				ltfs_volume_free(&priv->data);
				return 1;
			}
		}

		/* Configure I/O scheduler cache */
		ltfs_set_scheduler_cache(priv->min_pool_size, priv->max_pool_size, priv->data);

		/* mount read-only if underlying medium is write-protected */
		ret = ltfs_get_tape_readonly(priv->data);
		switch (ret) {
			case 0:
			case -LTFS_WRITE_PROTECT:
			case -LTFS_WRITE_ERROR:
			case -LTFS_NO_SPACE:
			case -LTFS_LESS_SPACE:
			case -LTFS_RDONLY_DEN_DRV:
				/* Do nothing */
				break;
			default:
				/* Fail immidiatly when return code is NOT success or NOT possible R/O related errors */
				/* Could not get read-only status of medium */
				ltfsmsg(LTFS_ERR, 14018E);
				ltfs_volume_free(&priv->data);
				return 1;
				break;
		}
	} else {
		/* try to mount from index file (meta-only mount) */
		if (ltfs_mount_indexfile(priv->rollback_str, false, priv->data) < 0) {
			ltfsmsg(LTFS_ERR, 14013E, "index file");
			ltfs_volume_free(&priv->data);
			return 1;
		}
		ret = 0;
	}

	if (ret < 0 || priv->rollback_gen || priv->rollback_str) {
		switch (ret) {
			case -LTFS_WRITE_PROTECT:
			case -LTFS_WRITE_ERROR:
			case -LTFS_NO_SPACE:
				altret = ltfs_get_partition_readonly(ltfs_ip_id(priv->data), priv->data);
				switch (altret) {
					case -LTFS_WRITE_PROTECT:
					case -LTFS_WRITE_ERROR:
						/* The tape is really write protected */
						ltfsmsg(LTFS_INFO, 14019I);
						break;
					case -LTFS_NO_SPACE:
						/* The index partition is in early warning zone. To be mounted read-only */
						ltfsmsg(LTFS_INFO, 14073I);
						break;
					default:  /* 0 or -LTFS_LESS_SPACE */
						/* The data partition may be in early warning zone. To be mounted read-only */
						ltfsmsg(LTFS_INFO, 14074I);
						break;
				}
				is_ro = true;
				break;
			case -LTFS_LESS_SPACE:
				/* Medium has no space to write data. Mounting as R/W for modifying meta-data */
				ltfsmsg(LTFS_INFO, 14071I);
				break;
			case -LTFS_RDONLY_DEN_DRV:
				/* Medium is Read-Only in this device */
				ltfsmsg(LTFS_INFO, 14078I);
				is_ro = true;
				break;
			default:
				if (!ret && priv->rollback_gen) {
					/* Rollback mount is specified */
					ltfsmsg(LTFS_INFO, 14072I, priv->rollback_gen);
					is_ro = true;
				} else if (!ret && priv->rollback_str) {
					if (priv->devname) {
						/* Rollback mount (index mount) is specified */
						ltfsmsg(LTFS_INFO, 14119I, priv->rollback_str);
					} else {
						/* Rollback mount (meta-only mount) is specified */
						ltfsmsg(LTFS_INFO, 14117I, priv->rollback_str);
					}
					is_ro = true;
				} else {
					/* Unexpected condition */
					ltfsmsg(LTFS_ERR, 14118E, ret);
					ltfs_volume_free(&priv->data);
					return 1;
				}
				break;
		}

		if (is_ro) {
			ret = fuse_opt_add_arg(args, "-oro");
			if (ret < 0) {
				/* Could not set FUSE option */
				ltfsmsg(LTFS_ERR, 14001E, "ro", ret);
				ltfs_volume_free(&priv->data);
				return 1;
			}
		}
	}

	/* Configure index capturing */
	if (priv->capture_dir) {
		if (HAVE_BARCODE(priv->data))
			ret = asprintf(&priv->data->index_cache_path_w, "%s/%s.schema",
						   priv->capture_dir, priv->data->label->barcode);
		else
			ret = asprintf(&priv->data->index_cache_path_w, "%s/%s.schema",
						   priv->capture_dir, priv->data->label->vol_uuid);

		if (ret > 0) {
			fd = open(priv->data->index_cache_path_w, O_WRONLY | O_BINARY | O_CREAT,
					  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
			if (fd < 0) {
				ltfsmsg(LTFS_WARN, 14120W, priv->capture_dir, errno);
				free(priv->data->index_cache_path_w);
				priv->data->index_cache_path_w = NULL;
			} else {
				ltfsmsg(LTFS_INFO, 14121I, priv->data->index_cache_path_w);
				close(fd);
				fd = -1;
			}
		} else {
			ltfsmsg(LTFS_ERR, 10001E, "capture_dir");
			ltfs_volume_free(&priv->data);
			return 1;
		}
	} else {
		ltfsmsg(LTFS_INFO, 14122I);
		ret = 0;
	}

	/*  Cleanup signal handler */
	ret = ltfs_unset_signal_handlers();
	if (ret < 0) {
		ltfsmsg(LTFS_ERR, 10014E);
		ltfs_volume_free(&priv->data);
		return 1;
	}

#ifdef __APPLE__
	/*
	 *  Set the volume name (logical) when LTFS runs on OS X
	 */
	if (priv->data->index->volume_name.name) {
		ret = asprintf(&opt_volname, "-ovolname=%s(%s)", priv->data->index->volume_name.name, "ltfs");
		if (ret < 0) {
			/* Memory allocation failed */
			ltfsmsg(LTFS_ERR, 10001E, "option string for volume name");
			ltfs_volume_free(&priv->data);
			return 1;
		}

		ret = fuse_opt_add_arg(args, opt_volname);
		if (ret < 0) {
			/* Could not set FUSE option */
			ltfsmsg(LTFS_ERR, 14001E, "volname", ret);
			ltfs_volume_free(&priv->data);
			free(opt_volname);
			return 1;
		}
	}
#endif

	/* Get and store mount point */
	for ( i=0; i<args->argc; i++) {
		fuse_opt_add_arg(&tmpa, args->argv[i]);
	}
	ret = fuse_parse_cmdline( &tmpa, &mountpoint, NULL, NULL);
	fuse_opt_free_args(&tmpa);
	if (ret < 0 || mountpoint == NULL) {
		ltfsmsg(LTFS_ERR, 14094E, ret);
		ltfs_volume_free(&priv->data);
		return 1;
	}
	priv->data->mountpoint = mountpoint;
	priv->data->mountpoint_len = strlen(mountpoint);

	/* Send a trap of LTFS start */
	if (priv->snmp_enabled)
		send_ltfsStartTrap();

	/* now we can safely call FUSE */
	ltfsmsg(LTFS_INFO, 14111I);
	ltfsmsg(LTFS_INFO, 14112I);
	ltfsmsg(LTFS_INFO, 14113I);
	ret = fuse_main(args->argc, args->argv, &ltfs_ops, priv);

	/*  Setup signal handler again to terminate cleanly */
	ret = ltfs_set_signal_handlers();
	if (ret < 0) {
		ltfsmsg(LTFS_ERR, 10013E);
		return 1;
	}

	if (priv->devname && priv->eject)
		ltfs_eject_tape(false, priv->data);

	/* close the volume */
#ifdef __APPLE__
	if (opt_volname)
		free(opt_volname);
#endif
	if (priv->devname)
		ltfs_device_close(priv->data);
	ltfs_volume_free(&priv->data);
	ltfs_unset_signal_handlers();

	return ret;
}


An ever popular item, a clutch bag in Ellen Baker's new print, Framework, is featured today. It combines two cotton-linen canvas fabrics, Daisy Chain and Corners. A diagonally cut opening and an addition of the solid fabric of the same color tone on the corner accentuate the geometric patterns.


Last Friday night each of my girls had a friend over for a sleepover. We had dinner plans someplace nice with my parents so all four girls were crowded into Isabelle's closet trying to find something "fancy" to wear. Fancy, by the way, means anything other than running shorts. (Like mother, like daughters, I suppose.) Everyone was quickly dressed and ready to go--except for Isabelle.
Three girls in poofy skirts (with running shorts beneath) came flitting down the stairs. I could hear angry thudding above so I went to see what the hold up was with Isabelle. She was storming around her room, on a 9-year-old warpath, throwing clothes and having a generalized fit. "I hate my clothes!" "Half of them don't fit and the other half are so babyish and ugly!" "UGH!" "My room is babyish too!" Stomp, stomp, stomp, throw, scowl, huff. I resisted the urge to tell her what an ungrateful little pimple she was being, and kept quiet, trying to breathe. She finally found an acceptable frock and we could go. Once I was out of the reactive zone, I realized that I do that sometimes try on a pile of things and reject them all--frustrated, late, and irritable. When I was even further from my reactive zone, I realized she was right. Half her clothes are too small or no longer match her style. She is pissed because she is trying to grow up and her clothes and her room don't reflect her new direction. Okay, I get it.
So over the weekend my mom and I took the girls to Forever 21 and I let them each pick ten things. Luckily the items at this store are so flimsy and cheap that they cost about $5 each. But to the girls, we may as well have been on Rodeo Drive--they were so excited. They came home, proud of their new duds and proceeded to clean out their closets--doing a more complete purge than I have ever done myself. It was impressive.
But before that, it was a disaster. Slowly the disaster found it's way to order, and the back of my car was filled with old clothes to donate or share. I was really proud of them--I have to nag myself continuously for about a month before I clean out the kitchen junk drawer.
I became inspired. Yesterday I cleaned out my closet. Getting rid of threadbare running attire, white tanks with yellowed pits, ill-fitting impulse buys from Target that I was in too much of a hurry to try on, Cinderella gowns for balls I will never attend, and clothes that have taken up space but not touched my skin for years. My room became a giant mess as piles turned into heaps, and heaps turned into dunes. The kids would navigate around the dunes to locate me, grabbing piles of hangers or handing me trash bags. I ended up with five black trash bags of stuff to give away. But just the way footprints are immediately reabsorbed into wet sand, my closet oozed in around the holes I worked so hard to create- leaving my finished product looking much like my starting point. But I know the difference.
As I ran this morning I started to see a pattern in my life. As much as I like order and organization, sometimes this inhibits me from making the important changes I need to make. Because you see, some changes require a mandatory period of messiness in order to get to clarity or cleanliness.
My life looks messy right now. I am in between projects at work, the end of the year is chaotic and wrapping up for my children, my house is a mess (and once we purge one area, other areas appear to need it ever worse by contrast!), my running snap still eludes me, and it is taking all the energy I have just to keep up.
Perhaps this is when endurance really matters--because simply being able to keep up has to count as enough during certain seasons. I have decided to make peace with the mess, and respect it as part of the process. I am digging in, and digging out. If you are messy right now, too, give yourself some grace. The mess might mean that we are actually going deep enough to elicit growth.


Cutting edge and innovative. As the very first studio in the United States to offer the Bodhi Training System, Defy Gravity undoubtedly has their eyes towards the future of total body fitness.
Subject: Fitness Forward: Defy Gravity is 1st in Country to Offer Bodhi!
What is Bodhi? It is the only 4 point suspension training on the market that perfectly combines strength, balance, flexibility, and unique core conditioning. Owners Shannon Barbadian and Laura Fox of Defy Gravity in Corona, Del Mar are available to share their Bodhi knowledge and expertise. This would be a fantastic segment for your Health & Fitness community. Shannon and Laura would also be happy to connect you with the creator of the Bodhi Suspension System for additional details and article content.
Defy Gravity provides an unparalleled training environment that is intimate, motivational, and fun. We focus on each client and create new patterns of movement to strengthen not only the body but the mind. The Studio is located at 3100 East Pacific Coast Highway, 2nd floor, in beautiful Corona Del Mar, California.
For additional details or to schedule an interview, please contact Shannon Barbadian via shannon@defygravitystudio.com or (949) 719-2900.


text:
'Get a rope': Sid Miller blasts Texas city for excluding Confederate group from parade
The oft-controversial agriculture commissioner draws fire for a remark he says was a joke based on a 1992 TV commercial.
Texas agriculture commissioner Sid Miller applauds during the State Fair of Texas Youth Livestock Auction at Fair Park in Dallas in 2016.(Staff Photographer)
By Loyd Brumfield
7:55 PM on Nov 9, 2019 CST
Sid Miller didn't like his hometown's decision to limit a Confederate group's presence in a Veterans Day parade. His response didn't play too well, either.
The Texas agriculture commissioner, who isn't afraid to stir the pot with controversial remarks, responded to a notice on Facebook that the Sons of Confederate Veterans group couldn't fly its flags at Stephenville's annual parade honoring U.S. military veterans.
"Get a rope," he posted in the comments section.
The response was swift, as other commenters accused Miller of being tasteless or trivializing the act of lynching.
"Sid Miller so ... hang the people because?" one post read.
"Sid Miller a rope for what sir ?" read another.
Miller later edited his remark to clarify things but still kept his original statement intact.
"Good grief people, it's a joke, an old saying from a Pace Picante commercial. Lighten up."
Miller was referring to a salsa commercial from 1992, in which a group of Texans become outraged after one of their own brings a salsa from New York City to their cookout.
"Get a rope," was the commercial's solution to that Yankee-made picante sauce, and it became a cultural catchphrase in the state.
Miller replied to a post from a Stephenville resident that was critical of the Veterans Day parade decision.
"The [parade] entry was sent in over a month ago but when the S.C.V. arrived this morning bright and early with 2 trailers, plus a cannon displaying a Vietnam Soldier with a United States Flag and also a trailer displaying Confederate flags, ladies dressed in Civil War Dress and men in Confederate uniforms, the S.C.V. was told to remove the Confederate flags or LEAVE," the post read.
It had drawn more than 700 comments as of Saturday evening.
A parade organizers defended the decision.
"My understanding is that it would be inappropriate for the military to be involved in a parade with the Confederate flag flying," Burton Smith told the Texas Tribune.
Miller did not respond to the Trib's requests for a comment, but spokesman Todd Smith said he didn't know anything about the Facebook comment.
Several who posted on the Facebook thread voiced displeasure at parade organizers' decision while not addressing Miller's remarks.
"Very sad. I have ancestors who fought on both sides of the Civil War and am proud to call them all family and veterans," one comment read. "It's a part of our history, like it or not, and should never be forgotten."
Others supported the move to ban the Confederate flag.
"This clearly says "decorations should have a patriotic/military theme," another comment read. "The confederate flag is about as anti-American as you can get. They literally fought to not be a part of the US."
Loyd Brumfield, Breaking News producer. Loyd has covered breaking news for The Dallas Morning News since 2017. A native of Southeast Texas, he has been with The Dallas Morning News since 2007 and has worked in multiple roles: communities editor, communities reporter and breaking news producer.
lbrumfield@dallasnews.com /loydbrumfield @LoydBrumfield

redpajama_set_name: RedPajamaCommonCrawl


Mostly cloudy, with a high near 56. Northwest wind around 15 mph.
Partly cloudy, with a low around 38. Northwest wind 5 to 9 mph becoming calm after midnight.
Mostly sunny, with a high near 66. South wind 3 to 7 mph.
A chance of showers, mainly between 11pm and 2am, then rain likely after 2am. Increasing clouds, with a low around 50. South wind around 6 mph. Chance of precipitation is 60%. New precipitation amounts between a tenth and quarter of an inch possible.
Rain. High near 61. South wind around 7 mph becoming west in the afternoon. Chance of precipitation is 80%.
A chance of showers, mainly before 2am. Mostly cloudy, with a low around 39. Chance of precipitation is 50%.
A chance of showers. Partly cloudy, with a low around 38. Chance of precipitation is 40%.


Sciblogs | 'Please Alexa': are we beginning to recognise the rights of intelligent machines?
Amazon has recently developed an option whereby Alexa will only activate if people address it with a "please". This suggests that we are starting to recognise some intelligent machines in a way that was previously reserved only for humans. In fact, this could very well be the first step towards recognising the rights of machines.
Machines are becoming a part of the fabric of everyday life. Whether it be the complex technology that we are embedding inside of us, or the machines on the outside, the line between what it means to be human and machine is softening. As machines get more and more intelligent, it is imperative that we begin discussing whether it will soon be time to recognise the rights of robots, as much for our sake as for theirs.
When someone says that they have a "right" to something, they are usually saying that they have a claim or an expectation that something should be a certain way. But what is just as important as rights are the foundations on which they are based. Rights rely on various intricate frameworks, such as law and morality. Sometimes, the frameworks may not be clear cut. For instance, in human rights law, strong moral values such as dignity and equality inform legal rights.
So rights are often founded upon human principles. This helps partially explain why we have recognised the rights of animals. We recognise that it is ethically wrong to torture or starve animals, so we create laws against it. As intelligent machines weave further into our lives, there is a good chance that our human principles will also force us to recognise that they too deserve rights.
But you might argue that animals differ from machines in that they have some sort of conscious experience. And it is true that consciousness and subjective experience are important, particularly to human rights. Article 1 of the Universal Declaration of Human Rights 1948, for example, says all human beings "are endowed with reason and conscience and should act towards one another in a spirit of brotherhood".
However, consciousness and human rights are not the only basis of rights. In New Zealand and Ecuador, rivers have been granted rights because humans deemed their very existence to be important. So rights don't emerge only from consciousness, they can extend from other criteria also. There is no one correct type or form of rights. Human rights are not the only rights.
As machines become even more complex and intelligent, just discarding or destroying them without asking any questions at all about their moral and physical integrity seems ethically wrong. Just like rivers, they too should receive rights because of their meaning to us.
What if there was a complex and independent machine providing health care to a human over a long period of time. The machine resembled a person and applied intelligence through natural speech. Over time, the machine and the patient built up a close relationship. Then, after a long period of service, the company that creates the machine decides that it is time to turn off and discard this perfectly working machine. It seems ethically wrong to simply discard this intelligent machine, which has kept alive and built a relationship with that patient, without even entertaining its right to integrity and other rights.
This might seem absurd, but imagine for a second that it is you who has built a deep and meaningful relationship with this intelligent machine. Wouldn't you be desperately finding a way to stop it being turned off and your relationship being lost? It is as much for our own human sake, than for the sake of intelligent machines, that we ought to recognise the rights of intelligent machines.
Sexbots are a good example. The UK's sexual offences law exists to protect the sexual autonomy of the human victim. But it also exists to ensure that people respect sexual autonomy, the right of a person to control their own body and their own sexual activity, as a value.
But the definition of consent in section 74 of the Sexual Offences Act 2003 in the UK specifically refers to "persons" and not machines. So right now a person can do whatever they wish to a sexbot, including torture. There is something troubling about this. And it is not because we believe sexbots to have consciousness. Instead, it is probably because by allowing people to torture robots, the law stops ensuring that people respect the values of personal and sexual autonomy, that we consider important.
These examples very much show that there is a discussion to be had over the rights of intelligent machines. And as we rapidly enter an age where these examples will no longer be hypothetical, the law must keep up.
We are already recognising complex machines in a manner that was previously reserved only for humans and animals. We feel that our children must be polite to Alexa as, if they are not, it will damage our own notions of respect and dignity. Unconsciously we are already recognising that how we communicate with and respect intelligent machines will affect how we communicate with and respect humans. If we don't extend recognition to intelligent machines, then it will affect how we treat and consider humans.
Machines are integrating their way in to our world. Google's recent experiment with natural language assistants, where AI sounded eerily like a human, gave us an insight into this future. One day, it may become impossible to tell whether we are interacting with machines or with humans. When that day comes, rights may have to change to include them as well. As we change, rights may naturally have to adapt too.


Spreading mulch in your garden helps protect the soil in general, but it has specific benefits during harsh winter conditions. A layer of mulch will keep the soil insulated, roots protected from quickly freezing or overly wet soil, and you'll also end up with better results come spring by laying down mulch in the cold months.
Fall and winter mulches create an insulating barrier between the soil and air, thereby protecting plant roots from rapid fluctuations in soil temperature. The temperature changes create movement that can heave plants out of the soil, exposing their crowns or upper root systems to damaging freezes. Fall and winter mulches also protect the ground from soil erosion and compaction from heavy rains.
You can also use mulch in winter to line dirt paths that turn to mud during the wet season. Different types of mulch (shredded leaves, wood chips, straw) are best used in different areas of your garden, and the full guide linked below explains where to use which type of mulch.


text:
Q: Edit xml config with batch file I have a line in my config file (.exe.config)
 <appSettings configSource="Configuration\local.config" />

And I need use a batch file to change it to
 <appSettings configSource="Configuration\production.config" />

Any ideas?

A: This is going to be very brittle and prone to error, but if you still want to do it, go ahead:

*

*We need delayed expansion
setlocal enabledelayedexpansion

*Iterate over the lines in the file
for /f "delims=" %%L in (foo.exe.config) do (

*Store the line
  set "Line=%%L"

*Do the replacement
  set "Line=!Line:Configuration\local.config=Configuration\production.config!"

*Output the line again
  echo !Line!
)

redpajama_set_name: RedPajamaStackExchange


text:
makingmusicmyway
How a City Of Angels expat survives (and thrives) in the Land of Enchantment…
About Tracey Whitney
Tag Archives: Paula Moye
Do you have a signature sound? No? Better get one…
One of the biggest compliments I've ever gotten is when another singer asks me to produce them. It means a lot when people love what you do. The only problem is that when they say, "produce me," it really means that they want what I consider to be my "signature sound." A sound developed from my early childhood years spent listening to my mom Louise, Aunt Mary and Uncle Jimmy (at the time known as Whitney, Whitney & Whitney) harmonizing while rehearing for a gig or recording date, followed by 15 years singing in my 9 member family group, The Whitney Family. Topped off by a 1991 tour with Ray Charles as a Raelette (and singing the most difficult part, the 4th harmony). All of these influences converged in my little head, and now I sound like "Me," an amalgamation of all that incredible harmonic foundation. It's mine, and no, you can't have it…
Remember back in the day when Babyface was THE go-to producer? Don't get me wrong, I LOVE Babyface. The only problem to me was that when you heard an artist he produced, you immediately knew it was his production. Why? Because they all sounded like him. And he sang on all their tracks. Cool I guess if that's what you want. But why sound like him, when you can sound like you?
In these cookie-cutter singer times, I look for the originals. I'm old school. I remember when the WHOLE IDEA was to have your own sound. Remember when there was just ONE Stevie Wonder? Now so many male singers try to emulate him – all sad seconds – who, if they'd just sound like themselves, may actually be "special," and not just a Stevie wanna-be.
Raelette's Paula Moye and Tracey Whitney Ray Charles 1991 tour.
When I toured with Ray Charles, I roomed with another Raelette, Paula Moye. Paula had a very distinctive way of doing her eye makeup. So unique in fact, that her boyfriend at the time didn't want her sharing her secrets. "Don't let them see you do it," he told her. To him, that made her special. And she was absolutely lovely! But Paula's secrets were safe with me: I had no intention of looking like anybody but Tracey…
It's GREAT to love other artists! Necessary even. Others influence us ALL. The trick is to not be lazy, and get sucked into sounding like them. It takes effort to develop your own signature style. But it's worth it. Otherwise, people will always say things like, "wow, you ALMOST sound just like Stevie." And who wants to "almost" sound like Stevie?
Let me know how you're making it in the music business! I'd love to hear your story.
Until next time, much love…
http://babydollentertainment.com
Posted by makingmusicmyway on September 24, 2012 in Music
Tags: entertainment, Jazz, music, music promotion, Paula Moye, Raelette, Raelettes, Ray Charles, Singing, Smooth Jazz, Soul Music, Style, Tracey Whitney
Happy girl….
A former Ray Charles "Raelette" (1991), Tracey Whitney began performing professionally at age eleven with her family singing group, The Whitney Family. She spent 5 years performing in Japan before launching an indie label, Babydoll Entertainment, releasing two solo albums to critical acclaim. She relocated to Albuquerque, NM in 2012, and performs her brand of "classic jazz & sophisticated soul" in some of ABQ's most popular venues. She's performed with a host of touring contemporary jazz elites, including: Will Donato, Marc Antoine, Euge Groove, Darren Rahn and Julian Vaughn, and some of her solo concerts have included: the NM Jazz Workshop's Jazz Under the Stars "Women's Voices Singing" and "Ladies Sing the Blues" at the ABQ Museum Amphitheater, The Outpost Performance Space, The Santa Fe Bandstand, Leonard Tischler's Freedom Work – Folk Forms and Variations (featured vocalist), the Gazebo at Old Town, and the Live At The Lab music series at Isotopes Park. She's performed twice for the New Mexico Black Expo, and in 2015 opened for famed soul crooner Howard Hewett (of the legendary vocal group Shalamar).
BabyDoll Entertainment
Reverb Nation
My music is available at CDBaby.com
Italian officials... unexpectedly offered a potentially explosive tip linking #Trump to certain suspected financial… twitter.com/i/web/status/1… 13 hours ago
@Petereporter @NBCNews Oh well... 🤡🤡 https://t.co/wjsWvJsHGw 1 day ago
@Angry_Staffer Most people abandon a sinking ship, while @RepMTG just doubles down. But OK... https://t.co/CnuoIeAfra 1 day ago
@mle428 @santiagomayer_ Wonderful...👍🤡 1 day ago
@soledadobrien @Roberts4WV #RollanRoberts Howard Dean moment. Dude will NOT be president... https://t.co/32VmITVuG7 1 day ago
Follow @SingItPretty
Here's my review of the new Lizz Wright CD, Freedom & Surrender, in the latest issue of Smooth Jazz Magazine. Great CD!
R&B FUNK BASSIST BROTHERS JOHNSON'S LOUIS JOHNSON PASSES AT 60 -RIP
HAPPY BIRTHDAY AMBASSADOR HERBIE HANCOCK LOOKING GOOD
My 'Brian Culbertson Live' review for Smooth Jazz magazine
JAZZ APPRECIATION MONTH in APRIL: JAZZ SPOKEN HERE ROBERT J. CARMACK & DALE FIELDER


text:
Mary BARRETT's parents: Daniel BARRETT (1861?- ) and Margaret HENNESSY (1854- )
Mary BARRETT's siblings: Ellen BARRETT (1884-1964), Richard BARRETT (1888?-1950) and Nicholas BARRETT (1890?- )
Mary BARRETT (1874?- )
1 Mary BARRETT (1874?- ), dau. of Daniel BARRETT (1861?- ) and Margaret HENNESSY (1854- ).
Born 1874 (cal), Cork City, Ireland.1,2,3
Sp. John O'BRIEN4 (1881- ).
1 Mary O'BRIEN (1909-2011).
Born 23 Sep 1909, Cork City, Ireland.3 Marr Brian DONOHOE Q1 1935, Cork City, Ireland.5 Died 2 Jan 2011, Cork City, Ireland.6 Buried 6 Jan 2011, Douglas, RC Cemetery.
Sp. Brian DONOHOE (1911-1979), son of Maurice DONOHOE (1877-1961) and Emma FEWSTER (1877-1952).
Sent to Cork when young with sister Monica to be raised by uncle William.
1 Brian O'DONOHOE (1935- ).
Born Q2 1935, Cork City, Ireland.7 Marr Rebecca HAYES 1958, Blackpool Church, Cork City, Ireland.8
Sp. Rebecca HAYES (1934- ).
Born 19 Mar 1959, Ely, Cambridgeshire, UK.9
2 Jacqueline Christine O'DONOHOE (1962- ).
Born 26 Nov 1962, Sheffield, Yorkshire, UK.10 Marr Brent MOSSOP 16 Jun 1989.
Sp. Brent MOSSOP ( - ).
1 Megan Christine MOSSOP (1983- ).
Born 24 Feb 1983.
2 Niall Christopher MOSSOP (1985- ).
Born 6 Apr 1985.
3 Madison Aileen MOSSOP (1987- ).
4 Mairead Rebecca Louise MOSSOP (1990- ).
Born 14 Sep 1990.
Sp. (unknown).
1 Cian MOSSOP (2009- ).
Born 11 Dec 2009.
Sp. Shane UNDERWOOD ( - ).
2 Jordan UNDERWOOD (2011- ).
Born 6 Dec 2011.
5 Gillian Carson Mae MOSSOP (1992- ).
Born 29 Nov 1992.
3 Donal Finbarr O'DONOHOE (1964- ).
Born 15 Mar 1964, Sheffield, Yorkshire, UK.11
Sp. Giulia CAPELLI ( - ).
4 Monica Marie O'DONOHOE (1967-1996).
Born 12 Aug 1967, Brandon, MB, Canada. Died 15 Aug 1996.
Sp. Larry TOWNSEND ( - ).
1 Kiya TOWNSEND (1989- ).
Born 15 Jan 1989.
2 Bryer TOWNSEND (1990- ).
3 Kynesha TOWNSEND (1991- ).
Born Sep 1991.
5 Deirdre Katrina O'DONOHOE (1976- ).
Born 22 Mar 1976, Brandon, MB, Canada. Marr Jason BERENYI 25 Feb 2011.
Sp. Jason BERENYI ( - ).
1 Olen Hayes BERENYI (2012- ).
Born 22 Jun 2012.
2 Donal O'DONOHOE (1940-2010).
Born Q1 1940, Cork City, Ireland.12 Died 31 Jul 2010, Cork City, Ireland.
Birth registered as Donal Donohoe.
3 Finbarr K O'DONOHOE (1942-1945?).
Born Q4 1942, Cork City, Ireland.13 Died 1945 (est), Cork aged 3.
Killed by a bus on Bishop's St. at 3 y/o.
4 Declan O'DONOHOE (1947-2015).
Born Q2 1947, Cork City, Ireland.14 Died 16 Mar 2015, Cork, Ireland.
5 Martina O'DONOHOE (1955- ).
Born Oct 1955.
Sp. Kevin FINDLAY ( - ).
1 Sara FINDLAY ( - ).
2 Niamh FINDLAY ( - ).
2 Daniel O'BRIEN (1911- ).
Born 1911, Cork City, Ireland.
Sp. Eileen FORREST ( - ).
1 Maria O'BRIEN ( -2002).
Died 7 Dec 2002.
2 Anna O'BRIEN ( - ).
3 Eileen O'BRIEN (1941- ).
Sp. Unknown O'LEARY ( - ).
1 Deborah O'LEARY ( - ).
Sp. Unknown LEAHY ( - ).
1 Daniel LEAHY (1991- ).
2 Amy LEAHY (1993- ).
Born 8 Nov 1993.
3 David LEAHY (1997- ).
Born 8 Sep 1997.
4 Dean LEAHY (2000- ).
Born 10 Jul 2000.
5 Daire Paul LEAHY (2009- ).
4 Finola O'BRIEN ( - ).
3 Margaret Mary O'BRIEN (1913-2001).
Born 2 Oct 1913. Marr David O'SULLIVAN 19 Sep 1942, Cork City, Ireland. Died 13 Jan 2001, Cork City, Ireland.
Sp. David O'SULLIVAN (1914-1989).
1 Mairead O'SULLIVAN (1946- ).
Born 9 Aug 1946, Cork City, Ireland.
Sp. James MOYNIHAN ( - ).
2 David O'SULLIVAN (1951- ).
Born 5 Jun 1951, Cork City, Ireland. Marr Brigid Alice POWER 30 Jun 1984.
Sp. Brigid Alice POWER ( - ).
3 Deirdre O'SULLIVAN (1953-1957).
Born 23 Apr 1953, Cork City, Ireland. Died 4 May 1957, Cork City, Ireland.
4 Jack O'BRIEN ( - ).
1 "1911 Census, Cork, 10 St Patrick's Tce".
2 "Census 1901 Cork Urban No5, Evergreen St Cork Urban No5, Evergreen St" (Cork Urban No5, Evergreen St).
3 "Census 1901 Cork No 4 Urban, 5 Winter's Hill Cork No 4 Urban, 5 Winter's Hill" (Cork No 4 Urban, 5 Winter's Hill).
4 "1911 Census, Cork, 10 St Patrick's Tce - Danny Brien & Parents".
5 "Ireland, Civil Registration Marriages Index, 1845-1958". Q1 1935, Cork, 5, 77.
Text From Source: O'Donoghue
6 "RIP.ie". Assessment: Secondary evidence.
Text From Source: Catherine (May) O'DONOHOE, (née O'Brien) of Oakdene, Skehard Road, Cork City, Cork
Reposing at Sullivan's Funeral Home, Turners Cross. Removal tomorrow, Wednesday evening, at 7.30pm to the Holy Cross Church, Mahon. Requiem Mass on Thursday at 10.45am. Funeral afterwards to Douglas Cemetery.
7 "Ireland, Civil Registration Births Index, 1864-1958". Q2 1935, Cork, 5, 106. Assessment: Primary evidence.
8 "Marriage 1958 Brian O'Donohoe & Rebecca (Rebie) Hayes" (Q2 1958/Cork/4/99).
9 "England & Wales, FreeBMD Birth Index: 1837-1983" (3a662). Q1 1959, Ely, 4a, 575. Assessment: Primary evidence.
10 Ibid. Q4 1962, Sheffield, 2d, 168. Assessment: Primary evidence.
12 "Ireland, Civil Registration Births Index, 1864-1958". Q1 1940, Cork, 5, 131. Assessment: Primary evidence.
Text From Source: Donal Donohoe, Mother O'Brien
13 Ibid. Q4 1942, Cork, 5, 120. Assessment: Primary evidence.
Text From Source: Mother: O'Brien


text:
Guns Are Fun
Feeding Moloch
Sometimes, it's hard for even me to believe, but about thirty years ago, I was a student in Israel.
It's a long story as to why I was there, especially since I'm not Jewish, but I was attending a rather cool study program. For three or four days a week, we'd study some part of ancient Jewish (Israelite) history in the classroom, and then we'd follow it up with a road trip to go see the place(s) in question.
I remember one time when we were gathered around some dusty hill where people used to live two thousand years earlier, and the teacher solemnly intoned "This spot used to be where there was a temple to Moloch."
He then went on to tell us a horrific story about a special ramp or chute that led to a chamber of fire, and said that parents used to chuck their newborn kids down that chute into the fire to be burned alive as a sacrifice to the god Moloch.
Honestly? I laughed. I mean, it sounded ridiculous, even to my inexperienced ears. What kind of people would sacrifice babies? And what kind of parents would watch them be burned alive?
Frankly, I just chalked it down to typical propaganda from the Pentateuch ("Old Testament") about the Israelite's Canaanite neighbors. Yeah, yeah, Yahweh is great, but those dirty Canaanites were baby killers.
Anyway, that was thousands of years ago, and nobody is gonna do stuff like that anymore.
Right? RIGHT?
Well, I don't know shit about Moloch or what life was like on the ground in ancient times, but I do know that everybody in the United States, Australia, Canada, and most of Europe are damned sure eager to fucking sacrifice their babies now.
If you're a rich, fat fuck like Bill Gates, I almost understand it. But what's everybody else's excuse?
Refugee vs. Migrant
This past week, I witnessed probably the most Soviet thing I've ever seen with my own eyes – virtually the entirety (minus 11 brave MEPs) of the European Union parliament and the US parliament (Congress) waving Ukrainian flags around, as if any of them give a shit about the people in Ukraine.
I then had the misfortune of listening to the dementia patient allegedly "running" the United States begin the annual State of the Union not talking about America, but of Ukraine, mumbling some bullshit about winning the hearts and minds of the Iranian people.
Christ, what a joke.
Who has killed more Ukrainians in the past ten years than the Ukrainian army? Nobody.
Woman injured in a gas explosion in 2018 in Russia now a helpless Ukrainian
Meanwhile, the failing Empire media continues to flood the internet with laughably false propaganda, despite having an army of "fact-checkers" (aka NKVD commissars) on hand to supposedly stop that kind of thing.
In fact, here's an image from the pathetic New York Times from just two days ago:
Notice something weird on the right-hand side of that photo? Apparently, people escaping from the genocide in the east being perpetrated by Ukrainians even now and going to Russia are "migrants," but everyone going west are "refugees."
Seriously, I have to ask – how much dumber can it get? I mean, these guys are seriously giving 1980s Soviet media a run for their money when it comes to laughably stupid "journalism."
Look, I fully understand why some civilians want to get the hell out of Ukraine, and I'm very glad that they're all being well taken care of, whether they're in Russia or Romania, but I'm going to repeat my point from the other day – not all of these people are refugees.
Some are clearly just opportunists, especially now that the EU is going to let them stay and work for three years (at least).
I like Ukrainians. One of my best friends here in Tiraspol is a Ukrainian. But the Empire has run their country into the ground. Corruption is endemic, salaries are utter shit, and the basic infrastructure (roads, bridges, hospitals, etc) is falling to shit. Damn right, there are people in Ukraine making the rational decision to hop on over the border and get themselves access to a better life now. And once they get jobs, they're not going to leave.
Furthermore, look at this map of the battles from the first five days:
Notice anything? There's no fighting anywhere close to Romania, Moldova, Hungary, or Poland. Yet that's where hundreds of thousands of "refugees" are going. They can't all be victims of shelling.
Lastly, while I personally get along with Gypsies just fine (as I have recounted hundreds of times on this blog), be aware that huge numbers of Ukrainian gypsies are also crossing over as "refugees." I've seen estimates that as many as four hundred thousands Gypsies live in Ukraine, nearly all of them in the west near the border of Romania and Hungary.
This past week, Romanians have been falling all over themselves to congratulate themselves for helping the 'fugees. But what do you think's gonna happen in Romania when tens of thousands of Gypsies show up? More racist ass shit, is what.
Romanians, meanwhile, are kidding themselves that these 'fugees are a) exclusively young mothers with kids and b) gonna be leaving soon. Well, they're not, and they won't. So you better get fucking used to them!
Memories of Anne Frank
In 2020, I re-read the diaries of Anne Frank. It was quite poignant, especially since her family was effectively in a type of "lockdown," which I and everybody else had to endure thanks to the Empire's lies.
But what struck me this week was just how odd it was that Anne's family, living without a TV, phone, or the internet, were able to actively follow the progress of battles as the war unfolded (via the radio).
Today, there are ten million streams of information available, and yet good luck finding any kind of progress reports from Ukraine on any of the "mainstream" channels. I've literally been unable to find even basic information like "they're moving towards Mariupol" anywhere except for independent bloggers, journalists, and, of course, the Russian media.
Why? Why are journalists unable to provide even basic information like that? My guess is that they're simply too dumb to be able to pronounce the names of Ukrainian cities or even know where they are. After all, what's the point of talking about the encirclement of Nikolaev (Mykolaiv) if nobody even knows where it is?
Honestly, I doubt even one person in a thousand (who isn't Ukrainian or Russian) who is waxing on about the "poor people of Ukraine" even know where Kiev is or its relative position inside the country. And I doubt there's even one person in a million in the United States and Britain who knows the difference between Cerhnihiv and Chernivtsi.
Of course, in the old days, it used to be job of journalists to educate people about this stuff. But now, even the journalists are fucking retards who think Chernobyl is just down the road from Tiraspol, for god's sake.
Other Developments
Romanian-language media, in both Romania and Moldova (as well as Empire outlets like DW and the BBC) have been doing their level best, as always, to scare the shit out of people about this war. After two years of stressing the hell out of people over "Covid."
They've also been running stories 24/7 about Ukraine, as long as they make Ukraine look good and Russia look bad. I even saw one pathetic Romanian channel "report" about some kids in a Russian school who supposedly got detention (punishment) for drawing "no war" placards.
Did that happen? Maybe. But what the hell does that have to do with anything? Russia has fifty-nine thousand primary/elementary schools. Surely, there are more important things to focus on than what one school is or is not supposedly doing.
Romania, meanwhile, is bursting to the seams with foreign troops, and everyone thinks that's just a jolly, wonderful thing. Romania, supposedly, has several political parties but yet they all agree just how fantastic it is their country is stuffed to the brim with armaments from the same assholes that bombed the living shit out of their neighbor Serbia just twenty short years ago.
Meanwhile, that Ukrainian fighter jet that illegally crossed into Romanian airspace a few days ago has been returned (🇷🇴) to Ukraine. Not only that, but they let the pilot who violated Romania's territorial integrity fly it back! And two Romanian fighter planes escorted it right up to the edge of the border.
Officially, Romania says the plane was "disarmed." But giving military assistance to Ukraine right now is a pretty damned good way to piss off Russia and get Romania involved in the war. Of course, that's what President Iohannis has been salivating about for the past five years.
I mean, does anybody remember how both World War I and World War II started? With a series of little escalations that suddenly got out of control? Jesus!
Romania, of course, has also been enthusiastically blocking, sanctioning, and censoring all things Russian this week like the good little Empire minions they are. Someone also vandalized the Russian embassy in Bucharest as well.
Look, if you don't like the Russian government, that's fine. But censoring the media? Really? And threatening to expel all Russian citizens from the country, even university students and folks who actually hate Putin? Ludicrous. If that's democracy, then democracy can fuck right off.
Moldova, thank god, has remained neutral on all accounts. There were some (peaceful!) protests, but that's perfectly fine and democratic. Of course, crazy Maia Sandu has been pushing for sanctions, but then someone whispered in her ear that some 70% of Moldova's imports come from Russia, and the entire Moldovan economy (including its energy supplies) come from Russia. And vast numbers of Moldovans live, study, and work in Russia.
Meanwhile, over in Ukraine
Aside from the non-existent battle reports that the "mainstream" Empire media isn't covering, here are some facts folks should know.
One – Alcohol sales are banned nationwide in Ukraine. Ukraine, like much of Eastern Europe, has millions of alcoholics, including a lot of poor, desperate people who just cannot go all day without having a little drink. This has led some rather sad characters to "loot" liquor stores. Ukrainian vigilantes are roaming the streets, seizing these poor bastards, and doing horrible things to them like taping them to light poles or, in some cases, stripping them naked and parading them through the streets.
Two – In places like Kiev, where there aren't any Russian soldiers (yet?), everyone is paranoid as shit about "Russian saboteurs." I've seen some rather grisly videos of people being stopped and shot by vigilantes on the pretext that they're saboteurs. I even saw some kids get pushed around and shoved by an angry mob after they drew "marks" on the street that were perceived as being "secret signals" for Russian troops. Mob justice is starting to rule in many Ukrainian cities, and it's Ukrainians doing this to themselves, not the evil Russians. Of course, that's nothing new in Ukraine.
Three – Apparently, no one in the "West" thinks it's a problem that President Zelensky signed an order to let criminals out of jail to "fight the invaders." Some of those released folks were rather nasty murderers, including one guy who had brutally butchered a civilian waiting at a bus stop a few years ago. I'm not sure how a handful of rapists and murderers is going to "win the war," but that's what Zelensky did. God knows if these people will ever be re-arrested once the fighting ends.
Four – Especially in Kiev, the authorities have been handing out automatic weapons willy-nilly, not even bothering to write down (on paper!) the serial numbers or the names of the people getting them. Ukraine is a bit unusual (as compared to Moldova or Romania) in that there are quite a few criminal gangs, especially in the bigger cities. Now, these criminal gangs are roaming around with free weapons, settling scores with one another.
Five – Zelensky has been begging regular citizens to pick up guns or make Molotov cocktails in order to fight the Russians. That sounds all good and fine, but what do you think Russian troops will do when they come across a "citizen" armed with a weapon? That's a recipe for disaster. Already, I saw one moron film herself throwing a Molotov cocktail out the window at a Russian armored vehicle, setting her own arm on fire in the process. Clearly, people are going to hurt, and I'm talking about untrained civilians.
Six – Everyone knows that vast numbers of people are fleeing Ukraine. This includes foreigners, especially Africans, Indians (from India), and Chinese. There are many universities in Ukraine that have foreign students "of color," and I fully understand why those people want to go home. Unfortunately, Ukrainians have been badly abusing many of these people. Sometimes, they throw them off the buses heading to the border, saying that the spots are reserved for Ukrainians. Other times, the border guards are shaking them down for bribes or, in a few cases, beating the shit out of them before robbing them.
Seven – Ukraine shut down the border with Pridnestrovie, but not Moldova. Lots of people here in PMR have family members in Ukraine, so thanks for that, assholes!
Eight – Ukraine also officially prohibited all men (under age 60) from leaving the country. Why? What about the pacifists, handicapped folks, and people who just aren't interested in fighting? Why can't they leave? And what, exactly, is some peasant in a village 500 miles from the front line supposed to do, especially as food and fuel runs out? They're already rationing gasoline and food in some places.
Nine – Plenty of sources have reported about the enormous line of buses and cars at the border of people trying to leave, but nobody has asked why. Why are those lines so long? After all, once you get into Romania or Moldova (or Hungary, Poland, wherever), you're instantly welcomed through, even without a passport, Covid check, or anything else. So what's the hold-up? The answer is bribery extortion by Ukranian border guards. Last report I saw said that the going price for a Ukrainian male (of "fighting age") to cross is $150, while any foreigner with dark skin has to pay $500. Yep, Ukraine's final gift to its people is to rob the shit out of them.
Ten – A few mayors of cities in Eastern Ukraine have worked out deals with the Russians in order to prevent their city from being destroyed. As a result, ordinary people can go about their business, and the Russians are letting the local cops handle the law and order stuff while their soldiers and equipment move onto other locations. But Zelensky's government has filed "treason" charges against these mayors. What, exactly, were these mayors supposed to do? Fight off the Russians by themselves? Or sacrifice people's lives in a battle to the death? Fucking hell.
Apparently, the number of people in the "West" with functioning brains who can still ask questions is dwindling.
Here are some questions that nobody seems to be able to answer:
1) America is dependent on Russian oil, not to mention a whole host of other things like titanium for their fighter jets. Where the fuck are those resources going to come from, if not Russia?
2) Why did Putin launch this attack on Ukraine? Other than "because he's Hitler" or "he's a madman" retarded shit that is everywhere on the internet. Seriously, I've never heard of a war being discussed where literally nobody seems to think figuring out why this is happening is worth asking (or allowed to be asked).
3) If you hate Putin, that's your business. But if you're cheering on him to die or get thrown out of office, who exactly do you think should be running Russia? And please don't say that fraud Alexei Navalny.
4) Plenty of bloodporn addicts in the West are calling for a coup d'etat in Russia or something similar (such as the "complete destruction of the Russian economy"). Do you really think that's a good idea in a country with five thousand or so nuclear weapons? And if millions of Russians become refugees, where do you think they're going to go?
5) Why was Poland beating the shit out of migrants trying to enter their country two months ago but now welcoming in the Ukrainians? Good luck finding an answer that isn't racist as shit.
6) Why are Ukrainians who are fleeing Russian attacks refugees, but the people fleeing American attacks in Syria, Iraq, and Afghanistan are all "migrants"? And why is it okay for Ukrainians to flood into Europe by the millions, but not those other folks?
7) Lots of countries are happily banning all ties with Russia and Russian products, including dumbass moves like pouring out Russian vodka (despite the fact that it's already been paid for). Yet this move is going to utterly destroy the global economy, to say nothing of the food supply:
Russia and Ukraine are significant players in shipping and logistics, not massive, but enough to move the needle. Ukraine is the fourth largest exporter of agricultural goods, a major player in wheat, corn, barley, sunflower seeds and sunflower oil. A good chunk of Africa and the Middle East is dependent on Ukrainian grains.
Sure, if you're American, Romanian, or Canadian (where most of my readers live), you've got plenty of wheat and corn to go around. But if millions of Africans and Arabs start running out of food, where do you think they're going to go?
8) Not only is America dependent on Russian oil, the electrical grid in America is also dependent on enriched uranium from Russia. Is there really anyone who thinks Americans don't already pay enough for the basic necessities of life after the government shitcanned the economy?
9) Since when have sanctions worked, ever? Cuba has been under American sanctions for more than sixty damn years. Jesus! The only thing sanctions do is kill and starve poor people. After all, American sanctions killed half a million children in Iraq. Totally worth it!
10) Am I the last person on the planet who remembers Joe Biden, laughing on stage as he bragged about forcing Ukraine to fire the prosecutor/attorney general in exchange for aid? I guess I am. Link goes to the Wall Street Journal, ffs, not some blogger.
11) Does anybody but me remember how Ukrainians have treated Romanians over the recent years? Oh, right. The answer is fucking no.
For entirely pragmatic, political reasons, the government of Ukraine is now an "ally" of Romania, and the participation of Ukrainian UNO-UNSO psychos in the 1992 fighting [against Moldova and for Pridnestrovie] has been forgotten. This is especially weird to me because the same Ukrainian group also beat up a bunch of local Romanian leaders in Cernauti in 1992 as well. Furthermore, they are, ideologically, far-right quasi-fascists (or sometimes openly fascist).
Those folks were called UNA-UNSO in those days and are now called Praviy Sektor, the same guys lobbing shells into Donetsk for the past eight years.
These guys went to Cernauti in 1992 (right after the end of the Soviet Union) and terrorized the Romanian community into backing down from any attempts at autonomy or independence. Read about it in Romanian here for a lot more information.
And let's not forget that Ukraine was in the process of shutting down (🇷🇴) all Romanian-language schools in Ukraine this year.
Looking further back, it's important to remember the Khotyn Uprising of 1919, in which Ukrainians fought an open war against Romania in territory that is now Ukraine but was part of Moldova/Romania in those days.
But hey, as long as they're anti-Russian now, that's all that matters, am I right?
12) Does anybody remember when France and Germany (and Poland!) negotiated a transition government after the 2014 uprising in Ukraine? And then America came along and fucked the whole thing before appointing their own rulers of Ukraine? Nah, probably not.
13) Russia most definitely invaded Ukraine. But have you ever seen such a war where the civilians have been almost entirely left alone? And no saturation bombing? Or destruction of hospitals, schools, et cetera?
For fuck's sake, the United States and its allies dropped 9,700 bombs on Libya in just a few months, killing thousands of civilians. The same is true for Afghanistan, Iraq, and everywhere else the United States inflicts its deadly politics. Hell, America launched twenty-two missiles on the village of Bogutovac, Serbia in one day, blowing up a school and a hospital.
14) Why have you not seen a single interview with the people of Donetsk or Lugansk who was liberated by the Russians this past week? Or seen a single photo or video of people thanking them for regaining their freedom? Does their opinion not matter? Are they not Ukrainians?
15) What language exactly do you think people speak in eastern Ukraine? You know, the exact same places where all the Russian soldiers are? And why is that?
16) Do you know what the Minsk Agreement are? Do you know what they say? Do you know that France, Germany, and the United States all signed off on them? Do you know that they were ratified at the United Nations?
17) Do you know what Angels' Lane or the Alley of Angels is? Can you guess why DNR brings all of its Ukrainian army POWs there to visit it? I doubt your local news media has ever mentioned it once, not in eight fucking years.
18) Did you know that Russia is still supplying Ukraine with natural gas (it snowed just yesterday, so it's still quite cold) and Belarus is still supplying electricity to Ukraine? Did you know that Russia has not shut down or interfered with the telephone and internet networks in Ukraine? Nah, of course not.
19) How many television stations and newspapers did Zelensky close during the past two years? How many opposition journalists and politicians did he arrest?
20) NATO to this day continues to call itself a "defensive" alliance. Defensive against whom? Good luck finding any logical answer that isn't "Russia." It's literally the only reason it exists.
As I said, I know Ukrainians, and they're good folks. 99.99% of Ukrainians just want a peaceful life and all the same things we all want.
But their government fucking sucks, and a small percentage of racist, fascist crazies, in combination with the Empire, have destroyed Ukraine. The nation is blessed with tremendous resources of every kind, and yet the average person in Ukraine lives in abject poverty. Why?
War is awful. But the war didn't start last week. And anti-Russian racism and hysteria aren't going to solve this conflict.
Unless you're prepared to educate yourself, go fuck off. In fact, I heartily invite you to jab yourself with another Pfizer vaccine and eat your goddamned donuts as you continue to sacrifice children to your evil gods. And then I'm going to stand on top of your grave until I'm sure that you're dead.
Sam Cel Roman March 2, 2022 March 4, 2022 moldova, romania, russia, ukraine, war
13 thoughts on "Feeding Moloch"
SCMelville says:
Two links with opposing views on the likelihood of Phoenician child sacrifice:
https://www.ox.ac.uk/news/2014-01-23-ancient-carthaginians-really-did-sacrifice-their-children
Bit of light reading
Unfortunate to have known you says:
Wow, Mr. Reames. In Cluj we always thought of you as a weirdo and a sex pest, and that is why there was rejoicing when you got deported from Romania. But I don't think anyone could have imagined that you would descend into COVID conspiracy theories and Russian propaganda. Letter sent to the FBI and the US embassy in Chisinau with all the details I know about you.
Ioan Greavu (@ioangreavu) says:
I've proved to you that oil imports from Russia represent 3% of oil usage in the US. That's about the same amount of truth in your posts.
Since you're so smart, why don't you answer question #2? Why did the madman invade Ukraine? Please enlighten us.
I see you keep ignoring the civilian deaths, "civilians are left alone" – there are countless records of Russian soldiers shooting at peaceful civilians, rockets hitting civilian buildings, cars and even ambulances. The excuse for these war crimes is that the Ukrainians are positioning their armament near schools and hospitals, but I never saw the destroyed weaponry, only the civilian infrastructure.
Honestly, I think you need help, usually calling yourself "king" when that's not the case is a clear symptom of a deranged brain.
Suzana says:
Oh, man! You did it again..this post, too, smells of vodka..i guess it is about the time to change your nickname into Sam Rusul… otherwise, perhaps you are right with some things, but your efforts, to make us believe that Ukrainians are the devil or their leadership, are exceeding our imagination..have fun with drowning your cynicism with some Russky Standard..cheers!
ILikeBoots says:
My God. Your stupidity knows no bounds – like so many in the so called "west". Your culture…..whatever that is…is dead.. You are finished, and you don't ever know. It's tragic.
Vladimir PUKIN says:
Great work, comrade. For your proven deceiving abilities, you'll receive the job opportunity of dusting the Supreme Leader at the Lenin Mausoleum in the Red Square, after they gonna stuff him soon.
Btw, how many rubles is the khleb in your local soviet area today?
How disappointing. I've not seen better propaganda of this nature for some time. You're wrong, but you're good. How is that silver feeling in your pocket?
Right there with you, Brother. Keep it coming.
This was in reply to Sam's piece not to Mac. I misplaced the post.
You WILL soon be forced to reckon with the difference between narrative and reality. Seems you have an acute case of cynicism to treat as well.
To be clear – this replies to Mac.
Man, you don't event know what you're doing. Go to sleep, maybe you'll wake up smarter in the morning. :))
Pingback: Feeding Moloch – A Daily Retrospective
Previous Previous post: The Fog of Information War
Next Next post: Flying Broomsticks to the Stars


text:
States' Attorneys General to Powwow with Mexican Counterparts
Press Release | Monday, Mar 17, 2014
[AG Harris] – Attorney General Kamala D. Harris will lead a delegation of state attorneys general to Mexico to strengthen working relationships between government officials in both countries and enhance efforts to combat transnational crime. The delegation will meet with Mexican state attorneys general and federal officials to discuss the issues of drug, human and firearms trafficking, financial crimes and cyber crimes.
"The fight against transnational crime requires a unified response across state and international borders," Attorney General Harris said. "This bipartisan delegation of attorneys general will travel to Mexico to strengthen the cross-border coordination and communication that is vital to ending this violent, insidious issue. I thank my colleagues for joining me to address this serious threat to California and the United States."
The delegation trip is a result of work by the Attorneys General Consortium to Fight Transnational Organized Crime, and is organized with the assistance of the Conference of Western Attorneys General.
The attorneys general will travel to Mexico City from March 24 through the 26. The delegation includes California Attorney General Kamala D. Harris, Colorado Attorney General John Suthers, Florida Attorney General Pam Bondi, Nevada Attorney General Catherine Cortez Masto and New Mexico Attorney General Gary King.
The attorneys general will meet with Mexican state and federal officials to discuss mutual cooperation in areas of technology, information sharing and prosecution coordination.
Specifically, the delegation will meet with government officials to increase mutual strategic support to combat the problems of international money laundering, intellectual property violations and distribution of counterfeit goods, and the adoption of technology to combat human trafficking, cybercrime and child pornography distribution.
The delegation will meet with:
* Mexico Attorney General Jesus Murillo Karam
* President of the National Banking Commission Jaime Gonzalez Aguade
* Secretary of Economy Ildefonso Guajardo
* General Director of the Mexico Institute of Industrial Property Miguel Margain
* State attorneys general from Sonora, Baja California, Chihuahua, Campeche, Distrito Federal, Zacatecas and Jalisco
Before leading the delegation to Mexico, Attorney General Harris will:
* Meet with federal officials on Tuesday, March 18 to tour the San Ysidro Port of Entry—the busiest land border crossing in the Western Hemisphere and a hotspot for the importation of illegal narcotics.
* Release a comprehensive report on Thursday, March 20 detailing the current impact of transnational criminal organizations on California. The report will also include recommendations to address the threat of transnational crime in our state.
Details on these two events to follow via Media Advisory.
Last year, Attorney General Harris convened a meeting of western Attorneys General to propose the creation of a working group to combat transnational crime. This working group, the Attorneys General Consortium to Fight Transnational Organized Crime, is currently coordinating state-level policy leadership on civil and criminal enforcement strategies against transnational crime by creating uniform legislation that allows bringing civil forfeiture actions against traffickers and focusing on threats from specific transnational criminal organizations (TCOs). The group is also coordinating regular data and intelligence-sharing on TCO activity that includes the creation of an inventory of the work that state offices are doing and identifying areas where mutual assistance could strengthen investigations.
In 2012, Attorney General Harris and then-Mexico Attorney General Marisela Morales Ibáñez signed an accord agreeing to expand prosecutions and secure convictions of criminals who engage in human trafficking. The agreement also included an increase in coordination of law enforcement resources targeting transnational gangs across the California-Mexico border.
In 2012, Attorney General Harris also released a report, The State of Human Trafficking in California, at a symposium also attended by then-Mexico Attorney General Marisela Morales Ibáñez. The report outlined the growing prevalence of the crime of human trafficking in California, the increasing involvement of sophisticated transnational gangs in perpetrating the crime, and the modern technologies that traffickers use to facilitate it. That report is available here: http://www.oag.ca.gov/human-trafficking/2012.
Jim Oge Jr says:
Monday, Mar 17, 2014 at
Close the border problem solved.
Neil Somethingotherthan says:
She needs to stay over there.


text:
Special Rate Variation Approval
Council has been advised by the Independent Pricing and Regulatory Tribunal (IPART) that its Special Rate Variation Application has been approved.
During extensive community consultation, residents have told us which assets were the most important to them.
A $82 million works program has been prepared which will include borrowing costs as well as:
$ 24 million on improving sealed roads
$ 16.5 million on sealing gravel roads
$ 13 million on revitalising town centres and public spaces
$ 7 million in upgrading community buildings
$ 9 million on enhancing parks, river foreshores and sport and recreational facilities
$ 4 million on building new pathways.
Including the Special Rate Variation, there will be an average increase in rates of $107 in the first year. Over the next two years, 2019-2020, and 2020-2021, there will be a rate increase each year.
Details on the IPART decision can be found here https://www.ipart.nsw.gov.au/Home/Industries/Local-Government/Reviews/Special-Variations-Minimum-Rates/Special-Variations-Minimum-Rates-2018-19?qDh=2&cid=14bd1e97-a301-4445-ab48-96ca5c8fe5e1
To work out the increase to your rates due to the Special Rate Variation follow this link to our online rates calculator http://www.hawkesbury.nsw.gov.au/council/business-with-council/rates/rates-calculator
Alternatively use the table below as a guide to the increase to rates
To see the works planned in the Hawkesbury during 2018-2019, please visit https://www.yourhawkesbury-yoursay.com.au/27535/documents/77608
To see Council's hardship policy, please visit the Rates Section of Council's webpage at http://www.hawkesbury.nsw.gov.au/council/business-with-council/rates
IPART Determination Document (489 KB) (pdf)
Special Rate Variation - Works Program 2018/2019 (1.23 MB) (pdf)
Special Rate Variation - Frequently Asked Questions (1.11 MB) (pdf)
Special Rate Variation - The Real Facts (26.3 MB) (pdf)
Which District Do I Live In? (238 KB) (pdf)
Investing in Your Future Information Document (452 KB) (pdf)
Works Plan - Central District (5.32 MB) (pdf)
Works Plan - Northern District (9.17 MB) (pdf)
Works Plan - South Eastern District (8.05 MB) (pdf)
Works Plan - Western District (7.15 MB) (pdf)