text:
Andrew Weatherall: lone swordsman who cut new shapes for British music
Alexis Petridis
Photograph: Wayne Fox/Rex/Shutterstock
There was a point, quite early on in Andrew Weatherall's career, when vast commercial success appeared to beckon him. Already an acclaimed DJ and remixer, his production work on Primal Scream's 1991 album Screamadelica had helped turn a middling indie act whose career had given every appearance of being in its terminal phase, into an award-winning, multi-million selling band suddenly at the cutting edge, the epitome of the fruitful interface between rock music and the post-acid house dance scene.
Related: Andrew Weatherall, British producer behind Screamadelica, dies aged 56
Others had worked on the album, including the Orb, and veteran Rolling Stones producer Jimmy Miller, but it was Weatherall who had spotted Primal Scream's potential to be something more than they were (he had penned an enthusiastic review of the band for the NME under the pseudonym Audrey Witherspoon), turned an overlooked 1989 album track called I'm Losing More Than I'll Ever Had into Loaded, and propelled the band to Top of the Pops. There were moments when Screamadelica sounded more like his creation than the band's. If he could do this for Primal Scream, went the not-unreasonable thinking, what other remarkable transformations could he pull off?
But record labels tended to balk when they discovered Weatherall's working methods. He expected bands to record something, then just leave him to do what he wanted. It was an approach that had paid dividends on Screamadelica, but as he laughingly protested, most musicians "want their record to sound how they want". Besides, Weatherall wasn't interested: "a career in any business looks quite tiresome and vexing and like it might involve me having meetings with people I don't want to have meetings with … call me unambitious, but I was fine as I was," he reasoned, years later.
Andrew Weatherall DJing in 1994. Photograph: Mick Hutson/Getty Images
Instead, he ventured off down a fascinating, serpentine and entirely uncompromising artistic path, conducted under an often baffling array of aliases, that took in everything from techno to rockabilly to a stint as Faber's artist in residence. He self-deprecatingly called it all "a series of beautiful, totally futile gestures", but others begged to differ. His unbending idiosyncrasy earned him the nickname "The Guv'nor"; in recent years, he commanded such a degree of respect that he could curate his own annual festival in Carcassonne, France: it invariably sold out, despite the fact that Weatherall reliably populated it entirely with obscure underground artists.
By his own account, Weatherall was something of a misfit from the start. The ranks of Britain's acid house pioneers were largely made up of old soulboys, but Weatherall was a fan of dub reggae and industrial music, who'd been booked to play at seminal acid house club Shoom after its founder Danny Rampling heard him playing a Chris & Cosey track at a house party in Islington. "I went from listening to United by Throbbing Gristle to dancing in a field to Josephine by Chris Rea," he recalled of 1988's Second Summer of Love, "which gives you some idea what a powerful drug ecstasy is."
Nevertheless, he quickly became an integral part of the scene, a member of the loose collective of DJs, producers and promoters called Boy's Own. The Boy's Own fanzine, which tended to take a wry, witty view of the acid house's saucer-eyed excesses, had Weatherall's fingerprints all over it – decades later, he could be relied upon to puncture any rosy-hued remembrances of the era by noting that when Boy's Own attempted to stage an Ibiza-like foam party, they did it in a cowshed, which resulted in dancers being engulfed with foam flecked with dung – as did the lyrics of Raise, the single he co-authored for the Boy's Own label under the name Bocca Juniors. Weatherall had briefly been a member of Genesis P-Orridge's Temple Ov Psychick Youth, which presumably accounted for the quotations from Aleister Crowley.
Screamadelica, meanwhile, allowed him to indulge his musical passions on a grand scale: its centrepiece was his extraordinary reworking of their single Come Together as "a dub symphony", powered by former PiL bassist Jah Wobble. In fact, lengthy dub-inspired remixes became something of a Weatherall speciality in the early 90s, not least his reworkings of Flowered Up's Weekender and St Etienne's Only Love Can Break Your Heart: his audacious and brilliant reimagining of My Bloody Valentine's 1991 single Soon, which augmented the band's swooning guitars with a beat sampled from the Dynamic Corvettes' Funky Music Is the Thing, has been acclaimed as one of the greatest remixes of all time ("the young people seem to like it," was Weatherall's typically unassuming response to its legendary status).
His next project, Sabres of Paradise, veered between a peculiarly haunting, occasionally eerie take on techno, blissful ambience and reggae; while an acclaimed accompanying club night, Sabresonic, hosted the first live performance from the Chemical Brothers: Weatherall's support of the duo, then known as the Dust Brothers, was instrumental in getting them a record deal. Sabres of Paradise's single Smokebelch II, based on an obscure track from LB Bad's album The True Story of House Music, became a perennial chillout classic that found its way onto umpteen compilation albums and soundtracks, but Weatherall pulled the plug on the project after three albums: not for the first time, it was hard to avoid the impression that he was deliberately short-circuiting something before it became too big.
From that point on, Weatherall operated almost exclusively on the musical fringes, bemused by the fact that some of his peers had taken a more straightforward path and gone on to become superstar DJs: "I thought DJs? Heroes? Are people really that desperate? I know people need heroes, but seriously, this is ridiculous." Among a plethora of subsequent projects, he made a series of beautifully understated house records with Keith Tenniswood under the name Two Lone Swordsmen; explored mid-tempo electronica as the Asphodells; compiled an album of early 80s post-punk, Nine O'Clock Drop, that presaged a vast revival of interest in that genre; produced the second album by electronic duo Fuck Buttons to vast acclaim; and formed a drum-machine driven rockabilly band with himself as lead vocalist to widespread bafflement.
Throughout, he continued to run club nights (A Love From Outer Space insisted that no DJ play a record any faster than 122 BPM), helm a succession of independent record labels, and release remixes that displayed an unerring ability to get inside a song, retaining or even amplifying its essence no matter how much he chose to alter the original. The eclectic nature of his own music taste meant that he was as capable of doing this to a track by expansive US psych band Wooden Shjips as he was leftfield pop duo Confidence Man or a deep house artist. As a DJ, he was as at home playing a rapturously-received guest slot at London's Horse Meat Disco as he was playing what he colourfully termed "absolutely full-knacker, proper panel-beaters-from-Prague-'ere-we-go techno".
He stayed light on his feet, constantly shifting and changing his approach, never losing an innate curiosity that stretched beyond music into history and literature and visual art, which he thought stemmed from being expelled from school as a teenager: he'd had to teach himself and evidently enjoyed the experience. But his greatest talent was in balancing his diversity with a certain kind of predictability: you never knew quite what Andrew Weatherall was going to do next, but you knew it would be good.
Stacey Solomon lands DIY rescue show as Reese Witherspoon's first UK production
The TV favourite has been snapped up by a Hollywood star.
Dartmoor Authority to appeal against High Court ruling on wild camping
The Dartmoor National Park Authority will also endorse a new permissive system in which landowners grant permission to allow the public to wild camp.


On behalf of Law Offices of Catherine Cardozo, LLC on Friday, April 5, 2019.
When you have a child with someone who comes from another nation and the relationship between you comes to an end, you may have concerns about this person potentially trying to relocate back to his or her home country with your child. Relocating when you have a child with someone else is typically not as easy as it may sound, and in some cases, this can lead parents to simply take a child out of the country without the permission of the other parent.
Many people in your shoes find that one of the most effective preventative measures they can take to prevent international child abduction is to obtain a court order that either prohibits travel or prevents your child from obtaining a passport. In the event that your child has dual citizenship in both the United States and the home nation of his or her other parent, you may want to contact the foreign consulate in that nation, too. Why? In some cases, your child may be able to get a passport through this other country, so you would be wise to cover all your bases.
You may also be able to reduce the chances of your ex taking your child back to his or her home country without your authorization by informing local authorities about your concerns. When doing so, be sure to produce any court orders or custody decrees you have in place preventing such actions. You may, too, want to make sure staff members at your child's school, daycare or what have you are also aware of your concerns.
By taking these steps, you can effectively make it that much more difficult for your former partner to take your child out of the country without your permission.


text:
Trailers and Pictures
BIG HERO 6 – First Trailer and Poster
Royston Loh
Set in a futuristic world, Big Hero 6 centres on a young robotics prodigy who builds his own high-tech superheroes to save his hometown of San Fransokyo.
Directed by Don Hall and Chris Williams, the voice cast includes T.J. Miller, Maya Rudolph, and Jamie Chung.
Here's the trailer.
"Big Hero 6″ is a heartfelt comedy adventure about robotics prodigy Hiro Hamada, who learns to harness his genius—thanks to his brilliant brother Tadashi and their like-minded friends: adrenaline junkie Go Go Tamago, clean freak Wasabi No-Ginger, chemistry whiz Honey Lemon and fanboy Fred. When a devastating turn of events catapults them into the midst of a dangerous plot unfolding in the streets of San Fransokyo, Hiro turns to his closest companion—a cutting-edge robot named Baymax—and transforms the group into a band of high-tech heroes determined to solve the mystery. Inspired by the Marvel comics of the same name, and featuring comic-book style action and all the heart and humor audiences expect from Walt Disney Animation Studios, "Big Hero 6″ is directed by Don Hall ("Winnie the Pooh") and Chris Williams ("Bolt"), and produced by Roy Conli ("Tangled"). The film hits theaters in 3D on November 7, 2014.
Big Hero 6 opens here on 6 November 2014.
Previous article'X-Men: Days Of Future Past' – Interview with Fan Bing Bing
Next articleX-Men: Days of Future Past is #1 Worldwide & in Singapore
Aladdin (2019) – Review
Ralph Breaks The Internet (2018) – Review

redpajama_set_name: RedPajamaCommonCrawl


Chris Townsend is a prolific outdoor writer and photographer with a passion for wilderness and mountains, and a penchant for long distance hikes. A four-time winner of Outdoor Writers' Guild Awards, he is the author of seventeen books, most illustrated with his own photographs, and he has co-authored and contributed to several more.
When Chris Townsend headed to the Pacific Northwest Trail, in the USA, in the summer of 2010, he had ViewRanger in hand loaded with USA mapping.
You can read the story of his PNT adventure in his new book "Grizzly Bears and Razor Clams" which has been published to excellent reviews.


text:
/**
 * Rooms
 * Pokemon Showdown - http://pokemonshowdown.com/
 *
 * Every chat room and battle is a room, and what they do is done in
 * rooms.js. There's also a global room which every user is in, and
 * handles miscellaneous things like welcoming the user.
 *
 * @license MIT license
 */

'use strict';

const TIMEOUT_EMPTY_DEALLOCATE = 10 * 60 * 1000;
const TIMEOUT_INACTIVE_DEALLOCATE = 40 * 60 * 1000;
const REPORT_USER_STATS_INTERVAL = 10 * 60 * 1000;

const CRASH_REPORT_THROTTLE = 60 * 60 * 1000;

const FS = require('./fs');

let Rooms = module.exports = getRoom;

Rooms.rooms = new Map();
Rooms.aliases = new Map();

/*********************************************************
 * the Room object.
 *********************************************************/

class Room {
	constructor(roomid, title) {
		this.id = roomid;
		this.title = (title || roomid);
		this.reportJoins = Config.reportjoins;

		this.users = Object.create(null);

		this.log = [];

		this.muteQueue = [];
		this.muteTimer = null;

		this.type = 'chat';
		this.lastUpdate = 0;
		this.userCount = 0;
	}

	send(message, errorArgument) {
		if (errorArgument) throw new Error("Use Room#sendUser");
		if (this.id !== 'lobby') message = '>' + this.id + '\n' + message;
		if (this.userCount) Sockets.channelBroadcast(this.id, message);
	}
	sendAuth(message) {
		for (let i in this.users) {
			let user = this.users[i];
			if (user.connected && user.can('receiveauthmessages', null, this)) {
				user.sendTo(this, message);
			}
		}
	}
	sendUser(user, message) {
		user.sendTo(this, message);
	}
	add(message) {
		if (typeof message !== 'string') throw new Error("Deprecated message type");
		if (message.startsWith('|uhtmlchange|')) return this.uhtmlchange(message);
		this.logEntry(message);
		if (this.logTimes && message.substr(0, 3) === '|c|') {
			message = '|c:|' + (~~(Date.now() / 1000)) + '|' + message.substr(3);
		}
		this.log.push(message);
		return this;
	}
	uhtmlchange(message) {
		let thirdPipe = message.indexOf('|', 13);
		let originalStart = '|uhtml|' + message.slice(13, thirdPipe + 1);
		for (let i = 0; i < this.log.length; i++) {
			if (this.log[i].startsWith(originalStart)) {
				this.log[i] = originalStart + message.slice(thirdPipe + 1);
				break;
			}
		}
		this.send(message);
		return this;
	}
	logEntry() {}
	addRaw(message) {
		return this.add('|raw|' + message);
	}
	addLogMessage(user, text) {
		return this.add('|c|' + user.getIdentity(this) + '|/log ' + text).update();
	}
	getLogSlice(amount) {
		let log = this.log.slice(amount);
		log.unshift('|:|' + (~~(Date.now() / 1000)));
		return log;
	}

	toString() {
		return this.id;
	}

	//mute handling
	runMuteTimer(forceReschedule) {
		if (forceReschedule && this.muteTimer) {
			clearTimeout(this.muteTimer);
			this.muteTimer = null;
		}
		if (this.muteTimer || this.muteQueue.length === 0) return;

		let timeUntilExpire = this.muteQueue[0].time - Date.now();
		if (timeUntilExpire <= 1000) { // one second of leeway
			this.unmute(this.muteQueue[0].userid, "Your mute in '" + this.title + "' has expired.");
			//runMuteTimer() is called again in unmute() so this function instance should be closed
			return;
		}
		this.muteTimer = setTimeout(() => {
			this.muteTimer = null;
			this.runMuteTimer(true);
		}, timeUntilExpire);
	}
	isMuted(user) {
		if (!user) return;
		if (this.muteQueue) {
			for (let i = 0; i < this.muteQueue.length; i++) {
				let entry = this.muteQueue[i];
				if (user.userid === entry.userid ||
					user.guestNum === entry.guestNum ||
					(user.autoconfirmed && user.autoconfirmed === entry.autoconfirmed)) {
					return entry.userid;
				}
			}
		}
	}
	getMuteTime(user) {
		let userid = this.isMuted(user);
		if (!userid) return;
		for (let i = 0; i < this.muteQueue.length; i++) {
			if (userid === this.muteQueue[i].userid) {
				return this.muteQueue[i].time - Date.now();
			}
		}
	}
	getAuth(user) {
		if (this.auth) {
			if (user.userid in this.auth) {
				return this.auth[user.userid];
			}
			if (this.tour && this.tour.room) {
				return this.tour.room.getAuth(user);
			}
			if (this.isPrivate === true) {
				return ' ';
			}
		}
		return user.group;
	}
	checkModjoin(user) {
		if (this.staffRoom && !user.isStaff && (!this.auth || (this.auth[user.userid] || ' ') === ' ')) return false;
		if (user.userid in this.users) return true;
		if (!this.modjoin) return true;
		const userGroup = user.can('makeroom') ? user.group : this.getAuth(user);

		let modjoinGroup = this.modjoin !== true ? this.modjoin : this.modchat;
		if (!modjoinGroup) return true;

		if (modjoinGroup === 'trusted') {
			if (user.trusted) return true;
			modjoinGroup = Config.groupsranking[1];
		}
		if (modjoinGroup === 'autoconfirmed') {
			if (user.autoconfirmed) return true;
			modjoinGroup = Config.groupsranking[1];
		}
		if (!(userGroup in Config.groups)) return false;
		if (!(modjoinGroup in Config.groups)) throw new Error(`Invalid modjoin setting in ${this.id}: ${modjoinGroup}`);
		return Config.groups[userGroup].rank >= Config.groups[modjoinGroup].rank;
	}
	mute(user, setTime) {
		let userid = user.userid;

		if (!setTime) setTime = 7 * 60000; // default time: 7 minutes
		if (setTime > 90 * 60000) setTime = 90 * 60000; // limit 90 minutes

		// If the user is already muted, the existing queue position for them should be removed
		if (this.isMuted(user)) this.unmute(userid);

		// Place the user in a queue for the unmute timer
		for (let i = 0; i <= this.muteQueue.length; i++) {
			let time = Date.now() + setTime;
			if (i === this.muteQueue.length || time < this.muteQueue[i].time) {
				let entry = {
					userid: userid,
					time: time,
					guestNum: user.guestNum,
					autoconfirmed: user.autoconfirmed,
				};
				this.muteQueue.splice(i, 0, entry);
				// The timer needs to be switched to the new entry if it is to be unmuted
				// before the entry the timer is currently running for
				if (i === 0 && this.muteTimer) {
					clearTimeout(this.muteTimer);
					this.muteTimer = null;
				}
				break;
			}
		}
		this.runMuteTimer();

		user.updateIdentity(this.id);

		if (!(this.isPrivate === true || this.isPersonal || this.battle)) Punishments.monitorRoomPunishments(user);

		return userid;
	}
	unmute(userid, notifyText) {
		let successUserid = false;
		let user = Users.get(userid);
		if (!user) {
			// If the user is not found, construct a dummy user object for them.
			user = {
				userid: userid,
				autoconfirmed: userid,
			};
		}

		for (let i = 0; i < this.muteQueue.length; i++) {
			let entry = this.muteQueue[i];
			if (entry.userid === user.userid ||
				entry.guestNum === user.guestNum ||
				(user.autoconfirmed && entry.autoconfirmed === user.autoconfirmed)) {
				if (i === 0) {
					this.muteQueue.splice(0, 1);
					this.runMuteTimer(true);
				} else {
					this.muteQueue.splice(i, 1);
				}
				successUserid = entry.userid;
				break;
			}
		}

		if (successUserid && user.userid in this.users) {
			user.updateIdentity(this.id);
			if (notifyText) user.popup(notifyText);
		}
		return successUserid;
	}
	modlog(text) {
		if (!this.modlogStream) return;
		this.modlogStream.write('[' + (new Date().toJSON()) + '] (' + this.id + ') ' + text + '\n');
	}
	sendModCommand(data) {
		for (let i in this.users) {
			let user = this.users[i];
			// hardcoded for performance reasons (this is an inner loop)
			if (user.isStaff || (this.auth && (this.auth[user.userid] || '+') !== '+')) {
				user.sendTo(this, data);
			}
		}
	}
}

class GlobalRoom {
	constructor(roomid) {
		this.id = roomid;

		this.type = 'global';

		// init battle rooms
		this.battleCount = 0;

		this.chatRoomData = [];
		try {
			this.chatRoomData = require('./config/chatrooms.json');
			if (!Array.isArray(this.chatRoomData)) this.chatRoomData = [];
		} catch (e) {} // file doesn't exist [yet]

		if (!this.chatRoomData.length) {
			this.chatRoomData = [{
				title: 'Lobby',
				isOfficial: true,
				autojoin: true,
			}, {
				title: 'Staff',
				isPrivate: true,
				staffRoom: true,
				staffAutojoin: true,
			}];
		}

		this.chatRooms = [];

		this.autojoin = []; // rooms that users autojoin upon connecting
		this.staffAutojoin = []; // rooms that staff autojoin upon connecting
		for (let i = 0; i < this.chatRoomData.length; i++) {
			if (!this.chatRoomData[i] || !this.chatRoomData[i].title) {
				console.log('ERROR: Room number ' + i + ' has no data.');
				continue;
			}
			let id = toId(this.chatRoomData[i].title);
			if (!Config.quietconsole) console.log("NEW CHATROOM: " + id);
			let room = Rooms.createChatRoom(id, this.chatRoomData[i].title, this.chatRoomData[i]);
			if (room.aliases) {
				for (let a = 0; a < room.aliases.length; a++) {
					Rooms.aliases.set(room.aliases[a], id);
				}
			}
			this.chatRooms.push(room);
			if (room.autojoin) this.autojoin.push(id);
			if (room.staffAutojoin) this.staffAutojoin.push(id);
		}
		Rooms.lobby = Rooms.rooms.get('lobby');

		// init battle room logging
		if (Config.logladderip) {
			this.ladderIpLog = FS('logs/ladderip/ladderip.txt').createAppendStream();
		} else {
			// Prevent there from being two possible hidden classes an instance
			// of GlobalRoom can have.
			this.ladderIpLog = new (require('stream')).Writable();
		}

		let lastBattle;
		try {
			lastBattle = FS('logs/lastbattle.txt').readSync('utf8');
		} catch (e) {}
		this.lastBattle = (!lastBattle || isNaN(lastBattle)) ? 0 : +lastBattle;

		this.writeChatRoomData = (() => {
			let writing = false;
			let writePending = false;
			return async () => {
				if (writing) {
					writePending = true;
					return;
				}
				writing = true;

				let data = JSON.stringify(this.chatRoomData)
					.replace(/\{"title":/g, '\n{"title":')
					.replace(/\]$/, '\n]');

				await FS('config/chatrooms.json.0').write(data);
				data = null;
				await FS('config/chatrooms.json.0').rename('config/chatrooms.json');
				writing = false;
				if (writePending) {
					writePending = false;
					setImmediate(() => this.writeChatRoomData());
				}
			};
		})();
		if (Config.nofswriting) this.writeChatRoomData = () => {};

		this.writeNumRooms = (() => {
			let writing = false;
			let lastBattle = -1; // last lastBattle to be written to file
			return async () => {
				if (writing) return;

				// batch writing lastbattle.txt for every 10 battles
				if (lastBattle >= this.lastBattle) return;
				lastBattle = this.lastBattle + 10;

				let filename = 'logs/lastbattle.txt';
				writing = true;
				await FS(`${filename}.0`).write('' + lastBattle);
				await FS(`${filename}.0`).rename(filename);
				writing = false;
				filename = null;
				if (lastBattle < this.lastBattle) {
					setImmediate(() => this.writeNumRooms());
				}
			};
		})();
		if (Config.nofswriting) this.writeNumRooms = () => {};

		// init users
		this.users = Object.create(null);
		this.userCount = 0; // cache of `size(this.users)`
		this.maxUsers = 0;
		this.maxUsersDate = 0;

		this.reportUserStatsInterval = setInterval(
			() => this.reportUserStats(),
			REPORT_USER_STATS_INTERVAL
		);

		// Create writestream for modlog
		this.modlogStream = FS('logs/modlog/modlog_global.txt').createAppendStream();
	}

	reportUserStats() {
		if (this.maxUsersDate) {
			LoginServer.request('updateuserstats', {
				date: this.maxUsersDate,
				users: this.maxUsers,
			}, () => {});
			this.maxUsersDate = 0;
		}
		LoginServer.request('updateuserstats', {
			date: Date.now(),
			users: this.userCount,
		}, () => {});
	}

	get formatListText() {
		if (this.formatList) {
			return this.formatList;
		}
		this.formatList = '|formats' + (Ladders.formatsListPrefix || '');
		let section = '', prevSection = '';
		let curColumn = 1;
		for (let i in Dex.formats) {
			let format = Dex.formats[i];
			if (format.section) section = format.section;
			if (format.column) curColumn = format.column;
			if (!format.name) continue;
			if (!format.challengeShow && !format.searchShow && !format.tournamentShow) continue;

			if (section !== prevSection) {
				prevSection = section;
				this.formatList += '|,' + curColumn + '|' + section;
			}
			this.formatList += '|' + format.name;
			let displayCode = 0;
			if (format.team) displayCode |= 1;
			if (format.searchShow) displayCode |= 2;
			if (format.challengeShow) displayCode |= 4;
			if (format.tournamentShow) displayCode |= 8;
			const level = format.maxLevel || format.maxForcedLevel || format.forcedLevel;
			if (level === 50) displayCode |= 16;
			this.formatList += ',' + displayCode.toString(16);
		}
		return this.formatList;
	}
	get configRankList() {
		if (Config.nocustomgrouplist) return '';

		// putting the resultant object in Config would enable this to be run again should config.js be reloaded.
		if (Config.rankList) {
			return Config.rankList;
		}
		let rankList = [];

		for (let rank in Config.groups) {
			if (!Config.groups[rank] || !rank) continue;

			let tarGroup = Config.groups[rank];
			let groupType = tarGroup.addhtml || (!tarGroup.mute && !tarGroup.root) ? 'normal' : (tarGroup.root || tarGroup.declare) ? 'leadership' : 'staff';

			rankList.push({symbol: rank, name: (Config.groups[rank].name || null), type: groupType}); // send the first character in the rank, incase they put a string several characters long
		}

		const typeOrder = ['punishment', 'normal', 'staff', 'leadership'];

		rankList = rankList.sort((a, b) => typeOrder.indexOf(b.type) - typeOrder.indexOf(a.type));

		// add the punishment types at the very end.
		for (let rank in Config.punishgroups) {
			rankList.push({symbol: Config.punishgroups[rank].symbol, name: Config.punishgroups[rank].name, type: 'punishment'});
		}

		Config.rankList = '|customgroups|' + JSON.stringify(rankList) + '\n';
		return Config.rankList;
	}

	getRoomList(filter) {
		let rooms = [];
		let skipCount = 0;
		let [formatFilter, eloFilter] = filter.split(',');
		if (this.battleCount > 150 && !formatFilter && !eloFilter) {
			skipCount = this.battleCount - 150;
		}
		Rooms.rooms.forEach(room => {
			if (!room || !room.active || room.isPrivate) return;
			if (formatFilter && formatFilter !== room.format) return;
			if (eloFilter && (!room.rated || room.rated < eloFilter)) return;
			if (skipCount && skipCount--) return;

			rooms.push(room);
		});

		let roomTable = {};
		for (let i = rooms.length - 1; i >= rooms.length - 100 && i >= 0; i--) {
			let room = rooms[i];
			let roomData = {};
			if (room.active && room.battle) {
				if (room.battle.p1) roomData.p1 = room.battle.p1.name;
				if (room.battle.p2) roomData.p2 = room.battle.p2.name;
				if (room.tour) roomData.minElo = 'tour';
				if (room.rated) roomData.minElo = Math.floor(room.rated);
			}
			if (!roomData.p1 || !roomData.p2) continue;
			roomTable[room.id] = roomData;
		}
		return roomTable;
	}
	getRooms(user) {
		let roomsData = {official:[], chat:[], userCount: this.userCount, battleCount: this.battleCount};
		for (let i = 0; i < this.chatRooms.length; i++) {
			let room = this.chatRooms[i];
			if (!room) continue;
			if (room.isPrivate && !(room.isPrivate === 'voice' && user.group !== ' ')) continue;
			(room.isOfficial ? roomsData.official : roomsData.chat).push({
				title: room.title,
				desc: room.desc,
				userCount: room.userCount,
			});
		}
		return roomsData;
	}
	checkModjoin() {
		return true;
	}
	update() {}
	isMuted() {
		return false;
	}
	send(message, user) {
		if (user) {
			user.sendTo(this, message);
		} else if (this.userCount) {
			Sockets.channelBroadcast(this.id, message);
		}
	}
	sendAuth(message) {
		for (let i in this.users) {
			let user = this.users[i];
			if (user.connected && user.can('receiveauthmessages', null, this)) {
				user.sendTo(this, message);
			}
		}
	}
	add(message) {
		if (Rooms.lobby) return Rooms.lobby.add(message);
		return this;
	}
	addRaw(message) {
		if (Rooms.lobby) return Rooms.lobby.addRaw(message);
		return this;
	}
	addChatRoom(title) {
		let id = toId(title);
		if (id === 'battles' || id === 'rooms' || id === 'ladder' || id === 'teambuilder' || id === 'home' || id === 'all' || id === 'public') return false;
		if (Rooms.rooms.has(id)) return false;

		let chatRoomData = {
			title: title,
		};
		let room = Rooms.createChatRoom(id, title, chatRoomData);
		this.chatRoomData.push(chatRoomData);
		this.chatRooms.push(room);
		this.writeChatRoomData();
		return true;
	}

	prepBattleRoom(format) {
		//console.log('BATTLE START BETWEEN: ' + p1.userid + ' ' + p2.userid);
		let roomPrefix = `battle-${toId(Dex.getFormat(format).name)}-`;
		let battleNum = this.lastBattle;
		let roomid;
		do {
			roomid = `${roomPrefix}${++battleNum}`;
		} while (Rooms.rooms.has(roomid));

		this.lastBattle = battleNum;
		this.writeNumRooms();
		return roomid;
	}

	onCreateBattleRoom(p1, p2, room, options) {
		if (Config.reportbattles) {
			let reportRoom = Rooms(Config.reportbattles === true ? 'lobby' : Config.reportbattles);
			if (reportRoom) {
				reportRoom
					.add(`|b|${room.id}|${p1.getIdentity()}|${p2.getIdentity()}`)
					.update();
			}
		}
		if (Config.logladderip && options.rated) {
			this.ladderIpLog.write(
				`${p1.userid}: ${p1.latestIp}\n` +
				`${p2.userid}: ${p2.latestIp}\n`
			);
		}
	}

	deregisterChatRoom(id) {
		id = toId(id);
		let room = Rooms(id);
		if (!room) return false; // room doesn't exist
		if (!room.chatRoomData) return false; // room isn't registered
		// deregister from global chatRoomData
		// looping from the end is a pretty trivial optimization, but the
		// assumption is that more recently added rooms are more likely to
		// be deleted
		for (let i = this.chatRoomData.length - 1; i >= 0; i--) {
			if (id === toId(this.chatRoomData[i].title)) {
				this.chatRoomData.splice(i, 1);
				this.writeChatRoomData();
				break;
			}
		}
		delete room.chatRoomData;
		return true;
	}
	delistChatRoom(id) {
		id = toId(id);
		if (!Rooms.rooms.has(id)) return false; // room doesn't exist
		for (let i = this.chatRooms.length - 1; i >= 0; i--) {
			if (id === this.chatRooms[i].id) {
				this.chatRooms.splice(i, 1);
				break;
			}
		}
	}
	removeChatRoom(id) {
		id = toId(id);
		let room = Rooms(id);
		if (!room) return false; // room doesn't exist
		room.destroy();
		return true;
	}
	autojoinRooms(user, connection) {
		// we only autojoin regular rooms if the client requests it with /autojoin
		// note that this restriction doesn't apply to staffAutojoin
		let includesLobby = false;
		for (let i = 0; i < this.autojoin.length; i++) {
			user.joinRoom(this.autojoin[i], connection);
			if (this.autojoin[i] === 'lobby') includesLobby = true;
		}
		if (!includesLobby && Config.serverid !== 'showdown') user.send(`>lobby\n|deinit`);
	}
	checkAutojoin(user, connection) {
		if (!user.named) return;
		for (let i = 0; i < this.staffAutojoin.length; i++) {
			let room = Rooms(this.staffAutojoin[i]);
			if (!room) {
				this.staffAutojoin.splice(i, 1);
				i--;
				continue;
			}
			if (room.staffAutojoin === true && user.isStaff ||
					typeof room.staffAutojoin === 'string' && room.staffAutojoin.includes(user.group) ||
					room.auth && user.userid in room.auth) {
				// if staffAutojoin is true: autojoin if isStaff
				// if staffAutojoin is String: autojoin if user.group in staffAutojoin
				// if staffAutojoin is anything truthy: autojoin if user has any roomauth
				user.joinRoom(room.id, connection);
			}
		}
		for (let i = 0; i < user.connections.length; i++) {
			connection = user.connections[i];
			if (connection.autojoins) {
				let autojoins = connection.autojoins.split(',');
				for (let j = 0; j < autojoins.length; j++) {
					user.tryJoinRoom(autojoins[j], connection);
				}
				connection.autojoins = '';
			}
		}
	}
	onConnect(user, connection) {
		let initdata = '|updateuser|' + user.name + '|' + (user.named ? '1' : '0') + '|' + user.avatar + '\n';
		connection.send(initdata + this.configRankList + this.formatListText);
		if (this.chatRooms.length > 2) connection.send('|queryresponse|rooms|null'); // should display room list
	}
	onJoin(user, connection) {
		if (!user) return false; // ???
		if (this.users[user.userid]) return user;

		this.users[user.userid] = user;
		if (++this.userCount > this.maxUsers) {
			this.maxUsers = this.userCount;
			this.maxUsersDate = Date.now();
		}

		return user;
	}
	onRename(user, oldid, joining) {
		delete this.users[oldid];
		this.users[user.userid] = user;
		return user;
	}
	onUpdateIdentity() {}
	onLeave(user) {
		if (!user) return; // ...
		delete this.users[user.userid];
		--this.userCount;
	}
	modlog(text) {
		this.modlogStream.write('[' + (new Date().toJSON()) + '] ' + text + '\n');
	}
	startLockdown(err, slow) {
		if (this.lockdown && err) return;
		let devRoom = Rooms('development');
		const stack = (err ? Chat.escapeHTML(err.stack).split(`\n`).slice(0, 2).join(`<br />`) : ``);
		Rooms.rooms.forEach((curRoom, id) => {
			if (id === 'global') return;
			if (err) {
				if (id === 'staff' || id === 'development' || (!devRoom && id === 'lobby')) {
					curRoom.addRaw(`<div class="broadcast-red"><b>The server needs to restart because of a crash:</b> ${stack}<br />Please restart the server.</div>`);
					curRoom.addRaw(`<div class="broadcast-red">You will not be able to start new battles until the server restarts.</div>`);
					curRoom.update();
				} else {
					curRoom.addRaw(`<div class="broadcast-red"><b>The server needs restart because of a crash.</b><br />No new battles can be started until the server is done restarting.</div>`).update();
				}
			} else {
				curRoom.addRaw(`<div class="broadcast-red"><b>The server is restarting soon.</b><br />Please finish your battles quickly. No new battles can be started until the server resets in a few minutes.</div>`).update();
			}
			const game = curRoom.game;
			if (!slow && game && game.timer && typeof game.timer.start === 'function' && !game.ended) {
				game.timer.start();
				if (curRoom.modchat !== '+') {
					curRoom.modchat = '+';
					curRoom.addRaw(`<div class="broadcast-red"><b>Moderated chat was set to +!</b><br />Only users of rank + and higher can talk.</div>`).update();
				}
			}
		});
		Users.users.forEach(u => {
			u.send(`|pm|~|${u.group}${u.name}|/raw <div class="broadcast-red"><b>The server is restarting soon.</b><br />Please finish your battles quickly. No new battles can be started until the server resets in a few minutes.</div>`);
		});

		this.lockdown = true;
		this.lastReportedCrash = Date.now();
	}
	automaticKillRequest() {
		const notifyPlaces = ['development', 'staff', 'upperstaff'];
		if (Config.autolockdown === undefined) Config.autolockdown = true; // on by default

		if (Config.autolockdown && Rooms.global.lockdown === true && Rooms.global.battleCount === 0) {
			// The server is in lockdown, the final battle has finished, and the option is set
			// so we will now automatically kill the server here if it is not updating.
			if (Chat.updateServerLock) {
				this.notifyRooms(notifyPlaces, `|html|<div class="broadcast-red"><b>Automatic server lockdown kill canceled.</b><br /><br />The server tried to automatically kill itself upon the final battle finishing, but the server was updating while trying to kill itself.</div>`);
				return;
			}

			Sockets.workers.forEach(worker => worker.kill());

			// final warning
			this.notifyRooms(notifyPlaces, `|html|<div class="broadcast-red"><b>The server is about to automatically kill itself in 10 seconds.</b></div>`);

			// kill server in 10 seconds if it's still set to
			setTimeout(() => {
				if (Config.autolockdown && Rooms.global.lockdown === true) {
					// finally kill the server
					process.exit();
				} else {
					this.notifyRooms(notifyPlaces, `|html|<div class="broadcsat-red"><b>Automatic server lockdown kill canceled.</b><br /><br />In the last final seconds, the automatic lockdown was manually disabled.</div>`);
				}
			}, 10 * 1000);
		}
	}
	notifyRooms(rooms, message) {
		if (!rooms || !message) return;
		for (let roomid of rooms) {
			let curRoom = Rooms(roomid);
			if (curRoom) curRoom.add(message).update();
		}
	}
	reportCrash(err) {
		if (this.lockdown) return;
		const time = Date.now();
		if (time - this.lastReportedCrash < CRASH_REPORT_THROTTLE) {
			return;
		}
		this.lastReportedCrash = time;
		const stack = (err ? Chat.escapeHTML(err.stack).split(`\n`).slice(0, 2).join(`<br />`) : ``);
		const crashMessage = `|html|<div class="broadcast-red"><b>The server has crashed:</b> ${stack}</div>`;
		const devRoom = Rooms('development');
		if (devRoom) {
			devRoom.add(crashMessage).update();
		} else {
			if (Rooms.lobby) Rooms.lobby.add(crashMessage).update();
			const staffRoom = Rooms('staff');
			if (staffRoom) staffRoom.add(crashMessage).update();
		}
	}
}

class BattleRoom extends Room {
	constructor(roomid, format, p1, p2, options) {
		super(roomid, "" + p1.name + " vs. " + p2.name);
		this.modchat = (Config.battlemodchat || false);
		this.modjoin = false;
		this.slowchat = false;
		this.filterStretching = false;
		this.filterCaps = false;
		this.reportJoins = Config.reportbattlejoins;

		this.type = 'battle';

		this.resetUser = '';
		this.modchatUser = '';
		this.expireTimer = null;
		this.active = false;

		format = '' + (format || '');

		this.format = format;
		this.auth = Object.create(null);
		//console.log("NEW BATTLE");

		let formatid = toId(format);

		// Sometimes we might allow BattleRooms to have no options
		if (!options) {
			options = {};
		}

		let rated;
		if (options.rated && Dex.getFormat(formatid).rated !== false) {
			rated = options.rated;
		} else {
			rated = false;
		}

		if (options.tour) {
			this.tour = options.tour;
		} else {
			this.tour = false;
		}

		this.p1 = p1 || null;
		this.p2 = p2 || null;

		this.rated = rated;
		this.battle = new Rooms.RoomBattle(this, format, rated);
		this.game = this.battle;

		this.sideTicksLeft = [21, 21];
		if (!rated && !this.tour) this.sideTicksLeft = [28, 28];
		this.sideTurnTicks = [0, 0];
		this.disconnectTickDiff = [0, 0];

		if (Config.forcetimer) this.battle.timer.start();

		this.modlogStream = Rooms.battleModlogStream;
	}
	push(message) {
		if (typeof message === 'string') {
			this.log.push(message);
		} else {
			this.log = this.log.concat(message);
		}
	}
	win(winner) {
		// Declare variables here in case we need them for non-rated battles logging.
		let p1score = 0.5;
		let winnerid = toId(winner);

		// Check if the battle was rated to update the ladder, return its response, and log the battle.
		if (this.rated) {
			this.rated = false;
			let p1 = this.battle.p1;
			let p2 = this.battle.p2;

			if (winnerid === p1.userid) {
				p1score = 1;
			} else if (winnerid === p2.userid) {
				p1score = 0;
			}

			let p1name = p1.name;
			let p2name = p2.name;

			//update.updates.push('[DEBUG] uri: ' + Config.loginserver + 'action.php?act=ladderupdate&serverid=' + Config.serverid + '&p1=' + encodeURIComponent(p1) + '&p2=' + encodeURIComponent(p2) + '&score=' + p1score + '&format=' + toId(rated.format) + '&servertoken=[token]');

			winner = Users.get(winnerid);
			if (winner && !winner.registered) {
				this.sendUser(winner, '|askreg|' + winner.userid);
			}
			// update rankings
			Ladders(this.battle.format).updateRating(p1name, p2name, p1score, this);
		} else if (Config.logchallenges) {
			// Log challenges if the challenge logging config is enabled.
			if (winnerid === this.p1.userid) {
				p1score = 1;
			} else if (winnerid === this.p2.userid) {
				p1score = 0;
			}
			this.update();
			this.logBattle(p1score);
		} else {
			this.battle.logData = null;
		}
		if (Config.autosavereplays) {
			let uploader = Users.get(winnerid);
			if (uploader && uploader.connections[0]) {
				Chat.parse('/savereplay', this, uploader, uploader.connections[0]);
			}
		}
		if (this.tour) {
			this.tour.onBattleWin(this, winnerid);
		}
		this.update();
	}
	// logNum = 0    : spectator log (no exact HP)
	// logNum = 1, 2 : player log (exact HP for that player)
	// logNum = 3    : debug log (exact HP for all players)
	getLog(logNum) {
		let log = [];
		for (let i = 0; i < this.log.length; ++i) {
			let line = this.log[i];
			if (line === '|split') {
				log.push(this.log[i + logNum + 1]);
				i += 4;
			} else {
				log.push(line);
			}
		}
		return log;
	}
	getLogForUser(user) {
		if (!(user in this.game.players)) return this.getLog(0);
		return this.getLog(this.game.players[user].slotNum + 1);
	}
	update(excludeUser) {
		if (this.log.length <= this.lastUpdate) return;

		if (this.userCount) {
			Sockets.subchannelBroadcast(this.id, '>' + this.id + '\n\n' + this.log.slice(this.lastUpdate).join('\n'));
		}

		this.lastUpdate = this.log.length;

		// empty rooms time out after ten minutes
		let hasUsers = false;
		for (let i in this.users) { // eslint-disable-line no-unused-vars
			hasUsers = true;
			break;
		}
		if (!hasUsers) {
			if (this.expireTimer) clearTimeout(this.expireTimer);
			this.expireTimer = setTimeout(() => this.tryExpire(), TIMEOUT_EMPTY_DEALLOCATE);
		} else {
			if (this.expireTimer) clearTimeout(this.expireTimer);
			this.expireTimer = setTimeout(() => this.tryExpire(), TIMEOUT_INACTIVE_DEALLOCATE);
		}
	}
	async logBattle(p1score, p1rating, p2rating) {
		let logData = this.battle.logData;
		if (!logData) return;
		this.battle.logData = null; // deallocate to save space
		logData.log = BattleRoom.prototype.getLog.call(logData, 3); // replay log (exact damage)

		// delete some redundant data
		if (p1rating) {
			delete p1rating.formatid;
			delete p1rating.username;
			delete p1rating.rpsigma;
			delete p1rating.sigma;
		}
		if (p2rating) {
			delete p2rating.formatid;
			delete p2rating.username;
			delete p2rating.rpsigma;
			delete p2rating.sigma;
		}

		logData.p1rating = p1rating;
		logData.p2rating = p2rating;
		logData.endType = this.battle.endType;
		if (!p1rating) logData.ladderError = true;
		const date = new Date();
		logData.timestamp = '' + date;
		logData.id = this.id;
		logData.format = this.format;

		const logsubfolder = Chat.toTimestamp(date).split(' ')[0];
		const logfolder = logsubfolder.split('-', 2).join('-');
		const tier = this.format.toLowerCase().replace(/[^a-z0-9]+/g, '');
		const logpath = `logs/${logfolder}/${tier}/${logsubfolder}/`;
		await FS(logpath).mkdirp();
		await FS(logpath + this.id + '.log.json').write(JSON.stringify(logData));
		//console.log(JSON.stringify(logData));
	}
	tryExpire() {
		this.expire();
	}
	getInactiveSide() {
		let p1active = this.battle.p1 && this.battle.p1.active;
		let p2active = this.battle.p2 && this.battle.p2.active;

		if (p1active && this.battle.requests.p1) {
			if (!this.battle.requests.p1[2]) p1active = false;
		}
		if (p2active && this.battle.requests.p2) {
			if (!this.battle.requests.p2[2]) p2active = false;
		}

		if (p1active && !p2active) return 1;
		if (p2active && !p1active) return 0;
		return -1;
	}
	sendPlayer(num, message) {
		let player = this.getPlayer(num);
		if (!player) return false;
		player.sendRoom(message);
	}
	getPlayer(num) {
		return this.battle['p' + (num + 1)];
	}
	requestModchat(user) {
		if (user === null) {
			this.modchatUser = '';
			return;
		} else if (user.can('modchat') || !this.modchatUser || this.modchatUser === user.userid) {
			this.modchatUser = user.userid;
			return;
		} else {
			return "Only the user who set modchat and global staff can change modchat levels in battle rooms";
		}
	}
	onConnect(user, connection) {
		this.sendUser(connection, '|init|battle\n|title|' + this.title + '\n' + this.getLogForUser(user).join('\n'));
		if (this.game && this.game.onConnect) this.game.onConnect(user, connection);
	}
	onJoin(user, connection) {
		if (!user) return false;
		if (this.users[user.userid]) return user;

		if (user.named) {
			this.add((this.reportJoins && !user.locked ? '|j|' : '|J|') + user.name).update();
		}

		this.users[user.userid] = user;
		this.userCount++;

		if (this.game && this.game.onJoin) {
			this.game.onJoin(user, connection);
		}
		return user;
	}
	onRename(user, oldid, joining) {
		if (joining) {
			this.add((this.reportJoins && !user.locked ? '|j|' : '|J|') + user.name);
		}
		delete this.users[oldid];
		this.users[user.userid] = user;
		this.update();
		return user;
	}
	onUpdateIdentity() {}
	onLeave(user) {
		if (!user) return; // ...
		if (!user.named) {
			delete this.users[user.userid];
			return;
		}
		delete this.users[user.userid];
		this.userCount--;
		this.add((this.reportJoins && !user.locked ? '|l|' : '|L|') + user.name);

		if (this.game && this.game.onLeave) {
			this.game.onLeave(user);
		}
		this.update();
	}
	expire() {
		this.send('|expire|');
		this.destroy();
	}
	destroy() {
		// deallocate ourself

		if (this.tour) {
			// resolve state of the tournament;
			if (!this.battle.ended) this.tour.onBattleWin(this, '');
			this.tour = null;
		}

		// remove references to ourself
		for (let i in this.users) {
			this.users[i].leaveRoom(this, null, true);
			delete this.users[i];
		}
		this.users = null;

		// deallocate children and get rid of references to them
		if (this.game) {
			this.game.destroy();
		}
		this.battle = null;
		this.game = null;

		this.active = false;

		if (this.expireTimer) {
			clearTimeout(this.expireTimer);
		}
		this.expireTimer = null;

		if (this.muteTimer) {
			clearTimeout(this.muteTimer);
		}
		this.muteTimer = null;

		// get rid of some possibly-circular references
		Rooms.rooms.delete(this.id);
	}
}

class ChatRoom extends Room {
	constructor(roomid, title, options) {
		super(roomid, title);
		if (options) {
			Object.assign(this, options);
			if (!this.isPersonal) this.chatRoomData = options;
		}

		this.logTimes = true;
		this.logFile = null;
		this.logFilename = '';
		this.destroyingLog = false;
		if (this.auth) Object.setPrototypeOf(this.auth, null);
		if (!this.modchat) this.modchat = (Config.chatmodchat || false);
		if (!this.modjoin) this.modjoin = false;
		if (!this.filterStretching) this.filterStretching = false;
		if (!this.filterCaps) this.filterCaps = false;

		this.type = 'chat';

		this.rollLogTimer = null;
		if (Config.logchat) {
			this.rollLogFile(true);
			this.logEntry = function (entry, date) {
				const timestamp = Chat.toTimestamp(new Date()).split(' ')[1] + ' ';
				entry = entry.replace(/<img[^>]* src="data:image\/png;base64,[^">]+"[^>]*>/g, '');
				this.logFile.write(timestamp + entry + '\n');
			};
			this.logEntry('NEW CHATROOM: ' + this.id);
			if (Config.loguserstats) {
				this.logUserStatsInterval = setInterval(() => this.logUserStats(), Config.loguserstats);
			}
		}

		if (Config.reportjoinsperiod) {
			this.userList = this.getUserList();
			this.reportJoinsQueue = [];
		}

		if (this.isPersonal) {
			this.modlogStream = Rooms.groupchatModlogStream;
		} else {
			this.modlogStream = FS('logs/modlog/modlog_' + roomid + '.txt').createAppendStream();
		}
	}

	reportRecentJoins() {
		delete this.reportJoinsInterval;
		if (!this.reportJoinsQueue || this.reportJoinsQueue.length === 0) {
			// nothing to report
			return;
		}
		this.userList = this.getUserList();
		this.send(this.reportJoinsQueue.join('\n'));
		this.reportJoinsQueue.length = 0;
	}

	async rollLogFile(sync) {
		const date = new Date();
		const dateString = Chat.toTimestamp(date).split(' ')[0];
		const monthString = dateString.split('-', 2).join('-');
		const basepath = `logs/chat/${this.id}/`;
		const relpath = `${monthString}/`;
		const filename = dateString + '.txt';

		const currentTime = date.getTime();
		const nextHour = new Date(date.setMinutes(60)).setSeconds(1);

		// This could cause problems if the previous rollLogFile from an
		// hour ago isn't done yet. But if that's the case, we have bigger
		// problems anyway.
		if (this.rollLogTimer) clearTimeout(this.rollLogTimer);
		this.rollLogTimer = setTimeout(() => this.rollLogFile(), nextHour - currentTime);

		if (relpath + filename === this.logFilename) return;

		if (sync) {
			FS(basepath + relpath).mkdirpSync();
		} else {
			await FS(basepath + relpath).mkdirp();
		}
		if (this.destroyingLog) return;
		this.logFilename = relpath + filename;
		if (this.logFile) this.logFile.end();
		this.logFile = FS(basepath + relpath + filename).createAppendStream();
		// Create a symlink to today's lobby log.
		// These operations need to be synchronous, but it's okay
		// because this code is only executed once every 24 hours.
		let link0 = basepath + 'today.txt.0';
		FS(link0).unlinkIfExistsSync();
		try {
			FS(link0).symlinkToSync(relpath + filename); // intentionally a relative link
			FS(link0).renameSync(basepath + 'today.txt');
		} catch (e) {} // OS might not support symlinks or atomic rename
	}
	destroyLog(finalCallback) {
		this.destroyingLog = true;
		if (this.logFile) {
			clearTimeout(this.rollLogTimer);
			this.rollLogTimer = null;
			this.logEntry = function () { };
			this.logFile.end(finalCallback);
		} else {
			finalCallback();
		}
	}
	logUserStats() {
		let total = 0;
		let guests = 0;
		let groups = {};
		for (let group of Config.groupsranking) {
			groups[group] = 0;
		}
		for (let i in this.users) {
			let user = this.users[i];
			++total;
			if (!user.named) {
				++guests;
			}
			if (this.auth && this.auth[user.userid] && this.auth[user.userid] in groups) {
				++groups[this.auth[user.userid]];
			} else {
				++groups[user.group];
			}
		}
		let entry = '|userstats|total:' + total + '|guests:' + guests;
		for (let i in groups) {
			entry += '|' + i + ':' + groups[i];
		}
		this.logEntry(entry);
	}

	getUserList() {
		let buffer = '';
		let counter = 0;
		for (let i in this.users) {
			if (!this.users[i].named) {
				continue;
			}
			counter++;
			buffer += ',' + this.users[i].getIdentity(this.id);
		}
		let msg = '|users|' + counter + buffer;
		return msg;
	}
	reportJoin(type, entry) {
		if (this.reportJoins) {
			this.add('|' + type + '|' + entry).update();
			return;
		}
		entry = '|' + type.toUpperCase() + '|' + entry;
		if (this.reportJoinsQueue) {
			if (!this.reportJoinsInterval) {
				this.reportJoinsInterval = setTimeout(
					() => this.reportRecentJoins(), Config.reportjoinsperiod
				);
			}

			this.reportJoinsQueue.push(entry);
		} else {
			this.send(entry);
		}
		this.logEntry(entry);
	}
	update() {
		if (this.log.length <= this.lastUpdate) return;
		let entries = this.log.slice(this.lastUpdate);
		if (this.reportJoinsQueue && this.reportJoinsQueue.length) {
			clearInterval(this.reportJoinsInterval);
			delete this.reportJoinsInterval;
			Array.prototype.unshift.apply(entries, this.reportJoinsQueue);
			this.reportJoinsQueue.length = 0;
			this.userList = this.getUserList();
		}
		let update = entries.join('\n');
		if (this.log.length > 100) {
			this.log.splice(0, this.log.length - 100);
		}
		this.lastUpdate = this.log.length;

		// Set up expire timer to clean up inactive personal rooms.
		if (this.isPersonal) {
			if (this.expireTimer) clearTimeout(this.expireTimer);
			this.expireTimer = setTimeout(() => this.tryExpire(), TIMEOUT_INACTIVE_DEALLOCATE);
		}

		this.send(update);
	}
	tryExpire() {
		this.destroy();
	}
	getIntroMessage(user) {
		let message = '';
		if (this.introMessage) message += '\n|raw|<div class="infobox infobox-roomintro"><div' + (!this.isOfficial ? ' class="infobox-limited"' : '') + '>' + this.introMessage.replace(/\n/g, '') + '</div>';
		if (this.staffMessage && user.can('mute', null, this)) message += (message ? '<br />' : '\n|raw|<div class="infobox">') + '(Staff intro:)<br /><div>' + this.staffMessage.replace(/\n/g, '') + '</div>';
		if (this.modchat) {
			message += (message ? '<br />' : '\n|raw|<div class="infobox">') + '<div class="broadcast-red">' +
				'Must be rank ' + this.modchat + ' or higher to talk right now.' +
				'</div>';
		}
		if (this.slowchat && user.can('mute', null, this)) {
			message += (message ? '<br />' : '\n|raw|<div class="infobox">') + '<div class="broadcast-red">' +
				'Messages must have at least ' + this.slowchat + ' seconds between them.' +
				'</div>';
		}
		if (message) message += '</div>';
		return message;
	}
	onConnect(user, connection) {
		let userList = this.userList ? this.userList : this.getUserList();
		this.sendUser(connection, '|init|chat\n|title|' + this.title + '\n' + userList + '\n' + this.getLogSlice(-100).join('\n') + this.getIntroMessage(user));
		if (this.poll) this.poll.onConnect(user, connection);
		if (this.game && this.game.onConnect) this.game.onConnect(user, connection);
	}
	onJoin(user, connection) {
		if (!user) return false; // ???
		if (this.users[user.userid]) return user;

		if (user.named) {
			this.reportJoin('j', user.getIdentity(this.id));
		}

		this.users[user.userid] = user;
		this.userCount++;

		if (this.game && this.game.onJoin) this.game.onJoin(user, connection);
		return user;
	}
	onRename(user, oldid, joining) {
		delete this.users[oldid];
		this.users[user.userid] = user;
		if (joining) {
			this.reportJoin('j', user.getIdentity(this.id));
			if (this.staffMessage && user.can('mute', null, this)) this.sendUser(user, '|raw|<div class="infobox">(Staff intro:)<br /><div>' + this.staffMessage.replace(/\n/g, '') + '</div></div>');
		} else if (!user.named) {
			this.reportJoin('l', oldid);
		} else {
			this.reportJoin('n', user.getIdentity(this.id) + '|' + oldid);
		}
		if (this.poll && user.userid in this.poll.voters) this.poll.updateFor(user);
		return user;
	}
	/**
	 * onRename, but without a userid change
	 */
	onUpdateIdentity(user) {
		if (user && user.connected && user.named) {
			if (!this.users[user.userid]) return false;
			this.reportJoin('n', user.getIdentity(this.id) + '|' + user.userid);
		}
	}
	onLeave(user) {
		if (!user) return; // ...

		delete this.users[user.userid];
		this.userCount--;

		if (user.named) {
			this.reportJoin('l', user.getIdentity(this.id));
		}
		if (this.game && this.game.onLeave) this.game.onLeave(user);
	}
	destroy() {
		// deallocate ourself

		// remove references to ourself
		for (let i in this.users) {
			this.users[i].leaveRoom(this, null, true);
			delete this.users[i];
		}
		this.users = null;

		Rooms.global.deregisterChatRoom(this.id);
		Rooms.global.delistChatRoom(this.id);

		if (this.aliases) {
			for (let i = 0; i < this.aliases.length; i++) {
				Rooms.aliases.delete(this.aliases[i]);
			}
		}

		if (this.game) {
			this.game.destroy();
		}

		// Clear any active timers for the room
		if (this.muteTimer) {
			clearTimeout(this.muteTimer);
			this.muteTimer = null;
		}
		if (this.expireTimer) {
			clearTimeout(this.expireTimer);
			this.expireTimer = null;
		}
		if (this.rollLogTimer) {
			clearTimeout(this.rollLogTimer);
			this.rollLogTimer = null;
		}
		if (this.reportJoinsInterval) {
			clearInterval(this.reportJoinsInterval);
		}
		this.reportJoinsInterval = null;
		if (this.logUserStatsInterval) {
			clearInterval(this.logUserStatsInterval);
		}
		this.logUserStatsInterval = null;

		if (!this.isPersonal) {
			this.modlogStream.removeAllListeners('finish');
			this.modlogStream.end();
		}
		this.modlogStream = null;

		// get rid of some possibly-circular references
		Rooms.rooms.delete(this.id);
	}
}

function getRoom(roomid, fallback) {
	if (fallback) throw new Error("fallback parameter in getRoom no longer supported");
	if (roomid && roomid.id) return roomid;
	return Rooms.rooms.get(roomid);
}
Rooms.get = getRoom;
Rooms.search = function (name, fallback) {
	if (fallback) throw new Error("fallback parameter in Rooms.search no longer supported");
	return getRoom(name) || getRoom(toId(name)) || getRoom(Rooms.aliases.get(toId(name)));
};

Rooms.createBattle = function (roomid, format, p1, p2, options) {
	if (roomid && roomid.id) return roomid;
	if (!p1 || !p2) return false;
	if (!roomid) roomid = 'default';
	if (!Rooms.rooms.has(roomid)) {
		// console.log("NEW BATTLE ROOM: " + roomid);
		Monitor.countBattle(p1.latestIp, p1.name);
		Monitor.countBattle(p2.latestIp, p2.name);
		Rooms.rooms.set(roomid, new BattleRoom(roomid, format, p1, p2, options));
	}
	return Rooms(roomid);
};
Rooms.createChatRoom = function (roomid, title, data) {
	let room = Rooms.rooms.get(roomid);
	if (room) return room;

	room = new ChatRoom(roomid, title, data);
	Rooms.rooms.set(roomid, room);
	return room;
};

Rooms.battleModlogStream = FS('logs/modlog/modlog_battle.txt').createAppendStream();
Rooms.groupchatModlogStream = FS('logs/modlog/modlog_groupchat.txt').createAppendStream();

Rooms.global = null;
Rooms.lobby = null;

Rooms.Room = Room;
Rooms.GlobalRoom = GlobalRoom;
Rooms.BattleRoom = BattleRoom;
Rooms.ChatRoom = ChatRoom;

Rooms.RoomGame = require('./room-game').RoomGame;
Rooms.RoomGamePlayer = require('./room-game').RoomGamePlayer;

Rooms.RoomBattle = require('./room-battle').RoomBattle;
Rooms.RoomBattlePlayer = require('./room-battle').RoomBattlePlayer;
Rooms.SimulatorManager = require('./room-battle').SimulatorManager;
Rooms.SimulatorProcess = require('./room-battle').SimulatorProcess;

// initialize

if (!Config.quietconsole) console.log("NEW GLOBAL: global");
Rooms.global = new GlobalRoom('global');

Rooms.rooms.set('global', Rooms.global);

redpajama_set_name: RedPajamaGithub


Whether your interest is in buying a primary residence, beach/vacation getaway, or investment property, I can provide you with solid advice and guidance. Let me help you find the home of your dreams!
Do you know the value of your home? Contact me to schedule a complimentary in depth analysis of your home's value based on comparative sales in your area.
Looking to relocate to Rhode Island? Let me educate you on the area, recommend services to help you with your move, and set up showings that fit in with your busy schedule before you arrive. Looking to relocate to another state? Let me refer you to a qualified real estate professional in your area!


CUTTING EDGE LAWN CARE has been set up 2/11/2014 in state LEE. The current status of the business is Active. The CUTTING EDGE LAWN CARE principal adress is 1401 SW 11TH COURT, CAPE CORAL, FL, 33991. Meanwhile you can send your letters to . The company`s registered agent is . The company`s management are .
CUTTING EDGE LAWN CARE CUTTING EDGE LAWN CARE CUTTING EDGE LAWN CARE CUTTING EDGE LAWN CARE CUTTING EDGE LAWNCARE CUTTING EDGE LAWN CARE INC.


The Research Development Advisory Council was inaugurated in 2006. Its members are Associate/Assistant Deans for Research or individuals who hold comparable responsibilities for research development within their respective academic College/School. Council members represent the research interests of each of the academic Schools and Colleges at VCU, make policy recommendations to the Vice President for Research and Innovation, and serve as a conduit of information from the Office of the Vice President for Research and Innovation (OVPRI) back to their constituencies. The Council meets monthly with the Vice President for Research and Innovation and the Associate Vice President for Research Development to address topics of specific interest to the VCU research enterprise, to discuss policy issues, and to identify resources and supports necessary for increasing the strength and competitiveness of VCU as a research university. Affiliate non-voting members are appointed to ReDAC on a case-by-case basis by the Vice President for Research and Innovation in consultation with the academic vice presidents.


Every week, we use this space to feature an inspiring and empowering woman from the health, wellness and personal development community. This is our opportunity to connect and share with amazing women around the world, and this week we are so happy to feature Asha Ramakrishna!
Being trained as a Molecular Biologist and spending over a decade in Business Development & Sales in the Biotech Industry, Asha now mentors Evolved Entrepreneurs + Executives to clarify personal Fulfillment, ensure Work & Life Balance, and establish systems for Profitable & Sustainable enterprises.
Soul + Business. Go perfectly together.
Asha Ramakrishna: When I first started blending business and spirituality, I was doing Business Development in the Biotech industry. What I found was that having sales conversations were really more about soul to soul conversations. I was connecting to the person (prospective client) at a soul level, and so I started to see the work I did as spiritual.
In fact, I think whatever work we do we can do it from a place of service, and that in itself makes it spiritual beyond any meditating or chanting.
Asha: I was in pain for a long time. I was going to so many different spiritual workshops because I was curious to learn more, but ultimately it was because I was suffering. I felt as though my sensitivity was getting in the way of my personal and professional success and I didn't have a way to elegantly feel everything and still get sh*t done. haha!
True, though! It was this pain that led me to really focus on a method that could eliminate my search, but also help me at a practical level. It is a very powerful method that I use and now teach.
What I found though was that the acceptance of the present moment was the doorway to both honoring what is alive in me, and also moving towards what I desire to create.
Asha: Is this like one of those interview questions? haha!
worst habit.... eating cake. I love cake. I'm sure it's a sugar thing, but I love it. At this moment, I will tell you, I am not doing anything about it. Except laughing a bit about it, and having some compassion for it.
I would say that #1 you are enough as you are right now. Know that life is supposed to have ups and downs, and in fact those sacred seasons of life, even if we do not totally understand them, have a genius reason for being there.
.... always take inspired action. Be courageous, it is ok if you fall flat on your face, trust me, you will learn how to do things better. Learning to pick yourself up, not taking it personally, but using the information as data to feed your wisdom, is the most precious thing you can embrace about life.
Asha: I make tea. Sit for a minute in the quiet of my living room. Practice Ashtanga Yoga.
Then before going to bed I talk to my daughter about her day; that is probably the most scrumptiously spiritual thing I do. It is a precious window into her soul.
Connect to a Sisterhood; it will strengthen you.
I didn't have a Sisterhood at the time. I longed for it, and even if that piece seems off course in the self love journey, I found that being vulnerable to another in a sacred space has been one of the most powerful acts of courage and self love.
I am still in progress with it. Everyday challenging myself with compassion to go deeper, more vulnerable, and to fully trust another who is vested in our collective evolution.
Asha: My daughters inspire me. I love observing them unfold.
I think you should inspire one of my clients Valerie Marie. A woman who has come into her goddess nature in less than a year. So honored to have walked with her.


text:
The Persian Dream
Library, Prints
"The Persian Dream" Yazd - Iran By Saleh Kazemi Saleh Kazemi was born in Teheran in 1992, where he lived until he was 18. In spite of showing artistic interests from an early age, he originally chose to embark on scientific studies. But after high school, he moved to Italy to study Graphic Design at the Fine Art Academy of Rome. His life is a continuous voyage, sketchbook in bag, in which he draws the people, the places, and what he sees happening around him. His works have been displayed in many personal and collective shows. The original: 150x80 cm | acrylic on canvas | 2020 - Rome The Print: 24x47 cm (9.5" x18.5") Digital fine-art print on 285 gr. Fedrigoni recycled uncoated paper. With description printed on back Printed in Italy Dry sealed stamp
The Persian Bazaar
Tajrish Bazaar - Tehran By Saleh Kazemi Saleh Kazemi was born in Teheran in 1992, where he lived until he was 18. In spite of showing artistic interests from an early age, he originally chose to embark on scientific studies. But after high school, he moved to Italy to study Graphic Design at the Fine Art Academy of Rome. His life is a continuous voyage, sketchbook in bag, in which he draws the people, the places, and what he sees happening around him. His works have been displayed in many personal and collective shows. The original: 240x150 cm | acrylic on canvas | 2020 - Rome The Print: 30x47 cm (11,8"x 18,5") Digital fine-art print on 285 gr. Fedrigoni recycled uncoated paper. With the caption in the back Printed in Italy Dry sealed stamp
The Persian Cafe
"The Persian Café" Ruhi Café - Tehran, Iran By Saleh Kazemi Saleh Kazemi was born in Teheran in 1992, where he lived until he was 18. In spite of showing artistic interests from an early age, he originally chose to embark on scientific studies. But after high school, he moved to Italy to study Graphic Design at the Fine Art Academy of Rome. His life is a continuous voyage, sketchbook in bag, in which he draws the people, the places, and what he sees happening around him. His works have been displayed in many personal and collective shows. The original: 40x24 cm | pen and ink on cardboard | 2019 - Rome The Print: 40 x 24 cm (15.7" x9.4") Digital fine-art print on 285 gr. Fedrigoni recycled uncoated paper. With description printed on back Printed in Italy Dry sealed stamp
The Persian Village
"The Persian Village" Abyaneh - Iran By Saleh Kazemi Saleh Kazemi was born in Teheran in 1992, where he lived until he was 18. In spite of showing artistic interests from an early age, he originally chose to embark on scientific studies. But after high school, he moved to Italy to study Graphic Design at the Fine Art Academy of Rome. His life is a continuous voyage, sketchbook in bag, in which he draws the people, the places, and what he sees happening around him. His works have been displayed in many personal and collective shows. The original: 50x17 cm | pen on cardboard | 2015 - Rome The Print: 15.5 x 47 cm (6.1" x18.5") Digital fine-art print on 285 gr. Fedrigoni recycled uncoated paper. With description printed on back Printed in Italy Dry sealed stamp


Terminates the execution and writes a message in the Output window.
After this software termination of the program you can force the Interpreter to look for other answers by pressing New Answer (F8 ). Nevertheless the program will not continue from the place where it was stopped. The reason is that the mechanism of backtracking will search for other answers and this one which was terminated would not be found. It is easier to understand this if you imagine that after every terminate(X) there is one fail .
The message which will be written in the Output window depends on the parameter Message .
i) If Message is not-instantiated then the standard message will be displayed: "Software termination."
ii) If Message is a string then this string will be displayed.
iii) If Message is a term then this term will be written.


At South West TAFE we offer a unique, individualised approach to VCAL. We have a variety of courses including Youth VCAL Programs, Young Parents VCAL and Adult VCAL.
Why VCAL & General Education?
Students will engage in integrated programs and have the opportunity to contribute to a pathway that reflects not only personal interests, but employment and industry needs in the local area.
Core units of literacy, numeracy, work-related skills and personal development skills are offered at Foundation, Intermediate and Senior levels. A work placement will also form part of these hours at the Intermediate and Senior levels.
These hours will be integrated and work completed reflecting either Vocational Training being completed at the time or individual and group projects.
VCAL and hospitality studies at South West TAFE have given Adia Quinlivan the best start for a career in the hospitality industry.
VCAL studies at South West TAFE has lead Jordyn Arundell into a traineeship position at Warrnambool City Council and she is loving it.


text:
Эксче́йндж-Плейс () — односторонняя улица в Нижнем Манхэттене, Нью-Йорк. Эксчейндж-Плейс берёт начало от Бродвея и идёт на восток до Хановер-стрит.

Изначально улица называлась Тёйн-стрит (, дословно — «садовая улица»). Впоследствии улица неоднократно меняла своё название, пока не обрела своё нынешнее, полученное в честь находящейся на соседней Уолл-стрит Нью-Йоркской фондовой биржи ().

Во времена Нового Амстердама от места, где ныне проложена улица, начинался канал, вдоль которого впоследствии была проложена Брод-стрит. В 1693 на улице, называвшейся тогда Гарден-стрит (), недалеко от Брод-стрит представители Нидерландского реформаторства возвели церковь. В 1830-х годах на Эксчейндж-Плейс наравне с прилегающими улицами значительно возрос спрос на коммерческие помещения. Многие жилые дома на улице в те годы сносились, и на их месте возводились торговые помещения. Об объёмах операций, проводимых на улице уже в то время, свидетельствует сумма в $ 1,6 млн, выкраденная в одном из банков на Эксчейндж-Плейс в 1867 году. Ныне Эксчейндж-Плейс вместе с Уолл- и Брод-стрит образует ядро финансового квартала Манхэттена.

Ближайшей к Эксчейндж-Плейс станцией метро является Брод-стрит ().

Примечания

Литература

Нижний Манхэттен

redpajama_set_name: RedPajamaWikipedia


text:
Q: Arithmetic statements believed to be unprovable under any "reasonable" axioms? Can we name statements about the natural numbers that are (1) unprovable using axioms like $\textrm{ZFC}$, and which we moreover expect to be (2) unprovable under any trusted set of axioms in the future?  That is, can we name a specific question in arithmetic that we expect will never be answered?
Background:
Some statements about $\mathbb{N}$ are unprovable by $\textrm{ZFC}$ (if $\textrm{ZFC}$  is consistent).  More generally, by Godel, given any consistent formal system containing arithmetic, we can name an arithmetic statement unprovable within that system.  However, even when an arithmetic statement is unprovable within a given system, sometimes we still come to believe it's true, by proving it within some stronger set of trusted axioms. For instance, by the Paris-Harrington theorem, a certain combinatorial statement is unprovable within Peano arithmetic but proven under $\textrm{ZFC}$.  Or note the consistency of $\textrm{ZFC}$ itself can be formulated as an arithmetic statement, and while it's unprovable under $\textrm{ZFC}$ (if $\textrm{con(ZFC)}$), it can be proven under some alternative axioms deemed reasonable.
Again, no matter what consistent "reasonable axioms" we come to trust in the future, we will be able to name arithmetic statements unprovable within those axioms. Relatedly, we can name a class of binary questions (e.g. the halting problem) that is undecidable by any future Turing machine.  But neither of these directly address the question: I'm wondering whether we can name a specific statement that we expect to be unprovable under any axioms that we come to agree upon.  (Of course, the statement itself could be added as an axiom, but we would still be skeptical unless there were some reason to believe it.) There's fuzziness when asking about "reasonable axioms we may come to trust in the future," but that's exactly what I'm trying to probe here. I would appreciate if anyone could clarify my thinking or point to relevant discussions.
Related question here and related keyword "absolutely undecidable."

redpajama_set_name: RedPajamaStackExchange


text:
Cuspidal representation
From formulasearchengine
In number theory, cuspidal representations are certain representations of algebraic groups that occur discretely in L 2 {\displaystyle L^{2}} spaces. The term cuspidal is derived, at a certain distance, from the cusp forms of classical modular form theory. In the contemporary formulation of automorphic representations, representations take the place of holomorphic functions; these representations may be of adelic algebraic groups.
When the group is the general linear group GL2{\displaystyle \operatorname {GL} _{2}} , the cuspidal representations are directly related to cusp forms and Maass forms. For the case of cusp forms, each Hecke eigenform (newform) corresponds to a cuspidal representation.
Let G be a reductive algebraic group over a number field K and let A denote the adeles of K. Let Z denote the centre of G and let ω be a continuous unitary character from Z(K)\Z(A)× to C×. Fix a Haar measure on G(A) and let L20(G(K)\G(A), ω) denote the Hilbert space of measurable complex-valued functions, f, on G(A) satisfying
f(γg) = f(g) for all γ ∈ G(K)
f(gz) = f(g)ω(z) for all z ∈ Z(A)
∫ Z ( A ) G ( K ) ∖ G ( A ) | f ( g ) | 2 d g < ∞ {\displaystyle \int _{Z({\mathbf {A} })G(K)\backslash G({\mathbf {A} })}|f(g)|^{2}\,dg<\infty }
∫ U ( K ) ∖ U ( A ) f ( u g ) d u = 0 {\displaystyle \int _{U(K)\backslash U({\mathbf {A} })}f(ug)\,du=0} for all unipotent radicals, U, of all proper parabolic subgroups of G(A).
This is called the space of cusp forms with central character ω on G(A). A function occurring in such a space is called a cuspidal function. This space is a unitary representation of the group G(A) where the action of g ∈ G(A) on a cuspidal function f is given by
( g ⋅ f ) ( x ) = f ( x g ) . {\displaystyle (g\cdot f)(x)=f(xg).}
The space of cusp forms with central character ω decomposes into a direct sum of Hilbert spaces
L02(G(K)∖G(A),ω)=⨁^(π,Vπ)mπVπ{\displaystyle L_{0}^{2}(G(K)\backslash G(\mathbf {A} ),\omega )={\hat {\bigoplus }}_{(\pi ,V_{\pi })}m_{\pi }V_{\pi }}
where the sum is over irreducible subrepresentations of L20(G(K)\G(A), ω) and mπ are positive integers (i.e. each irreducible subrepresentation occurs with finite multiplicity). A cuspidal representation of G(A) is such a subrepresentation (π, V) for some ω.
The groups for which the multiplicities mπ all equal one are said to have the multiplicity-one property.
James W. Cogdell, Henry Hyeongsin Kim, Maruti Ram Murty. Lectures on Automorphic L-functions (2004), Chapter 5.
Retrieved from "https://en.formulasearchengine.com/index.php?title=Cuspidal_representation&oldid=249722"
Representation theory of algebraic groups


Strengths: For us the wild natural beauty of Scotland's highlands and coastlines were the highlight. Like Norway, but it has friendly pubs in every village. Then there's the history, lots of ruined castles and manor houses to visit. You soon get tangled in the battle of the clans and the long running wars with the English. Away from the cities parking is free and easy to find. Our 3 sim worked everywhere.
Weaknesses: Not as motorhome facility friendly as France or Germany, but a lot more relaxed than England and Wales. There are traditional campsites scattered about and they seemed expensive, so we only stayed once or twice. The ferries tend to be expensive (particularly to Orkney).
Opportunities: Skye, the Outer Hebrides and the Orkneys are highly recommended. There are some fabulous coastal walks and you can spend all day looking for puffins if you so desire.
Threats: Probably just the weather and the midges. We had almost 5 weeks of mild to warm weather, lots of sunny days with just the odd shower every few days. In season the midges can make life difficult (very difficult) if they swarm and attack. Mind you we only struck them once on the West Highland Way early one morning.


In an unidirectional one-to-many relation, with a join column on many side, Hibernate seems to forget about nulling foreign keys when removing object on 'one' side if entities are instrumented.
However when entities are instrumented using 'enableLazyInitialization' mode, the first SQL statement is not generated which leads to constraint violation when the delete statement is executed.
A build run without 'enhancement' profile works correctly.
Please note that this happens only when 'enableLazyInitialization' mode is on; other modes doesn't cause this issue.


Purchasing the right size dirt bike is an important decision. It's common for people to see how large a dirt bike is and become intimidated, so they choose a bike .
Dirt bikes will weigh even less than this, which we list below.. For a 125cc motorcycle, the average weight is right around 150 pounds (68 kg). A 250cc bike will .
Im making the switch from quads to dirt bikes. whats the aver weight for a rider on a yz 125? in other words, i weigh 180lbs would i be too .
Dirt Jumping Bike Weight in Dirt Jumping & Street.. spec and still be sub 25, if you have the money, otherwise even average builds are easy to .


text:
Home Baseload Hydropower Australia Wants to Manufacture Wind Turbines
Australia Wants to Manufacture Wind Turbines
A renewable energy company wants to manufacture wind turbines in Australia in order to reduce the costs of operating its windfarms.
CODRINGTON, Victoria, AU, 2001-07-31 [SolarAccess.com] A renewable energy company wants to manufacture wind turbines in Australia in order to reduce the costs of operating its windfarms. Pacific Hydro Ltd. wants to establish the manufacturing capability in southwest Victoria. "We're keen to facilitate the establishment of a wind turbine manufacturing industry near Portland" that will create 300 direct and 1,500 indirect jobs, explains company chairman Kingsley Cullen. "There is also the potential for significant exports through Australia and Asia. We're trying to create the market so that we can manufacture these turbines here in Australia and reduce the capital cost and the price of electricity." The largest windfarm in Australia and the first in Victoria was opened last week by premier Steve Bracks at Codrington, southwest of Melbourne. The Au$33 million facility uses 14 turbines to generate electricity for 14,000 homes. Pacific Hydro sells the generation from the 18 MW Codrington site to Origin Energy Ltd., which wants to develop a 150 MW windfarm in nearby Portland at a cost of $250 million.
Previous articleEnergy Czar says U.S. Program Helps Renewables
Next articleCanada Adopts U.S. Energy Program


Molly's father passed away late last year from brain cancer. Molly was 3 years old. Molly's grandfather is Keith "Ozzy" Osborne, a former AMWU delegate from The Age.
To help Molly and her family, in solidarity with our former delegate, the AMWU Victorian branch held a fundraiser to raise money to go into an educational trust for Molly.
While the money is still being counted, and donations keep coming in, we are able to announce the winners of the raffle held on the night.
Congratulations to the three winners, as well as all the winners of the auction held on the night.
All funds raised through ticket sales, raffle tickets, the auction, profits from the bar and private donations will be tallied and put into an educational trust for Molly.
The AMWU would like to thank every member who helped support the event, everyone who bought a raffle ticket, everyone who donated, and everyone who came along on the night in an incredible show of union solidarity.


The Lord of the Rings Tarot is consists of your typical 78-card deck; practically no changes were made to card names, suit-element correspondences, and card meanings. The cards themselves are bordered in black, with the name down the left side, the picture in the middle, and a short description of the scene at the bottom, supposedly to remind you of the card's meaning. Since the deck can also be used to play a game, which is explained in the booklet, they have different backgrounds and a symbol at the top right to denote their "alignment". The card backings are grey bricks with the title "The Lord of the Rings" both upright and upside-down, with two interlocked rings at the center, and quite reversible.
I didn't like the art style, though it's not exactly bad quality. Peter Pracownik also painted the Dragon Tarot, which I would dearly love to get my hands on. With all the borders and descriptions, the pictures are quite small in relation to the cards, which could be disappointing. In addition, I found them a bit lacking in unity. Some of the cards are extremely stylized, while others have symbols at the top, or symbols embedded in an oval border around the picture, while the rest are rather like any old fantasy artwork. The Minor Arcana all show the suit symbols, usually hovering at the top of the picture rather than incorporated, although that is another inconsistency.
Now we get to the core of why I hate this deck and consider it a total waste of money. I bought the book and deck boxed set, and the book goes into rather extended detail about each of the Major Arcana while devoting a long paragraph to the descriptions of each Minor Arcanum and only a few lines to their meaning. The Major Arcana descriptions include a lengthy discussion of the thing pictured on the card and its history, a section on the card's meaning, one on its astrological correspondence, and finally, a section where the person, or thing, "speaks". It is in the last that the author begins to show his greatest flaw in the creation of his deck: how totally he misunderstood Tolkien's works.
As I thought about it before writing this review, I gradually realized that the way he deals with each card is much like the writing of his introduction. The introduction had a lot of potential. Different aspects of Tolkien's work was discussed and each time he started down the path of insight, and I began to see what he was getting at, and all of a sudden he would shy away from actually having a point, following with an incredible non sequitur that started talking about modern life. Like that, each card description is relatively accurate, but I was unable to make any connections between the card's scene and its meaning most of the time. The detailed symbolism in the artwork is carefully explained, but never alluded to again in the section on card meaning. And then the author started contradicting his introduction, losing the beautiful connections he had made.
The best place to begin is at the beginning, I suppose, with The Fool. In the introduction, the author starts talking about the journey of the Fellowship of the Ring, strongly hinting at its parallels with the Journey of the Fool, and the importance of the initiation of this journey. Then he abruptly switches to talking about the lack of this initiative in the modern world and how many young people have gone astray as a result. (Or somesuch. I started gagging in my head and stopped paying attention at that point.) But who, then, was ultimately designated as The Fool? Gollum.
Now, when I first got this deck, I didn't really know anything about tarot and card meanings so this fact rather went by me. When I came back to the deck again, my mind screamed. I have to say it is blindingly obvious that Frodo, or, failing that, Bilbo or Sam, is the Fool. Led out the door on an adventure, totally unsuspecting of the trials and pains to come. The author himself describes how The Fool signifies the beginning of a journey, a sudden change in the direction of one's life. Then he suddenly talks about Gollum's choices, how he loved the dark but was not aligned by Mordor, how he was obsessed with the Ring. Does that sound Foolish to you? The Fool symbolizes a beginning, but Gollum was twisted, had reached the end of his purposes, and was essentially incapable of redemption. So many times he comes right to the brink, but is interrupted and falls back. When Gollum "speaks" he talks about being able to see himself different in the future, but the truth is that Gollum had no more ambitions nor true will to live, just a consuming lust for the Ring. The author admits to a fascination with Gollum's character, though, so I suppose he had to give him this central card, poisoning the entire deck, in a sense.
The other card that jumped to my attention upon revisiting this deck was The Wheel of Fortune, which is the One Ring. What comes to mind is Elrond's warning, "We cannot use the Ruling Ring." It's evil and would bring downfall to anyone who used it except Sauron, just consider Isildur and Gollum. Yet the card blithely states, "The Ring brings benefits, but eventually dominates." Unless Donaldson was the ultimate pessimist, who believes everything comes to a bad end, the Ring is totally inappropriate as the Wheel of Fortune. The book is even worse when it has the Ring "saying" how it chooses to be favorable to certain people. There's also a literal error: the Ring says it chose Bilbo to get out of Gollum's cave, but Gandalf clearly says that Bilbo's discovery was a mistake, that the Ring meant itself to be discovered by a Servant of the Enemy. The Ring does not turn but yearns forever after its master.
Other cards are annoying, but not as major as those two after which I don't even want to touch the deck. Galadriel, not Eowyn, is clearly the High Priestess. The Mirror of Galadriel would serve a better Seven of Cups than the Seven Palantíri. That, too, was a major downfall of the deck: the author could not resist numerical symbolism and would cram the things in even where they didn't fit, the Nazgul as the Nine of Swords, for example. It might sound trivial to a non-Tolkien fan, I suppose, but there are simply too many grave misinterpretations, not even things that are arguable (like Balrog wings, perhaps). Besides, even if the book might describe standard meanings for the deck, neither the pictures nor the short descriptions really help you bring them to mind. This is a very unintuitive deck. Looking at the cards, I must remember the Rider-Waite meanings on my own, then stretch to match it with the image before me. Plus, since I'm griping anyway, the "Dark Peoples" and "Free Peoples" card game symbols are quite distracting.
Okay, so the deck is not absolutely without its good points. I thought it was brilliant to have the Balrog as Death, and wondered why I didn't think of that myself. (Let's ignore the facts that the Balrog looks like a human and that the author says its whip was "lightning".) Earendil is certainly the Star (you'll notice it is the same with my deck), and Grima, symbolically, is a better Devil than Sauron might be. But, you know, in the end it doesn't balance out.
The deck is worthless. The art is inconsistent and unaesthetic (at least to me), and the cards are badly designed. The author did a miserable job of correlating scenes and card meanings, making for an unituitive deck, and he totally misinterpreted the characters and scenes anyway. Try casting this into the fires of Mount Doom.


text:
The College considers our Boarding community to be the heart of the College. With the majority of our Boarding families residing in rural Australia, we are delighted to be able to provide high quality educational opportunities for our rural community.
The College offers the equivalent of three Boarding scholarships for entry to Years 7 to 11. Please click on the drop down menus below for further information on each of the scholarships.
The Alanda Clark, Jane Gay and Prudence Papworth Boarding Scholarship
(Available for entry in Year 7 2022)
Pymble Ladies' College offers the equivalent of one scholarship providing full or part remission from academic tuition fees (excluding Boarding fees and extras) to a Boarding student entering Year 7. The awarding of an Alanda Clark, Jane Gay and Prudence Papworth Boarding Scholarship is determined by results in the scholarship examination and successful interview. The successful candidate must exhibit a willingness and ability to enter fully into the life of the College and to participate in sporting and co-curricular activities to the best of her ability.
The scholarship examination will be held at the College or remotely (for country candidates and, in some cases, for students living overseas).
Candidates are to be in Year 5 and less than 12 years of age on 31 December of the examination year.
Candidates must be a Boarding student from a rural region (not necessarily NSW).
Successful candidates must commence in Year 7 2022.
The scholarship covers full or part remission of tuition fees (excluding extras) for six years. Boarding fees and all other expenses are to be met at the full rate.
Scholarships will be reviewed on an annual basis and it is the College's expectation that recipients of this Scholarship uphold Pymble's five core values (Care, Courage, Integrity, Respect and Responsibility) and represent the Boarding community with pride.
Please submit a Portfolio which includes the following:
a 300 to 500 word autobiographical essay written by the candidate outlining her special interests and the contribution she would make to the life of the College.
your daughter's latest school report and NAPLAN results.
evidence of your daughter' s co-curricular and sporting achievements.
letter from your daughter's teacher, coach or other referee (not a family member) in support of her application.
Primary Producers status documentation signed by your accountant.
The portfolio must be submitted to the College by post or delivered to College Reception. Late portfolios will not be accepted.
Registration for 2022 Scholarships closes on Friday 28 August 2020 or on Wednesday 19 August 2020 for candidates who are sitting the exam remotely.
Available for entry in Years 7 to 11 in 2022
In 2018, in response to the ongoing impact of the drought in Australia, the College created the equivalent of two additional boarding scholarships for students from rural Australia whose parents are primary producers. We hope these scholarships will provide opportunities for country girls to access our supportive learning community.
The scholarship examination will be held at the College or remotely for country candidates and, in some cases, for students currently living overseas.
For entry to Years 7 to 11 2022 candidates must currently be in Years 5 to 9 and at least 11 to 15 years of age on 31 December 2020.
Candidates must be the daughter of a primary producer from a rural region (not necessarily NSW). To confirm eligibility families will be required to submit their Primary Producer status documentation signed by their accountant.
The scholarships cover full or part remission of tuition fees (excluding extras) for the duration of the student's education at Pymble. Boarding fees and all other expenses are to be met at the full rate.
Scholarships will be reviewed on an annual basis and it is the College's expectation that recipients uphold Pymble's five core values (Care, Courage, Integrity, Respect and Responsibility) and represent the Boarding community with pride.
letter from your daughter's teacher, coach or other referee (not a family member) of in support of her application.
The portfolio must be submitted to the College by post or delivered to College Reception.


text:
Q: Creation/use of EpiServer properties I'm working with EpiServer CMS 6 on the ASP .net 4.0 platform. I can create a property in Admin Mode just fine but is there a way to create properties in Visual Studio? (Not necessarily custom properties, just a simple String property for now). Am I right in saying the only way to do this would be by using Page Type Builder?

A: You can use the API to create PageTypes and PageDefinitions in code. Here is a good starting point.
I would recommend you use PageTypeBuilder instead though, it offers many advantages over the API.


text:
Lifted és un curtmetratge estatunidenc de Pixar de 2006, projectat als cinemes abans de Ratatouille.

Argument
El curt narra les desventures d'un jove extraterrestre en un examen, que amb una nau de complicats botons ha d'abduir un home dormint. La seva manca de destresa fa que l'home es doni cops, la casa es destrueixi i altres desastres, sense aconseguir el seu objectiu i miraculosament sense despertar la víctima. El curt parodia els exàmens del carnet de conduir.

Referències

Enllaços externs
 Lifted al web de Pixar

Pel·lícules dels Estats Units del 2006
Pel·lícules d'animació de Pixar
Curtmetratges d'animació


Two cynical women create an agency that helps break up couples in an attempt to avoid their own problems in life.
New comedy from the producers of Hunt For The Wilder People and Boy. New Zealand romatic comedy The Breaker Upperers is written by Madeleine Sami and Jackie van Bee.
It is set to premiere on Netflix all over the world, apart from New Zealand on February 15th, the day after Valentines Day.


On this episode, I share my five "must do" ways to work towards Financial Freedom.
If you are looking at one day not relying on a job and living pay check to pay check, this video is for you.
Be sure to hit that Subscribe button to my Youtube Channel so you don't miss out!
My Vlog channel – Welcome to Mamafurfur on Youtube!


Born November 28, 1969, in North Delta, British Columbia, Canada; married Brandy Ledford (an actress; divorced, 2004). Addresses: Agent: Leonard Bonnell, Characters Talent Agency, 1505 West Second Ave., Suite 200, Vancouver,British Columbia V6H 3Y4, Canada.; Manager: Handprint Entertainment, 1100 Glendon Ave., Suite 1000, Los Angeles, CA 90024.
Appeared in the unaired pilot T.R.A.X.


text:
Tony Hawk's Mom Dies After 'Decade-Long Battle' with Alzheimer's: 'Thanks for Everything Mom'
Claudia Harmata
People December 26, 2019
Tony Hawk is mourning the death of a loved one this holiday season.
On Monday, the retired professional skateboarder announced that his mother, Nancy Elizabeth Hawk, had died that afternoon after a long battle with Alzheimer's disease and dementia.
"My mom died peacefully this afternoon after a decade-long battle with Alzheimer's and dementia," Hawk, 51, wrote on Instagram. "We watched helplessly as she slid away — mentally and physically — in rapid decline over the last few years. With each visit it became less likely that there would be any signs of recognition."
However, the former skateboarder added that he wants to remember his mother in a more positive light.
"She grew up during the Great Depression, had two jobs by age 14, married my father after he enlisted in the Navy during WW2, and managed to raise four kids on a meager budget while providing us with plenty of encouragement and confidence to follow our passions," Hawk said of his mother. "She earned her doctorate in business management at an age that most would choose to retire from work altogether."
RELATED: Tony Hawk Stopped 'Looking' for Recognition from Mom with Alzheimer's: 'I Just Accept That'
Tony Hawk and his mother | Tony Hawk/ Facebook
In addition to her own success, she was also someone who continuously supported her son in his passion for skateboarding, he said.
"She was a surrogate mom and a beacon of warmth to many of my misfit friends with weird hair and difficult backgrounds. She worried when I got hurt skating, but never discouraged me from doing it because she understood the unparalleled joy it brought me," wrote Hawk, who retired from skateboarding competitions in 1999 after winning more than 70 contests throughout his time as a professional.
"She touched many lives with her kindness and I believe she left the world a better place for countless others," he added.
Hawk said his oldest sister recently found a form with their mother's "end of life" wishes, which the father of four said was filled out in "her cognitive days."
RELATED: Tony Hawk Looks Back on Landing Skateboarding's Holy Grail 20 Years Later: The 900 'Felt Surreal'
When his mother was asked how she wanted to be remembered by others, she had replied: "She was funny; adored life, friends, and family." And when Nancy was asked if she wanted any music, songs or readings at her memorial service, she responded: "Hip Hop music might be nice."
"So if you knew Nancy Hawk or just want to celebrate her life with us, please raise a glass and play your favorite hip hop tune in her honor," her son wrote. "Thanks for everything mom, we love you and we are thankful for your guidance."
Tony Hawk holding his mother's hand | Tony Hawk/Instagram; Inset: Alberto E. Rodriguez/Getty
He then added, "And before I forget: f— Alzheimer's, give to Hilarity for Charity," encouraging his fans to donate to a charity that raises awareness about the disease.
Alzheimer's is an irreversible, progressive disease that causes brain cells to degenerate and die, according to Mayo Clinic. It is also the leading cause of dementia, which is a continuous decline in a person's ability to function independently.
RELATED: Son Sings Karaoke in Car with Dad Who Has Dementia and Doesn't Remember Who He Is
Early symptoms of Alzheimer's vary from person to person, but they typically include cognitive impairment, having difficulty finding words, spatial issues, and impaired judgment, according to the National Institute on Aging. It is ranked as the sixth leading cause of death in the United States for the elderly.
In October, Hawk had opened up about seeing his mother succumb to Alzheimer's, explaining that "you have to remember them for who they were."
"I think that over the last couple years, I was always looking for glimpses of recognition. And now, I don't seek that so much. I just accept that," he told the Detroit Free Press at the time. "I enjoy that she's still here and I can spend some time with her."
Kourtney Kardashian's 7-Year-Old Daughter Penelope Steals The Show In $200 Versace Swimsuit
Salma Hayek Serves Up Killer Cleavage In Smoking Hot Throwback, Fans Go Wild
National Archives Apologizes for Altered Photo of Signs Critical to Trump at Women's March