[Scummvm-git-logs] scummvm master -> 9b2b4127a79f97b4fb9021567fb74c12e23215fe

sev- noreply at scummvm.org
Sat Jul 25 11:27:04 UTC 2026


This automated email contains information about 14 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
80aef6fbcb DIRECTOR: Add support for the digitalVideoTimeScale
f0d2805226 DIRECTOR: LINGO: Return an integer if the movieRate is near enough
10a9c8bc65 DIRECTOR: Fix refcounting with Sprite CastMember pointers
bec32ee2d3 DIRECTOR: LINGO: Add Xtra stubs for getaheadmath
53c936e20d DIRECTOR: LINGO: Fix movie fields accidentally defined as movie castmember fields
0cb930dc09 DIRECTOR: LINGO: Add parser support for "member X of castLib Y"
993579d251 DIRECTOR: Refresh sprite cast pointers after a media copy
139df7adb4 DIRECTOR: Print castLib in debug draw overlay
fbbff6d558 DIRECTOR: LINGO: Improve accuracy of b_member
2d32d63f5e DIRECTOR: LINGO: Remove special-case handling in b_value
361a2cbb03 DIRECTOR: Add quirks for noir
03e99900a8 DIRECTOR: LINGO: Make menu callbacks run as the stage
5b6251f716 DIRECTOR: Fix disasm command to support multiple casts
9b2b4127a7 DIRECTOR: Move last keypress information to top level


Commit: 80aef6fbcbf2ca4d81814e187ab50142f7137eec
    https://github.com/scummvm/scummvm/commit/80aef6fbcbf2ca4d81814e187ab50142f7137eec
Author: Scott Percival (code at moral.net.au)
Date: 2026-07-25T13:26:51+02:00

Commit Message:
DIRECTOR: Add support for the digitalVideoTimeScale

Fixes a lot of the player timing logic in Gundam 0079.

Changed paths:
    engines/director/castmember/digitalvideo.cpp
    engines/director/castmember/digitalvideo.h
    engines/director/channel.cpp
    engines/director/lingo/lingo-the.cpp
    engines/director/score.cpp
    engines/director/score.h


diff --git a/engines/director/castmember/digitalvideo.cpp b/engines/director/castmember/digitalvideo.cpp
index 09828990c33..ac63422ed72 100644
--- a/engines/director/castmember/digitalvideo.cpp
+++ b/engines/director/castmember/digitalvideo.cpp
@@ -37,6 +37,7 @@
 #include "director/channel.h"
 #include "director/images.h"
 #include "director/movie.h"
+#include "director/score.h"
 #include "director/window.h"
 #include "director/castmember/digitalvideo.h"
 #include "director/castmember/xtra.h"
@@ -90,7 +91,6 @@ DigitalVideoCastMember::DigitalVideoCastMember(Cast *cast, uint16 castId)
 	_channel = nullptr;
 
 	_getFirstFrame = false;
-	_duration = 0;
 
 	_vflags = 0;
 	_frameRate = 0;
@@ -125,7 +125,6 @@ DigitalVideoCastMember::DigitalVideoCastMember(Cast *cast, uint16 castId, Common
 	_channel = nullptr;
 
 	_getFirstFrame = false;
-	_duration = 0;
 
 	_initialRect = Movie::readRect(stream);
 	_vflags = stream.readUint32();
@@ -197,7 +196,6 @@ DigitalVideoCastMember::DigitalVideoCastMember(Cast *cast, uint16 castId, Digita
 
 	_frameRate = source._frameRate;
 	_getFirstFrame = source._getFirstFrame;
-	_duration = source._duration;
 
 	_video = nullptr;
 	_lastFrame = nullptr;
@@ -379,8 +377,6 @@ bool DigitalVideoCastMember::loadVideo(Common::String path) {
 		_video->setDitheringPalette(_ditheringPalette);
 	}
 
-	_duration = getMovieTotalTime();
-
 	if (_video) {
 		// Setting the initial rect to the actual movie dimensions
 		_initialRect.setWidth(_video->getWidth());
@@ -402,11 +398,11 @@ bool DigitalVideoCastMember::isModified() {
 	// Inelegant, but necessary. isModified will get called on
 	// every screen update, so use it to keep the playback
 	// status up to date.
-	if (_video->endOfVideo()) {
+	if (endOfVideo()) {
 		if (_looping) {
-			_video->rewind();
-		} else if (_channel) {
-			_channel->_movieRate = 0.0;
+			rewindVideo();
+		} else {
+			stopVideo();
 		}
 	}
 
@@ -433,7 +429,7 @@ void DigitalVideoCastMember::startVideo() {
 	}
 
 	if (_video->isPlaying())
-		_video->rewind();
+		rewindVideo();
 	else
 		_video->start();
 
@@ -452,6 +448,10 @@ void DigitalVideoCastMember::stopVideo() {
 
 	_video->stop();
 
+	if (_channel) {
+		_channel->_movieRate = 0.0;
+	}
+
 	debugC(2, kDebugImages, "STOPPING VIDEO %s", _filename.c_str());
 }
 
@@ -462,11 +462,16 @@ void DigitalVideoCastMember::rewindVideo() {
 		return;
 	}
 
-	_video->rewind();
+	seekMovie(_channel->_startTime);
 
 	debugC(2, kDebugImages, "REWINDING VIDEO %s", _filename.c_str());
 }
 
+bool DigitalVideoCastMember::endOfVideo() {
+	return (_video->endOfVideo() ||
+			(getMovieCurrentTimeMillis() >= (uint)(_channel->_stopTime*1000/getTimeScale())));
+}
+
 Graphics::MacWidget *DigitalVideoCastMember::createWidget(Common::Rect &bbox, Channel *channel, SpriteType spriteType) {
 	if (_emptyFile)
 		return nullptr;
@@ -544,23 +549,50 @@ uint DigitalVideoCastMember::getDuration() {
 	if (!_video || !_video->isVideoLoaded()) {
 		loadVideoFromCast();
 	}
-	return _duration;
+	return getMovieTotalTime();
+}
+
+uint DigitalVideoCastMember::getTimeScale() {
+	uint result = MAX(0, g_director->getCurrentMovie()->getScore()->_currentDigitalVideoTimeScale);
+	// If the digitalVideoTimeScale gets set to 0, use the quicktime timescale default of 600
+	if (result == 0) {
+		result = 600;
+	}
+	return result;
 }
 
 uint DigitalVideoCastMember::getMovieCurrentTime() {
 	if (!_video)
 		return 0;
-	int ticks = 1 + ((_video->getTime() * 60 - 1)/1000);
+	int ticks = 1 + ((_video->getTime() * getTimeScale() - 1)/1000);
 	int stamp = MIN<int>(ticks, getMovieTotalTime());
 
 	return stamp;
 }
 
+uint DigitalVideoCastMember::getMovieCurrentTimeMillis() {
+	if (!_video)
+		return 0;
+	int ticks = _video->getTime();
+	int stamp = MIN<int>(ticks, getMovieTotalTime());
+
+	return stamp;
+}
+
+
 uint DigitalVideoCastMember::getMovieTotalTime() {
 	if (!_video)
 		return 0;
 
-	int ticks = 1 + ((_video->getDuration().msecs() * 60 - 1)/1000);
+	int ticks = 1 + ((_video->getDuration().msecs() * getTimeScale() - 1)/1000);
+	return ticks;
+}
+
+uint DigitalVideoCastMember::getMovieTotalTimeMillis() {
+	if (!_video)
+		return 0;
+
+	int ticks = _video->getDuration().msecs();
 	return ticks;
 }
 
@@ -577,7 +609,7 @@ void DigitalVideoCastMember::seekMovie(int stamp) {
 
 	Audio::Timestamp dur = _video->getDuration();
 
-	_video->seek(Audio::Timestamp(_channel->_startTime * 1000 / 60, dur.framerate()));
+	_video->seek(Audio::Timestamp(_channel->_startTime * 1000 / getTimeScale(), dur.framerate()));
 
 	if (_channel->_movieRate == 0.0) {
 		_getFirstFrame = true;
@@ -586,6 +618,14 @@ void DigitalVideoCastMember::seekMovie(int stamp) {
 	_dirty = true;
 }
 
+void DigitalVideoCastMember::setStartTime(int stamp) {
+	if (!_video)
+		return;
+
+	_channel->_startTime = stamp;
+	seekMovie(stamp);
+}
+
 void DigitalVideoCastMember::setStopTime(int stamp) {
 	if (!_channel)
 		return;
@@ -599,7 +639,24 @@ void DigitalVideoCastMember::setStopTime(int stamp) {
 
 	Audio::Timestamp dur = _video->getDuration();
 
-	_video->setEndTime(Audio::Timestamp(_channel->_stopTime * 1000 / 60, dur.framerate()));
+	_video->setEndTime(Audio::Timestamp(_channel->_stopTime * 1000 / getTimeScale(), dur.framerate()));
+}
+
+void DigitalVideoCastMember::setMovieTime(int units) {
+	if (!_video)
+		return;
+
+	// startTime and stopTime are always in ticks (1/60)
+	// movieTime and duration are always in scaling units (1/digitalVideoTimeScale)
+
+	Audio::Timestamp dur = _video->getDuration();
+	_video->seek(Audio::Timestamp(units * 1000 / getTimeScale(), dur.framerate()));
+
+	if (_channel->_movieRate == 0.0) {
+		_getFirstFrame = true;
+	}
+
+	_dirty = true;
 }
 
 void DigitalVideoCastMember::setMovieRate(double rate) {
@@ -622,10 +679,17 @@ void DigitalVideoCastMember::setMovieRate(double rate) {
 			_getFirstFrame = false;
 		}
 		_video->setRate(Common::Rational((int)(rate * 100.0), 100));
+		if ((rate != 0.0) && !_video->isPlaying()) {
+			_video->start();
+		} else if ((rate == 0.0) && _video->isPlaying()) {
+			_video->stop();
+		}
 	}
 
-	if (_video->endOfVideo())
-		_video->rewind();
+	_channel->_movieRate = rate;
+
+	if (endOfVideo())
+		rewindVideo();
 }
 
 void DigitalVideoCastMember::setFrameRate(int rate) {
@@ -642,7 +706,7 @@ Common::String DigitalVideoCastMember::formatInfo() {
 		_initialRect.left, _initialRect.top,
 		_boundingRect.width(), _boundingRect.height(),
 		_boundingRect.left, _boundingRect.top,
-		_filename.c_str(), _duration,
+		_filename.c_str(), getMovieTotalTime(),
 		_enableVideo, _enableSound,
 		_looping, _crop, _center, _showControls
 	);
@@ -746,8 +810,9 @@ Datum DigitalVideoCastMember::getField(int field) {
 		d = _enableSound;
 		break;
 	case kTheTimeScale:
-		warning("STUB: DigitalVideoCastMember::getField(): timeScale not implemented");
-		d = Datum(600); // quicktime default
+		// quicktime defaults to 600
+		// happens irrespective of what the digitalVideoTimeScale is set to
+		d = Datum(600);
 		break;
 	case kTheVideo:
 		d = _enableVideo;
diff --git a/engines/director/castmember/digitalvideo.h b/engines/director/castmember/digitalvideo.h
index ef62b65f7a2..dece8928ce0 100644
--- a/engines/director/castmember/digitalvideo.h
+++ b/engines/director/castmember/digitalvideo.h
@@ -58,12 +58,18 @@ public:
 	void startVideo();
 	void stopVideo();
 	void rewindVideo();
+	bool endOfVideo();
 
+	uint getTimeScale();
 	uint getMovieCurrentTime();
+	uint getMovieCurrentTimeMillis();
 	uint getDuration();
 	uint getMovieTotalTime();
+	uint getMovieTotalTimeMillis();
 	void seekMovie(int stamp);
+	void setStartTime(int stamp);
 	void setStopTime(int stamp);
+	void setMovieTime(int units);
 	void setMovieRate(double rate);
 	void setFrameRate(int rate);
 
@@ -103,7 +109,6 @@ public:
 
 	uint16 _frameRate;
 	bool _getFirstFrame;
-	int _duration;
 
 	Video::VideoDecoder *_video;
 	Graphics::Surface *_lastFrame;
diff --git a/engines/director/channel.cpp b/engines/director/channel.cpp
index e75efbe4274..64aec4398e6 100644
--- a/engines/director/channel.cpp
+++ b/engines/director/channel.cpp
@@ -140,10 +140,14 @@ DirectorPlotData Channel::getPlotData() {
 		// Add override flag for 1-bit images
 		pd.oneBitImage = true;
 	}
+
 	if (!pd.srf && _sprite->_spriteType != kBitmapSprite) {
 		// Shapes come colourized from macDrawPixel
 		pd.ms = _sprite->getShape();
 		pd.applyColor = false;
+	// Disable custom fgColor/bgColor blits for videos
+	} else if (_sprite->_cast && _sprite->_cast->_type == kCastDigitalVideo) {
+		pd.applyColor = false;
 	} else {
 		pd.setApplyColor();
 	}
@@ -645,15 +649,20 @@ void Channel::replaceSprite(Sprite *nextSprite) {
 	if (!(_sprite->_puppet || _sprite->getAutoPuppet(kAPCast)) && (_sprite->_castId != nextSprite->_castId)) {
 		// if there's a video in the old sprite that's different, stop it before we continue
 		if (_sprite->_cast && _sprite->_cast->_type == kCastDigitalVideo) {
-			((DigitalVideoCastMember *)_sprite->_cast)->setChannel(nullptr);
 			((DigitalVideoCastMember *)_sprite->_cast)->stopVideo();
-			((DigitalVideoCastMember *)_sprite->_cast)->rewindVideo();
+			((DigitalVideoCastMember *)_sprite->_cast)->seekMovie(0);
+			((DigitalVideoCastMember *)_sprite->_cast)->setChannel(nullptr);
 		}
 		// if there's a video in the new sprite that's different, start it before we continue
 		if (nextSprite->_cast && nextSprite->_cast->_type == kCastDigitalVideo) {
 			if (((DigitalVideoCastMember *)nextSprite->_cast)->loadVideoFromCast()) {
 				_movieTime = 0;
+				_movieRate = 1.0;
 				((DigitalVideoCastMember *)nextSprite->_cast)->setChannel(this);
+				_startTime = 0;
+
+				_stopTime = ((DigitalVideoCastMember *)nextSprite->_cast)->getMovieTotalTime();
+				((DigitalVideoCastMember *)nextSprite->_cast)->rewindVideo();
 				((DigitalVideoCastMember *)nextSprite->_cast)->startVideo();
 			}
 		}
@@ -872,9 +881,9 @@ CastMemberID Channel::getSubChannelSound2() {
 }
 
 Common::String Channel::formatInfo() {
-	return Common::String::format("[sprite: %s], visible: %d, constraint: %d, movieRate: %f, movieTime: %d (%f), filmLoopFrame: %d",
+	return Common::String::format("[sprite: %s], visible: %d, constraint: %d, movieRate: %f, movieTime: %d (%f), filmLoopFrame: %d, startTime: %d, stopTime: %d",
 		_sprite->formatInfo().c_str(), _visible,
-		_constraint, _movieRate, _movieTime, (float)(_movieTime/60.0f), _filmLoopFrame);
+		_constraint, _movieRate, _movieTime, (float)(_movieTime/60.0f), _filmLoopFrame, _startTime, _stopTime);
 }
 
 } // End of namespace Director
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 05819b2f74b..c2e2b27a77e 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -611,6 +611,9 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 	case kTheDeskTopRectList:
 		d = getTheDeskTopRectList();
 		break;
+	case kTheDigitalVideoTimeScale:
+		d = score->_currentDigitalVideoTimeScale;
+		break;
 	case kTheDoubleClick:
 		// Always measured against the last two clicks.
 		// 25 ticks seems to be the threshold for a double click.
@@ -1262,6 +1265,9 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
 		// We do not need to do anything special to yield to other applications
 		// so, ignore this setting
 		break;
+	case kTheDigitalVideoTimeScale:
+		score->_currentDigitalVideoTimeScale = d.asInt();
+		break;
 	case kTheExitLock:
 		g_lingo->_exitLock = bool(d.asInt());
 		break;
@@ -1718,6 +1724,9 @@ Datum Lingo::getTheSprite(Datum &id1, int field) {
 		d = sprite->_moveable;
 		break;
 	case kTheMovieRate:
+		// make sure the movieRate is up to date
+		if (sprite->_cast && sprite->_cast->_type == kCastDigitalVideo)
+			((DigitalVideoCastMember *)sprite->_cast)->isModified();
 		d = channel->_movieRate;
 		if (debugChannelSet(-1, kDebugEndVideo))
 			d.u.f = 0.0;
@@ -2046,7 +2055,7 @@ void Lingo::setTheSprite(Datum &id1, int field, Datum &d) {
 		channel->_movieTime = d.asInt();
 		if (sprite->_cast && sprite->_cast->_type == kCastDigitalVideo) {
 			((DigitalVideoCastMember *)sprite->_cast)->setChannel(channel);
-			((DigitalVideoCastMember *)sprite->_cast)->seekMovie(channel->_movieTime);
+			((DigitalVideoCastMember *)sprite->_cast)->setMovieTime(channel->_movieTime);
 		} else
 			warning("Setting movieTime for non-digital video");
 		break;
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 0ac0c6d7f40..d079528a851 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -72,6 +72,7 @@ Score::Score(Movie *movie, bool haveInteractivity) {
 	_labels = nullptr;
 
 	_currentFrameRate = 20;
+	_currentDigitalVideoTimeScale = 60;
 	_nextFrame = 0;
 	_currentLabel = 0;
 	_nextFrameTime = 0;
diff --git a/engines/director/score.h b/engines/director/score.h
index de8e5dc08ab..ca88dd10f0c 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -208,6 +208,7 @@ public:
 	Common::MemoryReadStreamEndian *_framesStream;
 
 	byte _currentFrameRate;
+	int _currentDigitalVideoTimeScale;
 	byte _puppetTempo;
 
 	bool _puppetPalette;


Commit: f0d28052262d6298cc19bcb4fd6641e65d876e9b
    https://github.com/scummvm/scummvm/commit/f0d28052262d6298cc19bcb4fd6641e65d876e9b
Author: Scott Percival (code at moral.net.au)
Date: 2026-07-25T13:26:51+02:00

Commit Message:
DIRECTOR: LINGO: Return an integer if the movieRate is near enough

There's at least one game that tries to test if the digital video has
stopped playing by testing "not the movieRate". In Lingo, "not 0.0" is
(of course) false, but real Director will return an integer value for
"the movieRate" -if- the float value is within an epsilon.

Fixes input activation in Gundam 0079.

Changed paths:
    engines/director/lingo/lingo-the.cpp


diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index c2e2b27a77e..ae92b327440 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -1727,9 +1727,14 @@ Datum Lingo::getTheSprite(Datum &id1, int field) {
 		// make sure the movieRate is up to date
 		if (sprite->_cast && sprite->_cast->_type == kCastDigitalVideo)
 			((DigitalVideoCastMember *)sprite->_cast)->isModified();
-		d = channel->_movieRate;
+		// real director will try and snap this to an integer if possible
+		if (ABS(channel->_movieRate - round(channel->_movieRate)) < 0.000001) {
+			d = Datum((int)round(channel->_movieRate));
+		} else {
+			d = Datum(channel->_movieRate);
+		}
 		if (debugChannelSet(-1, kDebugEndVideo))
-			d.u.f = 0.0;
+			d = Datum(0);
 		break;
 	case kTheMovieTime:
 		d = channel->_movieTime;


Commit: 10a9c8bc651d807ba4ce0e4df07357da522bc023
    https://github.com/scummvm/scummvm/commit/10a9c8bc651d807ba4ce0e4df07357da522bc023
Author: Scott Percival (code at moral.net.au)
Date: 2026-07-25T13:26:51+02:00

Commit Message:
DIRECTOR: Fix refcounting with Sprite CastMember pointers

Changed paths:
    engines/director/castmember/filmloop.cpp
    engines/director/sprite.cpp


diff --git a/engines/director/castmember/filmloop.cpp b/engines/director/castmember/filmloop.cpp
index ce5c92e69df..d6fcc94465c 100644
--- a/engines/director/castmember/filmloop.cpp
+++ b/engines/director/castmember/filmloop.cpp
@@ -78,13 +78,18 @@ FilmLoopCastMember::FilmLoopCastMember(Cast *cast, uint16 castId, FilmLoopCastMe
 	_enableSound = source._enableSound;
 	_crop = source._crop;
 	_center = source._center;
-	_score = source._score;
+	_score = nullptr;
+	if (source._score)
+		_score = new Score(*source._score);
 	_subchannels = source._subchannels;
 	_looping = source._looping;
 }
 
 FilmLoopCastMember::~FilmLoopCastMember() {
-
+	if (_score) {
+		delete _score;
+		_score = nullptr;
+	}
 }
 
 bool FilmLoopCastMember::isModified() {
@@ -139,7 +144,7 @@ Common::Array<Channel> *FilmLoopCastMember::getSubChannels(Common::Rect &bbox, u
 			continue;
 
 		if (src._cast == nullptr && _cast != nullptr)
-			src._cast = _cast->getCastMember(src._castId.member, true);
+			src.setCast(src._castId);
 
 		debugCN(5, kDebugImages, "FilmLoopCastMember::getSubChannels(): sprite: %d - cast: %s, orig: %d,%d %dx%d",
 				iter, src._castId.asString().c_str(),
@@ -237,6 +242,11 @@ void FilmLoopCastMember::load() {
 		warning("STUB: FilmLoopCastMember::load(): Film loops not yet supported for version v%d (%d)", humanVersion(_cast->_version), _cast->_version);
 	}
 
+	if (_score) {
+		delete _score;
+		_score = nullptr;
+	}
+
 	if (loop) {
 		debugC(2, kDebugLoading, "****** FilmLoopCastMember::load(): Loading '%s' id: %d, %d bytes", tag2str(tag), filmLoopId, (int)loop->size());
 		_score = new Score(g_director->getCurrentMovie(), false);
diff --git a/engines/director/sprite.cpp b/engines/director/sprite.cpp
index ba7ce20a3cc..65d66c9399d 100644
--- a/engines/director/sprite.cpp
+++ b/engines/director/sprite.cpp
@@ -41,6 +41,7 @@ Sprite::Sprite(Frame *frame) {
 	_matte = nullptr;
 	_puppet = false;
 	_autoPuppet = kAPNone; // Based on Director in a Nutshell, page 15
+	_cast = nullptr;
 	reset();
 }
 
@@ -63,7 +64,10 @@ void Sprite::reset() {
 	if (_matte)
 		delete _matte;
 	_matte = nullptr;
-	_cast = nullptr;
+	if (_cast) {
+		_cast->decRefCount();
+		_cast = nullptr;
+	}
 
 	_thickness = 0;
 	_width = 0;
@@ -112,6 +116,8 @@ Sprite& Sprite::operator=(const Sprite &sprite) {
 	_trails = sprite._trails;
 
 	_cast = sprite._cast;
+	if (_cast)
+		_cast->incRefCount();
 
 	if (_matte)
 		delete _matte;
@@ -168,8 +174,15 @@ Sprite::Sprite(const Sprite &sprite) {
 }
 
 Sprite::~Sprite() {
-	if (_matte)
+	if (_cast) {
+		_cast->decRefCount();
+		_cast = nullptr;
+	}
+
+	if (_matte) {
 		delete _matte;
+		_matte = nullptr;
+	}
 }
 
 bool Sprite::isQDShape() {
@@ -349,8 +362,8 @@ bool Sprite::respondsToMouse() {
 
 	ScriptContext *spriteScript = _movie->getScriptContext(kScoreScript, _scriptId);
 	if (spriteScript && (spriteScript->_eventHandlers.contains(kEventGeneric)
-					  || spriteScript->_eventHandlers.contains(kEventMouseDown)
-					  || spriteScript->_eventHandlers.contains(kEventMouseUp)))
+					|| spriteScript->_eventHandlers.contains(kEventMouseDown)
+					|| spriteScript->_eventHandlers.contains(kEventMouseUp)))
 		return true;
 
 	ScriptContext *castScript = _movie->getScriptContext(kCastScript, _castId);
@@ -369,7 +382,7 @@ bool Sprite::isActive() {
 		return true;
 
 	return (_movie->getScriptContext(kScoreScript, _scriptId) != nullptr)
-			|| (_movie->getScriptContext(kCastScript, _castId) != nullptr);
+		|| (_movie->getScriptContext(kCastScript, _castId) != nullptr);
 }
 
 bool Sprite::shouldHilite() {
@@ -562,12 +575,16 @@ void Sprite::setCast(CastMemberID memberID, bool replaceDims) {
 	 */
 
 	_castId = memberID;
+	if (_cast) {
+		_cast->decRefCount();
+	}
 	_cast = _movie->getCastMember(_castId);
 	//As QDShapes don't have an associated cast, we must not change their _SpriteType.
 	if (g_director->getVersion() >= 400 && !isQDShape() && _castId != CastMemberID(0, 0))
 		_spriteType = kCastMemberSprite;
 
 	if (_cast) {
+		_cast->incRefCount();
 		if (g_director->getVersion() >= 400) {
 			// Set the sprite type to be more specific ONLY for bitmap or text.
 			// Others just use the generic kCastMemberSprite in D4.
@@ -685,7 +702,11 @@ void Sprite::replaceFrom(Sprite *nextSprite) {
 	if (!getAutoPuppet(kAPCast)) {
 		if (nextSprite->_copyBackMask & kSCBCastId) {
 			_castId = nextSprite->_castId;
+			if (_cast)
+				_cast->decRefCount();
 			_cast = nextSprite->_cast;
+			if (_cast)
+				_cast->incRefCount();
 		}
 		if (nextSprite->_copyBackMask & kSCBSpriteListIdx)
 			_spriteListIdx = nextSprite->_spriteListIdx;


Commit: bec32ee2d3896815356279bf15f2776a47199d3c
    https://github.com/scummvm/scummvm/commit/bec32ee2d3896815356279bf15f2776a47199d3c
Author: Scott Percival (code at moral.net.au)
Date: 2026-07-25T13:26:51+02:00

Commit Message:
DIRECTOR: LINGO: Add Xtra stubs for getaheadmath

Changed paths:
  A engines/director/lingo/xtras/f/fileflex.cpp
  A engines/director/lingo/xtras/f/fileflex.h
  A engines/director/lingo/xtras/f/fileutil.cpp
  A engines/director/lingo/xtras/f/fileutil.h
  A engines/director/lingo/xtras/m/mbox.cpp
  A engines/director/lingo/xtras/m/mbox.h
    engines/director/lingo/lingo-object.cpp
    engines/director/lingo/lingo-patcher.cpp
    engines/director/lingo/xlibs/p/printomatic.cpp
    engines/director/module.mk


diff --git a/engines/director/lingo/lingo-object.cpp b/engines/director/lingo/lingo-object.cpp
index f54fb268dca..158691a8179 100644
--- a/engines/director/lingo/lingo-object.cpp
+++ b/engines/director/lingo/lingo-object.cpp
@@ -164,12 +164,15 @@
 #include "director/lingo/xtras/d/directsound.h"
 #include "director/lingo/xtras/d/displayres.h"
 #include "director/lingo/xtras/d/datetime.h"
+#include "director/lingo/xtras/f/fileflex.h"
+#include "director/lingo/xtras/f/fileutil.h"
 #include "director/lingo/xtras/f/filextra.h"
 #include "director/lingo/xtras/f/filextra4.h"
 #include "director/lingo/xtras/g/getdir.h"
 #include "director/lingo/xtras/g/glu32.h"
 #include "director/lingo/xtras/k/keypoll.h"
 #include "director/lingo/xtras/m/masterapp.h"
+#include "director/lingo/xtras/m/mbox.h"
 #include "director/lingo/xtras/m/mui.h"
 #include "director/lingo/xtras/n/netlingo.h"
 #include "director/lingo/xtras/o/openurl.h"
@@ -304,7 +307,9 @@ static const struct XLibProto {
 	XLIBDEF(FadeGammaUpXCMD,	kXObj,			400),	// D4
 	XLIBDEF(FadeGammaXCMD,		kXObj,			400),	// D4
 	XLIBDEF(FileExists,			kXObj,			300),	// D3
+	XLIBDEF(FileFlexXtra,			kXtraObj,					500),	// D5
 	XLIBDEF(FileIO,				kXObj | kXtraObj,200),	// D2
+	XLIBDEF(FileUtilXtra,			kXtraObj,					500),	// D5
 	XLIBDEF(FileXtra,			kXtraObj,		500),	// D5
 	XLIBDEF(FileXtra4Xtra,			kXtraObj,					500),	// D5
 	XLIBDEF(FindFolder,			kXObj,			300),	// D3
@@ -335,6 +340,7 @@ static const struct XLibProto {
 	XLIBDEF(KeypollXtra,		kXtraObj,		500),	// D5
 	XLIBDEF(LabelDrvXObj,		kXObj,			400),	// D4
 	XLIBDEF(ListDevXObj,		kXObj,			500),	// D5
+	XLIBDEF(MBoxXtra,			kXtraObj,					500),	// D5
 	XLIBDEF(MMovieXObj,			kXObj,			400),	// D4
 	XLIBDEF(ManiacBgXObj,		kXObj,			300),	// D3
 	XLIBDEF(MapNavigatorXObj,	kXObj,			400),	// D4
@@ -514,6 +520,10 @@ void Lingo::openXLib(Common::String name, ObjectType type, const Common::Path &p
 		(*_xlibOpeners[name])(type, path);
 	} else {
 		warning("Lingo::openXLib: Unimplemented xlib: '%s'", name.c_str());
+		// in strict mode, break if the library is missing
+		if (debugChannelSet(-1, kDebugLingoStrict)) {
+			error("Lingo::openXLib: Unimplemented xlib: '%s'", name.c_str());
+		}
 	}
 }
 
diff --git a/engines/director/lingo/lingo-patcher.cpp b/engines/director/lingo/lingo-patcher.cpp
index b1ce786036f..0bd3f0741e0 100644
--- a/engines/director/lingo/lingo-patcher.cpp
+++ b/engines/director/lingo/lingo-patcher.cpp
@@ -517,6 +517,32 @@ on checkFiles\r\
 end\r\
 ";
 
+/*
+ * Math Heads checks if the program is running from the "HDFiles" folder, infers
+ * that to be on the CD, then bails. This method sets up the path for the game, so we need to
+ * remove the check/abort.
+ */
+const char *const getaheadmathDiskFix = "\
+on readHDPath me\r\
+  set channelsFolder to the pathName\r\
+  setPath(me, #Channels, channelsFolder)\r\
+  set HDPath to channelsFolder\r\
+  set theOldDelim to the itemDelimiter\r\
+  set the itemDelimiter to gColon\r\
+  set lastColon to the number of items in HDPath\r\
+  delete item (lastColon - 1) of HDPath\r\
+  if macOS() then\r\
+    set hardDiskVolume to item 1 of HDPath\r\
+  else\r\
+    set hardDiskVolume to char 1 of HDPath & \":\\\"\r\
+  end if\r\
+  set lastItem to the number of items in HDPath\r\
+  set folderName to item (lastItem - 1) of HDPath\r\
+  set the itemDelimiter to theOldDelim\r\
+  setPath(me, #HD, HDPath)\r\
+end\r\
+";
+
 /*
  * Journeyman Project has inventory scroll buttons which repeat while the mouse button
  * is held down. On fast systems (i.e. us) this is quite unpleasant to use.
@@ -575,6 +601,7 @@ struct ScriptHandlerPatch {
 	{"mcmillennium", nullptr, kPlatformWindows, "PC\\SHARED.DXR", kMovieScript, 1013, DEFAULT_CAST_LIB, &mcmillenniumDriveDetectionFix},
 	{"mcmillennium", nullptr, kPlatformMacintosh, "Mission Code Millennium:SHARED.Dxr", kMovieScript, 1013, DEFAULT_CAST_LIB, &mcmillenniumDriveDetectionFix},
 	{"gordak", nullptr, kPlatformWindows, "GORDAKCD.EXE", kMovieScript, 2, DEFAULT_CAST_LIB, &gordakDetectionFix},
+	{"getaheadmath", nullptr, kPlatformWindows, "HDFILES\\CHANNELS\\BASE.CST", kParentScript, 69, 2, &getaheadmathDiskFix},
 	{"jman", "v1.2", kPlatformMacintosh, "Support Files:Mars ESG Upper 03", kMovieScript, 322, DEFAULT_CAST_LIB, &jmanInventory},
 	{nullptr, nullptr, kPlatformUnknown, nullptr, kNoneScript, 0, 0, nullptr},
 
diff --git a/engines/director/lingo/xlibs/p/printomatic.cpp b/engines/director/lingo/xlibs/p/printomatic.cpp
index 467dc13054e..eefff094175 100644
--- a/engines/director/lingo/xlibs/p/printomatic.cpp
+++ b/engines/director/lingo/xlibs/p/printomatic.cpp
@@ -32,6 +32,7 @@
  * USED IN:
  * Plates are People Too!
  * I Spy
+ * getaheadmath
  *
  **************************************************/
 
@@ -196,6 +197,7 @@ const char *PrintOMaticXObj::xlibName = "PrintOMatic";
 const XlibFileDesc PrintOMaticXObj::fileNames[] = {
 	{ "PrintOMatic",   nullptr },
 	{ "PMATIC",   nullptr },
+	{ "POMLITE",   nullptr },
 	{ nullptr,        nullptr },
 };
 
diff --git a/engines/director/lingo/xtras/f/fileflex.cpp b/engines/director/lingo/xtras/f/fileflex.cpp
new file mode 100644
index 00000000000..9763b50a8a3
--- /dev/null
+++ b/engines/director/lingo/xtras/f/fileflex.cpp
@@ -0,0 +1,112 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/system.h"
+
+#include "director/director.h"
+#include "director/lingo/lingo.h"
+#include "director/lingo/lingo-object.h"
+#include "director/lingo/lingo-utils.h"
+#include "director/lingo/xtras/f/fileflex.h"
+
+/**************************************************
+ *
+ * USED IN:
+ * getaheadmath
+ *
+ **************************************************/
+
+/*
+-- xtra FileFlex
+new object me
+forget object me
+getv object me --> any
+setv object me, any object
+-- FFXtra --
+*FileFlex * -- FileFlex entry call
+ */
+
+namespace Director {
+
+const char *FileFlexXtra::xlibName = "FileFlex";
+const XlibFileDesc FileFlexXtra::fileNames[] = {
+	{ "fileflex",   nullptr },
+	{ nullptr,        nullptr },
+};
+
+static MethodProto xlibMethods[] = {
+	{ "new",				FileFlexXtra::m_new,		 0, 0,	500 },
+	{ "forget",				FileFlexXtra::m_forget,		 0, 0,	500 },
+	{ "getv",				FileFlexXtra::m_getv,		 0, 0,	500 },
+	{ "setv",				FileFlexXtra::m_setv,		 1, 1,	500 },
+
+	{ nullptr, nullptr, 0, 0, 0 }
+};
+
+static BuiltinProto xlibBuiltins[] = {
+	{ "FileFlex", FileFlexXtra::m_FileFlex, -1, 0, 500, HBLTIN },
+	{ nullptr, nullptr, 0, 0, 0, VOIDSYM }
+};
+
+FileFlexXtraObject::FileFlexXtraObject(ObjectType ObjectType) :Object<FileFlexXtraObject>("FileFlex") {
+	_objType = ObjectType;
+}
+
+bool FileFlexXtraObject::hasProp(const Common::String &propName) {
+	return (propName == "name");
+}
+
+Datum FileFlexXtraObject::getProp(const Common::String &propName) {
+	if (propName == "name")
+		return Datum(FileFlexXtra::xlibName);
+	warning("FileFlexXtra::getProp: unknown property '%s'", propName.c_str());
+	return Datum();
+}
+
+void FileFlexXtra::open(ObjectType type, const Common::Path &path) {
+    FileFlexXtraObject::initMethods(xlibMethods);
+    FileFlexXtraObject *xobj = new FileFlexXtraObject(type);
+    if (type == kXtraObj) {
+        g_lingo->_openXtras.push_back(xlibName);
+        g_lingo->_openXtraObjects.push_back(xobj);
+    }
+    g_lingo->exposeXObject(xlibName, xobj);
+    g_lingo->initBuiltIns(xlibBuiltins);
+}
+
+void FileFlexXtra::close(ObjectType type) {
+    FileFlexXtraObject::cleanupMethods();
+    g_lingo->_globalvars[xlibName] = Datum();
+
+}
+
+void FileFlexXtra::m_new(int nargs) {
+	g_lingo->printSTUBWithArglist("FileFlexXtra::m_new", nargs);
+	g_lingo->dropStack(nargs);
+	g_lingo->push(g_lingo->_state->me);
+}
+
+XOBJSTUB(FileFlexXtra::m_forget, 0)
+XOBJSTUB(FileFlexXtra::m_getv, 0)
+XOBJSTUB(FileFlexXtra::m_setv, 0)
+XOBJSTUB(FileFlexXtra::m_FileFlex, 0)
+
+}
diff --git a/engines/director/lingo/xtras/f/fileflex.h b/engines/director/lingo/xtras/f/fileflex.h
new file mode 100644
index 00000000000..a366fd06b0b
--- /dev/null
+++ b/engines/director/lingo/xtras/f/fileflex.h
@@ -0,0 +1,53 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef DIRECTOR_LINGO_XTRAS_F_FILEFLEX_H
+#define DIRECTOR_LINGO_XTRAS_F_FILEFLEX_H
+
+namespace Director {
+
+class FileFlexXtraObject : public Object<FileFlexXtraObject> {
+public:
+	FileFlexXtraObject(ObjectType objType);
+
+	bool hasProp(const Common::String &propName) override;
+	Datum getProp(const Common::String &propName) override;
+};
+
+namespace FileFlexXtra {
+
+extern const char *xlibName;
+extern const XlibFileDesc fileNames[];
+
+void open(ObjectType type, const Common::Path &path);
+void close(ObjectType type);
+
+void m_new(int nargs);
+void m_forget(int nargs);
+void m_getv(int nargs);
+void m_setv(int nargs);
+void m_FileFlex(int nargs);
+
+} // End of namespace FileFlexXtra
+
+} // End of namespace Director
+
+#endif
diff --git a/engines/director/lingo/xtras/f/fileutil.cpp b/engines/director/lingo/xtras/f/fileutil.cpp
new file mode 100644
index 00000000000..a78e32b3a59
--- /dev/null
+++ b/engines/director/lingo/xtras/f/fileutil.cpp
@@ -0,0 +1,125 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/system.h"
+
+#include "director/director.h"
+#include "director/lingo/lingo.h"
+#include "director/lingo/lingo-object.h"
+#include "director/lingo/lingo-utils.h"
+#include "director/lingo/xtras/f/fileutil.h"
+
+/**************************************************
+ *
+ * USED IN:
+ * getaheadmath
+ *
+ **************************************************/
+
+/*
+-- xtra FileUtil
+-- FileUtil Xtra of 24-Jun-96 copyright (c) 1996 Little Planet Publishing
+-- File System Functions --
+* FileExists string fileName
+* RenameFile string oldName, string newName
+* DeleteFile string fileName
+* CopyFile string fromFName, string toFName
+* DirectoryExists string dirName
+* CreateDirectory string dirName
+* DeleteDirectory string dirName
+* XDeleteDirectory string dirName
+* CopyDirectory string fromDirName, string toDirName
+* XCopyDirectory string fromDirName, string toDirName
+* DirectoryToList string dirName
+ */
+
+namespace Director {
+
+const char *FileUtilXtra::xlibName = "FileUtil";
+const XlibFileDesc FileUtilXtra::fileNames[] = {
+	{ "fileutil",   nullptr },
+	{ nullptr,        nullptr },
+};
+
+static MethodProto xlibMethods[] = {
+	{ nullptr, nullptr, 0, 0, 0 }
+};
+
+static BuiltinProto xlibBuiltins[] = {
+	{ "FileExists", FileUtilXtra::m_FileExists, 1, 1, 500, HBLTIN },
+	{ "RenameFile", FileUtilXtra::m_RenameFile, 2, 2, 500, HBLTIN },
+	{ "DeleteFile", FileUtilXtra::m_DeleteFile, 1, 1, 500, HBLTIN },
+	{ "CopyFile", FileUtilXtra::m_CopyFile, 2, 2, 500, HBLTIN },
+	{ "DirectoryExists", FileUtilXtra::m_DirectoryExists, 1, 1, 500, HBLTIN },
+	{ "CreateDirectory", FileUtilXtra::m_CreateDirectory, 1, 1, 500, HBLTIN },
+	{ "DeleteDirectory", FileUtilXtra::m_DeleteDirectory, 1, 1, 500, HBLTIN },
+	{ "XDeleteDirectory", FileUtilXtra::m_XDeleteDirectory, 1, 1, 500, HBLTIN },
+	{ "CopyDirectory", FileUtilXtra::m_CopyDirectory, 2, 2, 500, HBLTIN },
+	{ "XCopyDirectory", FileUtilXtra::m_XCopyDirectory, 2, 2, 500, HBLTIN },
+	{ "DirectoryToList", FileUtilXtra::m_DirectoryToList, 1, 1, 500, HBLTIN },
+	{ nullptr, nullptr, 0, 0, 0, VOIDSYM }
+};
+
+FileUtilXtraObject::FileUtilXtraObject(ObjectType ObjectType) :Object<FileUtilXtraObject>("FileUtil") {
+	_objType = ObjectType;
+}
+
+bool FileUtilXtraObject::hasProp(const Common::String &propName) {
+	return (propName == "name");
+}
+
+Datum FileUtilXtraObject::getProp(const Common::String &propName) {
+	if (propName == "name")
+		return Datum(FileUtilXtra::xlibName);
+	warning("FileUtilXtra::getProp: unknown property '%s'", propName.c_str());
+	return Datum();
+}
+
+void FileUtilXtra::open(ObjectType type, const Common::Path &path) {
+    FileUtilXtraObject::initMethods(xlibMethods);
+    FileUtilXtraObject *xobj = new FileUtilXtraObject(type);
+    if (type == kXtraObj) {
+        g_lingo->_openXtras.push_back(xlibName);
+        g_lingo->_openXtraObjects.push_back(xobj);
+    }
+    g_lingo->exposeXObject(xlibName, xobj);
+    g_lingo->initBuiltIns(xlibBuiltins);
+}
+
+void FileUtilXtra::close(ObjectType type) {
+    FileUtilXtraObject::cleanupMethods();
+    g_lingo->_globalvars[xlibName] = Datum();
+
+}
+
+XOBJSTUB(FileUtilXtra::m_FileExists, 0)
+XOBJSTUB(FileUtilXtra::m_RenameFile, 0)
+XOBJSTUB(FileUtilXtra::m_DeleteFile, 0)
+XOBJSTUB(FileUtilXtra::m_CopyFile, 0)
+XOBJSTUB(FileUtilXtra::m_DirectoryExists, 0)
+XOBJSTUB(FileUtilXtra::m_CreateDirectory, 0)
+XOBJSTUB(FileUtilXtra::m_DeleteDirectory, 0)
+XOBJSTUB(FileUtilXtra::m_XDeleteDirectory, 0)
+XOBJSTUB(FileUtilXtra::m_CopyDirectory, 0)
+XOBJSTUB(FileUtilXtra::m_XCopyDirectory, 0)
+XOBJSTUB(FileUtilXtra::m_DirectoryToList, 0)
+
+}
diff --git a/engines/director/lingo/xtras/f/fileutil.h b/engines/director/lingo/xtras/f/fileutil.h
new file mode 100644
index 00000000000..0c379ee88fb
--- /dev/null
+++ b/engines/director/lingo/xtras/f/fileutil.h
@@ -0,0 +1,59 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef DIRECTOR_LINGO_XTRAS_F_FILEUTIL_H
+#define DIRECTOR_LINGO_XTRAS_F_FILEUTIL_H
+
+namespace Director {
+
+class FileUtilXtraObject : public Object<FileUtilXtraObject> {
+public:
+	FileUtilXtraObject(ObjectType objType);
+
+	bool hasProp(const Common::String &propName) override;
+	Datum getProp(const Common::String &propName) override;
+};
+
+namespace FileUtilXtra {
+
+extern const char *xlibName;
+extern const XlibFileDesc fileNames[];
+
+void open(ObjectType type, const Common::Path &path);
+void close(ObjectType type);
+
+void m_FileExists(int nargs);
+void m_RenameFile(int nargs);
+void m_DeleteFile(int nargs);
+void m_CopyFile(int nargs);
+void m_DirectoryExists(int nargs);
+void m_CreateDirectory(int nargs);
+void m_DeleteDirectory(int nargs);
+void m_XDeleteDirectory(int nargs);
+void m_CopyDirectory(int nargs);
+void m_XCopyDirectory(int nargs);
+void m_DirectoryToList(int nargs);
+
+} // End of namespace FileUtilXtra
+
+} // End of namespace Director
+
+#endif
diff --git a/engines/director/lingo/xtras/m/mbox.cpp b/engines/director/lingo/xtras/m/mbox.cpp
new file mode 100644
index 00000000000..d3d8a56765a
--- /dev/null
+++ b/engines/director/lingo/xtras/m/mbox.cpp
@@ -0,0 +1,127 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "common/system.h"
+
+#include "director/director.h"
+#include "director/lingo/lingo.h"
+#include "director/lingo/lingo-object.h"
+#include "director/lingo/lingo-utils.h"
+#include "director/lingo/xtras/m/mbox.h"
+
+/**************************************************
+ *
+ * USED IN:
+ * getaheadmath
+ *
+ **************************************************/
+
+/*
+-- xtra MBoxXtra
+new object me
+forget object me  	--(do't call directly) dispose of the text to speech object
+-- Global Handlers --
+* OKMsgBox string msg
+* YESNOMsgBox string msg
+* OKCANCELMsgBox string msg
+* RETRYCANCELMsgBox string msg
+* YESNOCANCELMsgBox string msg
+* DiskSpaceAvailable string volume
+* WindowsFileLimit integer numfiles
+* WindowsFileAttr string fileName,integer attribute
+ */
+
+namespace Director {
+
+const char *MBoxXtra::xlibName = "MBoxXtra";
+const XlibFileDesc MBoxXtra::fileNames[] = {
+	{ "mboxx",   nullptr },
+	{ nullptr,        nullptr },
+};
+
+static MethodProto xlibMethods[] = {
+	{ "new",				MBoxXtra::m_new,		 0, 0,	500 },
+	{ "forget",				MBoxXtra::m_forget,		 0, 0,	500 },
+
+	{ nullptr, nullptr, 0, 0, 0 }
+};
+
+static BuiltinProto xlibBuiltins[] = {
+	{ "OKMsgBox", MBoxXtra::m_OKMsgBox, 1, 1, 500, HBLTIN },
+	{ "YESNOMsgBox", MBoxXtra::m_YESNOMsgBox, 1, 1, 500, HBLTIN },
+	{ "OKCANCELMsgBox", MBoxXtra::m_OKCANCELMsgBox, 1, 1, 500, HBLTIN },
+	{ "RETRYCANCELMsgBox", MBoxXtra::m_RETRYCANCELMsgBox, 1, 1, 500, HBLTIN },
+	{ "YESNOCANCELMsgBox", MBoxXtra::m_YESNOCANCELMsgBox, 1, 1, 500, HBLTIN },
+	{ "DiskSpaceAvailable", MBoxXtra::m_DiskSpaceAvailable, 1, 1, 500, HBLTIN },
+	{ "WindowsFileLimit", MBoxXtra::m_WindowsFileLimit, 1, 1, 500, HBLTIN },
+	{ "WindowsFileAttr", MBoxXtra::m_WindowsFileAttr, 2, 2, 500, HBLTIN },
+	{ nullptr, nullptr, 0, 0, 0, VOIDSYM }
+};
+
+MBoxXtraObject::MBoxXtraObject(ObjectType ObjectType) :Object<MBoxXtraObject>("MBox") {
+	_objType = ObjectType;
+}
+
+bool MBoxXtraObject::hasProp(const Common::String &propName) {
+	return (propName == "name");
+}
+
+Datum MBoxXtraObject::getProp(const Common::String &propName) {
+	if (propName == "name")
+		return Datum(MBoxXtra::xlibName);
+	warning("MBoxXtra::getProp: unknown property '%s'", propName.c_str());
+	return Datum();
+}
+
+void MBoxXtra::open(ObjectType type, const Common::Path &path) {
+    MBoxXtraObject::initMethods(xlibMethods);
+    MBoxXtraObject *xobj = new MBoxXtraObject(type);
+    if (type == kXtraObj) {
+        g_lingo->_openXtras.push_back(xlibName);
+        g_lingo->_openXtraObjects.push_back(xobj);
+    }
+    g_lingo->exposeXObject(xlibName, xobj);
+    g_lingo->initBuiltIns(xlibBuiltins);
+}
+
+void MBoxXtra::close(ObjectType type) {
+    MBoxXtraObject::cleanupMethods();
+    g_lingo->_globalvars[xlibName] = Datum();
+
+}
+
+void MBoxXtra::m_new(int nargs) {
+	g_lingo->printSTUBWithArglist("MBoxXtra::m_new", nargs);
+	g_lingo->dropStack(nargs);
+	g_lingo->push(g_lingo->_state->me);
+}
+
+XOBJSTUB(MBoxXtra::m_forget, 0)
+XOBJSTUB(MBoxXtra::m_OKMsgBox, 0)
+XOBJSTUB(MBoxXtra::m_YESNOMsgBox, 0)
+XOBJSTUB(MBoxXtra::m_OKCANCELMsgBox, 0)
+XOBJSTUB(MBoxXtra::m_RETRYCANCELMsgBox, 0)
+XOBJSTUB(MBoxXtra::m_YESNOCANCELMsgBox, 0)
+XOBJSTUB(MBoxXtra::m_DiskSpaceAvailable, 700)
+XOBJSTUB(MBoxXtra::m_WindowsFileLimit, 40)
+XOBJSTUB(MBoxXtra::m_WindowsFileAttr, 0)
+
+}
diff --git a/engines/director/lingo/xtras/m/mbox.h b/engines/director/lingo/xtras/m/mbox.h
new file mode 100644
index 00000000000..e5e7d506ebc
--- /dev/null
+++ b/engines/director/lingo/xtras/m/mbox.h
@@ -0,0 +1,58 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef DIRECTOR_LINGO_XTRAS_M_MBOX_H
+#define DIRECTOR_LINGO_XTRAS_M_MBOX_H
+
+namespace Director {
+
+class MBoxXtraObject : public Object<MBoxXtraObject> {
+public:
+	MBoxXtraObject(ObjectType objType);
+
+	bool hasProp(const Common::String &propName) override;
+	Datum getProp(const Common::String &propName) override;
+};
+
+namespace MBoxXtra {
+
+extern const char *xlibName;
+extern const XlibFileDesc fileNames[];
+
+void open(ObjectType type, const Common::Path &path);
+void close(ObjectType type);
+
+void m_new(int nargs);
+void m_forget(int nargs);
+void m_OKMsgBox(int nargs);
+void m_YESNOMsgBox(int nargs);
+void m_OKCANCELMsgBox(int nargs);
+void m_RETRYCANCELMsgBox(int nargs);
+void m_YESNOCANCELMsgBox(int nargs);
+void m_DiskSpaceAvailable(int nargs);
+void m_WindowsFileLimit(int nargs);
+void m_WindowsFileAttr(int nargs);
+
+} // End of namespace MBoxXtra
+
+} // End of namespace Director
+
+#endif
diff --git a/engines/director/module.mk b/engines/director/module.mk
index f72a349718b..01fb48d516a 100644
--- a/engines/director/module.mk
+++ b/engines/director/module.mk
@@ -197,12 +197,15 @@ MODULE_OBJS = \
 	lingo/xtras/d/datetime.o \
 	lingo/xtras/d/directsound.o \
 	lingo/xtras/d/displayres.o \
+	lingo/xtras/f/fileflex.o \
+	lingo/xtras/f/fileutil.o \
 	lingo/xtras/f/filextra.o \
 	lingo/xtras/f/filextra4.o \
 	lingo/xtras/g/getdir.o \
 	lingo/xtras/g/glu32.o \
 	lingo/xtras/k/keypoll.o \
 	lingo/xtras/m/masterapp.o \
+	lingo/xtras/m/mbox.o \
 	lingo/xtras/m/mui.o \
 	lingo/xtras/n/netlingo.o \
 	lingo/xtras/o/openurl.o \


Commit: 53c936e20d76bce7eee6fa8402d5b065bc63cbf7
    https://github.com/scummvm/scummvm/commit/53c936e20d76bce7eee6fa8402d5b065bc63cbf7
Author: Scott Percival (code at moral.net.au)
Date: 2026-07-25T13:26:51+02:00

Commit Message:
DIRECTOR: LINGO: Fix movie fields accidentally defined as movie castmember fields

Changed paths:
    engines/director/lingo/lingo-the.cpp
    engines/director/lingo/lingo-the.h


diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index ae92b327440..987872e762d 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -136,6 +136,8 @@ TheEntity entities[] = {					//	hasId  ver.	isFunction
 	{ kTheNetThrottleTicks,	"netThrottleTicks",	false, 600, true }, //					D6 f, documented in D7
 	{ kTheOptionDown,		"optionDown",		false, 200, true },	// D2 f
 	{ kTheOrganizationName,	"organizationName",	false, 500, false },//				D5 p, documented in D7
+
+	{ kThePaletteMapping,		"paletteMapping",		false, 500, false },	//				D5 p
 	{ kTheParamCount,		"paramCount",		false, 400, true },	//			D4 f
 	{ kThePathName,			"pathName",			false, 200, true },	// D2 f
 	{ kThePauseState,		"pauseState",		false, 200, true },	// D2 f
@@ -156,6 +158,7 @@ TheEntity entities[] = {					//	hasId  ver.	isFunction
 	{ kTheRunMode, 			"runMode",			false, 500, false },//				D5 f, documented in D6
 	{ kTheSafePlayer,		"safePlayer",		false, 600, false },//					D6 p, documented in D7
 	{ kTheScore,			"score",			false, 500, false },//				D5 p
+	{ kTheScoreSelection,		"scoreSelection",			false, 500, false },//				D5 p
 	{ kTheScummvmVersion,	"scummvmVersion",	false, 200, true }, // 					ScummVM only
 	{ kTheSearchCurrentFolder,"searchCurrentFolder",false,400, true },//		D4 f
 	{ kTheSearchPath,		"searchPath",		false, 400, true },	//			D4 f
@@ -192,6 +195,7 @@ TheEntity entities[] = {					//	hasId  ver.	isFunction
 	{ kTheTraceLoad,		"traceLoad",		false, 400, false },//			D4 p
 	{ kTheTraceLogFile,		"traceLogFile",		false, 400, false },//			D4 p
 	{ kTheUpdateMovieEnabled,"updateMovieEnabled",false,400, false },//			D4 p
+	{ kTheUpdateLock,			"updateLock",			false, 500, false },//				D5 p
 	{ kTheUserName,			"userName",			false, 500, false },//				D5 p, documented in D7
 	{ kTheVideoForWindowsPresent,"videoForWindowsPresent",false, 400, true },//	D4 f
 	{ kTheWindow,			"window",			true,  400, false },//			D4
@@ -304,10 +308,7 @@ const TheEntityField fields[] = {
 	// tracks, number of track, seems to be unused
 
 	// Movie fields
-	{ kTheCast,		"paletteMapping",	kThePaletteMapping,	500 },//			D5 p
 	{ kTheCast,		"scriptsEnabled",	kTheScriptsEnabled,	500 },//			D5 p
-	{ kTheCast,		"scoreSelection",	kTheScoreSelection,	500 },//			D5 p
-	{ kTheCast,		"updateLock",		kTheUpdateLock,		500 },//			D5 p
 
 	// Bitmap fields
 	{ kTheCast,		"depth",		kTheDepth,		400 },//				D4 p
diff --git a/engines/director/lingo/lingo-the.h b/engines/director/lingo/lingo-the.h
index 451499c9927..520730e1498 100644
--- a/engines/director/lingo/lingo-the.h
+++ b/engines/director/lingo/lingo-the.h
@@ -119,6 +119,7 @@ enum TheEntityType {
 	kTheNetThrottleTicks,
 	kTheOptionDown,
 	kTheOrganizationName,
+	kThePaletteMapping,
 	kTheParamCount,
 	kThePathName,
 	kThePauseState,
@@ -139,6 +140,7 @@ enum TheEntityType {
 	kTheRunMode,
 	kTheSafePlayer,
 	kTheScore,
+	kTheScoreSelection,
 	kTheScummvmVersion,			// set the Director version via lingo in tests
 	kTheSearchCurrentFolder,
 	kTheSearchPath,
@@ -175,6 +177,7 @@ enum TheEntityType {
 	kTheTrace,
 	kTheTraceLoad,
 	kTheTraceLogFile,
+	kTheUpdateLock,
 	kTheUpdateMovieEnabled,
 	kTheUserName,
 	kTheVideoForWindowsPresent,
@@ -258,7 +261,6 @@ enum TheFieldType {
 	kTheNumber,
 	kThePageHeight,
 	kThePalette,
-	kThePaletteMapping,
 	kThePaletteRef,
 	kThePattern,
 	kThePausedAtStart,
@@ -274,7 +276,6 @@ enum TheFieldType {
 	kTheSampleSize,
 	kTheScale,
 	kTheScoreColor,
-	kTheScoreSelection,
 	kTheScript,
 	kTheScriptInstanceList,
 	kTheScriptNum,
@@ -313,7 +314,6 @@ enum TheFieldType {
 	kTheTransitionType,
 	kTheTweened,
 	kTheType,
-	kTheUpdateLock,
 	kTheVideo,
 	kTheVisibility,
 	kTheVisible,


Commit: 0cb930dc090e16dd19ba98afc951d1c501553e47
    https://github.com/scummvm/scummvm/commit/0cb930dc090e16dd19ba98afc951d1c501553e47
Author: Scott Percival (code at moral.net.au)
Date: 2026-07-25T13:26:51+02:00

Commit Message:
DIRECTOR: LINGO: Add parser support for "member X of castLib Y"

Changed paths:
    engines/director/lingo/lingo-gr.cpp
    engines/director/lingo/lingo-gr.y


diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index ad6ce54c92c..2e03195307b 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -674,16 +674,16 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  197
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   4834
+#define YYLAST   4899
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  108
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  65
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  369
+#define YYNRULES  371
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  721
+#define YYNSTATES  729
 
 /* YYMAXUTOK -- Last valid token kind.  */
 #define YYMAXUTOK   348
@@ -764,20 +764,21 @@ static const yytype_int16 yyrline[] =
      652,   653,   657,   663,   670,   671,   674,   675,   679,   685,
      692,   693,   699,   700,   701,   702,   703,   704,   705,   706,
      712,   717,   718,   719,   720,   721,   722,   725,   727,   728,
-     731,   732,   735,   736,   737,   738,   739,   741,   743,   745,
-     747,   749,   751,   753,   755,   758,   759,   760,   761,   764,
-     765,   768,   773,   776,   781,   787,   788,   789,   790,   791,
-     794,   795,   796,   797,   798,   801,   803,   804,   805,   806,
-     807,   808,   809,   810,   811,   812,   816,   817,   818,   819,
-     820,   821,   822,   823,   826,   826,   828,   829,   832,   833,
-     834,   835,   836,   839,   840,   841,   847,   851,   854,   859,
-     860,   861,   862,   863,   866,   867,   870,   871,   875,   876,
-     877,   878,   879,   880,   881,   882,   883,   884,   885,   886,
-     887,   888,   889,   890,   891,   892,   893,   900,   901,   902,
-     903,   904,   905,   906,   907,   908,   909,   910,   911,   912,
-     913,   914,   915,   916,   917,   918,   921,   922,   923,   924,
-     925,   926,   927,   928,   929,   930,   931,   932,   933,   934,
-     935,   936,   937,   938,   941,   942,   945,   946,   949,   953
+     731,   732,   735,   736,   741,   742,   747,   748,   749,   751,
+     753,   755,   757,   759,   761,   763,   765,   768,   769,   770,
+     771,   774,   775,   778,   783,   786,   791,   797,   798,   799,
+     800,   801,   804,   805,   806,   807,   808,   811,   813,   814,
+     815,   816,   817,   818,   819,   820,   821,   822,   826,   827,
+     828,   829,   830,   831,   832,   833,   836,   836,   838,   839,
+     842,   843,   844,   845,   846,   849,   850,   851,   857,   861,
+     864,   869,   870,   871,   872,   873,   876,   877,   880,   881,
+     885,   886,   887,   888,   889,   890,   891,   892,   893,   894,
+     895,   896,   897,   898,   899,   900,   901,   902,   903,   910,
+     911,   912,   913,   914,   915,   916,   917,   918,   919,   920,
+     921,   922,   923,   924,   925,   926,   927,   928,   931,   932,
+     933,   934,   935,   936,   937,   938,   939,   940,   941,   942,
+     943,   944,   945,   946,   947,   948,   951,   952,   955,   956,
+     959,   963
 };
 #endif
 
@@ -828,7 +829,7 @@ yysymbol_name (yysymbol_kind_t yysymbol)
 }
 #endif
 
-#define YYPACT_NINF (-562)
+#define YYPACT_NINF (-542)
 
 #define yypact_value_is_default(Yyn) \
   ((Yyn) == YYPACT_NINF)
@@ -842,79 +843,79 @@ yysymbol_name (yysymbol_kind_t yysymbol)
    STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    3284,  -562,  3745,  -562,  -562,  -562,  -562,  -562,  -562,   242,
-    -562,    10,  -562,  3745,  2279,   242,  2381,  -562,  -562,  3745,
-     951,  -562,    17,  -562,  -562,  2483,    64,  3830,  -562,   -36,
-    -562,  -562,  3745,  2483,  2279,  3745,  -562,  -562,  -562,  -562,
-    -562,  -562,  -562,  -562,  -562,  -562,  -562,  -562,  -562,  -562,
-    -562,  -562,  -562,  -562,  -562,  -562,  -562,  -562,  -562,  -562,
-    -562,  -562,  -562,  2381,  3745,  3745,   -30,  4084,  -562,    78,
-    3284,  -562,  -562,  -562,  -562,  2483,  -562,  -562,  -562,  -562,
-    -562,  -562,  -562,  -562,  -562,  -562,  -562,  -562,  -562,  -562,
-    -562,  -562,  -562,  -562,  -562,  -562,  -562,  -562,  -562,  -562,
-    -562,  -562,  -562,  -562,  -562,  -562,  -562,  -562,  -562,  -562,
-    -562,   -10,  -562,  -562,  2585,  2585,  2585,  2585,  2381,  2381,
-    2381,  2381,     8,    15,   -12,    16,  -562,  -562,    20,    -4,
-    -562,  -562,  -562,  -562,  2585,  2585,  2585,  2585,  2585,  2585,
-    2381,  2381,  2687,  2381,  2381,  2381,  2381,  3915,  2381,  2687,
-    2687,  1769,  1053,    28,    23,    24,  -562,  -562,  -562,  -562,
-    -562,  -562,  -562,  -562,  -562,  -562,  1157,  -562,    26,  2381,
-    4387,  3745,    12,  -562,   629,    29,    36,  1259,  3745,  2381,
-    3745,  -562,  -562,    13,  -562,  -562,    38,    39,  1361,    40,
-      41,    44,   525,    47,  3745,  -562,  -562,  -562,  -562,    48,
-    1463,  -562,  3745,  1871,  -562,  -562,  -562,  -562,  -562,  4163,
-    4197,  4219,  4253,   109,    18,  -562,  -562,    46,  -562,    71,
-    -562,  3745,  -562,  -562,  1565,  4652,  -562,     3,    30,    31,
-      83,    86,   109,   130,   171,  4596,  -562,  -562,  -562,  3095,
-    4400,    22,   103,   105,   111,    99,   110,   132,  -562,  4652,
-     115,   114,  1973,   136,  -562,   142,  -562,   202,  2381,  2381,
-    2381,  2381,  2381,  2381,  2381,  2381,  2381,  2381,  2381,  2381,
-    2381,  2381,  2381,  2381,  2381,  2381,  -562,  -562,  4494,  -562,
-     143,  -562,  4481,  3191,    51,  -562,   144,  -562,   146,  -562,
-     147,  -562,  4000,  4000,  4000,    60,   665,   223,  -562,  -562,
-    2381,   154,    11,   157,  -562,  2381,   158,  -562,   159,  -562,
-     160,  -562,   161,  4084,  3376,   162,  -562,    52,   167,  -562,
-    -562,  -562,  4421,  2687,  2381,  2687,  2381,  2687,  2381,  2687,
-    2381,  -562,  -562,  -562,  -562,    37,  -562,  -562,  -562,  -562,
-     243,  4665,  -562,  -562,  -562,  -562,  -562,  -562,  -562,  -562,
-    -562,  -562,  1667,  2789,  2687,  2687,  4507,  2075,  -562,  2381,
-    2381,  2381,  2381,  -562,  2381,  2891,  -562,  -562,  2381,  -562,
-    3095,   185,  -562,  -562,  2381,   178,   178,   178,   178,  4127,
-    4127,  -562,    92,   178,   178,   178,   178,    92,   -24,   -24,
-    -562,  -562,   185,  2381,  2381,  2381,  2381,  2381,  2381,  2381,
-    2381,  2381,  2381,  2381,  2381,  2381,  2381,  2381,  2381,  2381,
-    2381,  -562,  -562,   172,  3652,   270,   189,  3376,  -562,  -562,
-    -562,     8,  -562,    54,  -562,    55,    57,  2381,  2381,   198,
-    3376,  2993,   700,    11,  3745,  3745,  -562,  -562,  -562,    11,
-    -562,  -562,  4578,  -562,  -562,  -562,  3376,  -562,  -562,  -562,
-     211,  3376,  -562,  -562,   206,  3376,  -562,  2177,  -562,  4275,
-    -562,  4309,  -562,  4331,  -562,  4365,  -562,  -562,  2687,  2381,
-      37,    37,    37,    37,  2687,  -562,  2687,    37,  -562,  -562,
-    2687,  2687,  -562,  -562,  -562,  -562,  -562,  -562,  2381,   213,
-    -562,   185,  4652,  4652,  4652,  4652,  4652,  -562,  4652,  4652,
-    4565,  2381,   214,  4652,  -562,   178,   178,   178,   178,  4127,
-    4127,  -562,    92,   178,   178,   178,   178,    92,   -24,   -24,
-    -562,  -562,   185,  3652,  -562,  -562,    43,  3652,  -562,  3468,
-    3376,  -562,   215,  -562,   218,  -562,   238,  -562,   766,  4141,
-    3376,   224,  2381,  2381,  2381,  2381,  -562,  -562,   239,  -562,
-    -562,    62,  3745,  -562,  -562,   249,   241,  -562,  3376,   334,
-    -562,   185,  2687,  2687,  2687,  2687,  -562,  4652,  2687,  2687,
-    2687,  2687,  -562,   313,   272,  -562,  -562,   185,  -562,   244,
-    2381,   245,  -562,  -562,   256,  3560,   246,  -562,  -562,  3652,
-    -562,  -562,  -562,  -562,  -562,   250,  3376,   315,  2381,   259,
-     252,  -562,  4678,  -562,   504,  4678,  4678,  -562,  -562,    58,
-     253,  -562,   346,  3745,   254,  -562,  -562,  -562,  -562,  -562,
-    -562,  -562,  -562,   284,  2687,  -562,   255,  -562,   185,  -562,
-    -562,  3652,  -562,  -562,   256,  3376,   269,  2381,   801,   260,
-    -562,  2381,  2381,  2381,  2381,  2381,  2381,  2381,  2381,  2381,
-    2381,  2381,  2381,  2381,  2381,  2381,  2381,   289,   264,  3376,
-    -562,  3745,    84,  -562,  2687,  -562,   262,   256,  -562,   276,
-     268,   834,   271,  3376,  -562,   212,   212,   212,  4734,  4734,
-    -562,   126,   212,   212,   212,   212,   126,    35,    35,  -562,
-    -562,  2381,  3376,  -562,    98,  -562,  -562,  -562,  -562,   273,
-    -562,   274,  3376,  3376,   279,  4678,  -562,  -562,  -562,  3376,
-     280,   282,   275,   290,   281,   283,  -562,   285,  -562,  -562,
-    -562
+    3349,  -542,  3810,  -542,  -542,  -542,  -542,  -542,  -542,   332,
+    -542,    10,  -542,  3810,  2291,   332,  2393,  -542,  -542,  3810,
+     963,  -542,    26,  -542,  -542,  2495,   105,  3895,  -542,   -62,
+    -542,  -542,  3810,  2495,  2291,  3810,  -542,  -542,  -542,  -542,
+    -542,  -542,  -542,  -542,  -542,  -542,  -542,  -542,  -542,  -542,
+    -542,  -542,  -542,  -542,  -542,  -542,  -542,  -542,  -542,  -542,
+    -542,  -542,  -542,  2393,  3810,  3810,   -30,  4149,  -542,    85,
+    3349,  -542,  -542,  -542,  -542,  2495,  -542,  -542,  -542,  -542,
+    -542,  -542,  -542,  -542,  -542,  -542,  -542,  -542,  -542,  -542,
+    -542,  -542,  -542,  -542,  -542,  -542,  -542,  -542,  -542,  -542,
+    -542,  -542,  -542,  -542,  -542,  -542,  -542,  -542,  -542,  -542,
+    -542,   -10,  -542,  -542,  2597,  2597,  2597,  2597,  2393,  2393,
+    2393,  2393,    32,    16,    -2,    18,  -542,  -542,    20,     8,
+    -542,  -542,  -542,  -542,  2597,  2597,  2597,  2597,  2597,  2597,
+    2393,  2393,  2699,  2393,  2393,  2393,  2393,  3980,  2393,  2699,
+    2699,  1781,  1065,     9,    22,    23,  -542,  -542,  -542,  -542,
+    -542,  -542,  -542,  -542,  -542,  -542,  1169,  -542,    24,  2393,
+    4486,  3810,    15,  -542,   560,    27,    34,  1271,  3810,  2393,
+    3810,  -542,  -542,    28,  -542,  -542,    36,    39,  1373,    40,
+      41,    42,   453,    46,  3810,  -542,  -542,  -542,  -542,    47,
+    1475,  -542,  3810,  1883,  -542,    87,  -542,  -542,  -542,    99,
+    -542,  4228,  4262,  4284,  4318,    45,    77,  -542,  -542,    79,
+    -542,    88,  -542,  3810,  -542,  -542,  1577,  4717,  -542,     3,
+       5,     7,    19,    35,    45,   134,   138,  4704,  -542,  -542,
+    -542,  3107,  4508,    29,    84,    89,    91,    94,   -41,    58,
+    -542,  4717,    96,    92,  1985,   104,  -542,   111,  -542,   191,
+    2393,  2393,  2393,  2393,  2393,  2393,  2393,  2393,  2393,  2393,
+    2393,  2393,  2393,  2393,  2393,  2393,  2393,  2393,  -542,  -542,
+    4602,  -542,   122,  -542,  4542,  3203,    51,  -542,   127,  -542,
+     130,  -542,   137,  -542,  4065,  4065,  4065,    21,   711,   209,
+    -542,  -542,  2393,   140,    60,   142,  -542,  2393,   143,  -542,
+     146,  -542,   150,  -542,   151,  4149,  3441,   153,  -542,    52,
+     154,  -542,  -542,  -542,  4521,   242,   243,  2699,  2393,  2699,
+    2393,  2699,  2393,  2699,  2393,  -542,  -542,  -542,  -542,    64,
+    -542,  -542,  -542,  -542,   233,  4773,  -542,  -542,  -542,  -542,
+    -542,  -542,  -542,  -542,  -542,  -542,  1679,  2801,  2699,  2699,
+    4615,  2087,  -542,  2393,  2393,  2393,  2393,  -542,  2393,  2903,
+    -542,  -542,  2393,  -542,  3107,   161,  -542,  -542,  2393,   119,
+     119,   119,   119,  4192,  4192,  -542,   182,   119,   119,   119,
+     119,   182,   -19,   -19,  -542,  -542,   161,  2393,  2393,  2393,
+    2393,  2393,  2393,  2393,  2393,  2393,  2393,  2393,  2393,  2393,
+    2393,  2393,  2393,  2393,  2393,  -542,  -542,   163,  3717,   247,
+     174,  3441,  -542,  -542,  -542,    32,  -542,    53,  -542,    54,
+      55,  2393,  2393,   183,  3441,  3005,   725,    60,  3810,  3810,
+    -542,  -542,  -542,    60,  -542,  -542,  4686,  -542,  -542,  -542,
+    3441,  -542,  -542,  -542,   181,  3441,  -542,  -542,   187,  3441,
+    -542,  2189,  2699,  2699,  -542,  4340,  -542,  4374,  -542,  4396,
+    -542,  4430,  -542,  -542,  2699,  2393,    64,    64,    64,    64,
+    2699,  -542,  2699,    64,  -542,  -542,  2699,  2699,  -542,  -542,
+    -542,  -542,  -542,  -542,  2393,   179,  -542,   161,  4717,  4717,
+    4717,  4717,  4717,  -542,  4717,  4717,  4628,  2393,   188,  4717,
+    -542,   119,   119,   119,   119,  4192,  4192,  -542,   182,   119,
+     119,   119,   119,   182,   -19,   -19,  -542,  -542,   161,  3717,
+    -542,  -542,     4,  3717,  -542,  3533,  3441,  -542,   197,  -542,
+     198,  -542,   200,  -542,   812,  4206,  3441,   211,  2393,  2393,
+    2393,  2393,  -542,  -542,   203,  -542,  -542,    57,  3810,  -542,
+    -542,   217,   210,  -542,  3441,   301,  -542,   161,  -542,  -542,
+    2699,  2699,  2699,  2699,  -542,  4717,  2699,  2699,  2699,  2699,
+    -542,   281,   240,  -542,  -542,   161,  -542,   213,  2393,   215,
+    -542,  -542,   224,  3625,   219,  -542,  -542,  3717,  -542,  -542,
+    -542,  -542,  -542,   220,  3441,   285,  2393,   250,   244,  -542,
+    4786,  -542,  4452,  4786,  4786,  -542,  -542,    56,   263,  -542,
+     335,  3810,   262,  -542,  -542,  -542,  -542,  -542,  -542,  -542,
+    -542,   294,  2699,  -542,   268,  -542,   161,  -542,  -542,  3717,
+    -542,  -542,   224,  3441,   280,  2393,   846,   272,  -542,  2393,
+    2393,  2393,  2393,  2393,  2393,  2393,  2393,  2393,  2393,  2393,
+    2393,  2393,  2393,  2393,  2393,   302,   273,  3441,  -542,  3810,
+      71,  -542,  2699,  -542,   274,   224,  -542,   286,   275,  3253,
+     278,  3441,  -542,   172,   172,   172,  4799,  4799,  -542,   208,
+     172,   172,   172,   172,   208,    68,    68,  -542,  -542,  2393,
+    3441,  -542,    74,  -542,  -542,  -542,  -542,   279,  -542,   284,
+    3441,  3441,   295,  4786,  -542,  -542,  -542,  3441,   296,   297,
+     288,   308,   299,   310,  -542,   311,  -542,  -542,  -542
 };
 
 /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -937,88 +938,88 @@ static const yytype_int16 yydefact[] =
        0,     0,     0,     0,     0,     0,   135,   103,     0,   101,
      212,   213,   215,   214,    37,    44,    66,    75,    56,    38,
       45,    60,     0,    39,    50,    53,    78,    71,    70,     0,
-       0,     0,   366,   227,     0,     0,   306,   222,   223,   224,
-     225,   258,   259,   226,   307,   308,   156,   309,     0,     0,
+       0,     0,   368,   227,     0,     0,   308,   222,   223,   224,
+     225,   260,   261,   226,   309,   310,   156,   311,     0,     0,
        0,   100,     0,   137,     0,     0,     0,   156,     0,     0,
       71,   227,   230,     0,   231,   199,     0,     0,   156,     0,
        0,     0,     0,     0,   100,   106,   145,     1,     4,     0,
-     156,    10,     0,     0,   233,   251,   232,   234,   235,     0,
-       0,     0,     0,     0,     0,   141,   136,     0,   133,     0,
-     173,   102,   249,   250,   158,   159,   216,    32,    33,    34,
-      55,    68,    52,    62,   255,     0,   304,   305,   151,   222,
-       0,   212,   213,   215,   214,     0,   227,     0,   296,   368,
-       0,   367,     0,     0,   120,     0,   122,    63,     0,     0,
+     156,    10,     0,     0,   234,   253,   232,   253,   236,   253,
+     237,     0,     0,     0,     0,     0,     0,   141,   136,     0,
+     133,     0,   173,   102,   251,   252,   158,   159,   216,    32,
+      33,    34,    55,    68,    52,    62,   257,     0,   306,   307,
+     151,   222,     0,   212,   213,   215,   214,     0,   227,     0,
+     298,   370,     0,   369,     0,     0,   120,     0,   122,    63,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   157,   147,   327,   156,   328,
-       0,   143,     0,     0,     0,   138,     0,   139,     0,   131,
-       0,   118,    49,    35,    36,     0,     0,   286,   171,   172,
-       0,     0,    17,     0,   128,    76,     0,   124,     0,   126,
-       0,   177,     0,     0,   200,     0,   175,     0,     0,   116,
-      30,   252,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   245,   247,   248,   246,     0,   142,   134,   174,   104,
-      63,   162,   266,   267,   268,   269,   270,   271,   272,   273,
-     274,   275,     0,     0,     0,     0,   156,     0,   221,     0,
-       0,     0,     0,   294,     0,     0,   295,   293,     0,   217,
-     222,   156,   121,   123,     0,   319,   320,   317,   318,   321,
-     322,   314,   324,   325,   326,   316,   315,   323,   310,   311,
-     312,   313,   156,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   157,   147,   329,
+     156,   330,     0,   143,     0,     0,     0,   138,     0,   139,
+       0,   131,     0,   118,    49,    35,    36,     0,     0,   288,
+     171,   172,     0,     0,    17,     0,   128,    76,     0,   124,
+       0,   126,     0,   177,     0,     0,   200,     0,   175,     0,
+       0,   116,    30,   254,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   247,   249,   250,   248,     0,
+     142,   134,   174,   104,    63,   162,   268,   269,   270,   271,
+     272,   273,   274,   275,   276,   277,     0,     0,     0,     0,
+     156,     0,   221,     0,     0,     0,     0,   296,     0,     0,
+     297,   295,     0,   217,   222,   156,   121,   123,     0,   321,
+     322,   319,   320,   323,   324,   316,   326,   327,   328,   318,
+     317,   325,   312,   313,   314,   315,   156,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     157,   149,   144,     0,   206,   179,     0,   200,   140,   132,
-     119,    71,   228,     0,   229,     0,     0,     0,     0,     0,
-     200,     0,     0,    17,    28,     0,    21,    22,    13,    18,
-      19,   129,     0,   125,   127,   178,   200,   196,   204,   205,
-       0,   201,   202,   176,     0,   200,   117,     0,   236,     0,
-     240,     0,   242,     0,   238,     0,   284,   285,     0,     0,
-      40,    51,    54,    79,    57,   281,    58,    59,   282,   283,
-      69,    70,   257,   261,   260,   256,   364,   365,   157,     0,
-     152,   156,   302,   303,   301,   299,   300,   297,   298,   369,
-     156,   157,     0,   161,   148,   338,   339,   336,   337,   340,
-     341,   333,   343,   344,   345,   335,   334,   342,   329,   330,
-     331,   332,   156,   206,   210,   211,   186,   207,   208,     0,
-     200,    11,     0,   163,     0,   165,     0,   167,     0,     0,
-     200,     0,    57,    58,    69,    70,   287,   288,     0,   169,
-      14,     0,   100,    20,   130,     0,     0,   203,   200,    26,
-     253,   156,     0,     0,     0,     0,   244,   160,     0,     0,
-       0,     0,   265,     0,     0,   263,   264,   156,   154,     0,
-     157,     0,   218,   150,   186,     0,     0,   180,   209,   206,
-     182,    12,   164,   166,   168,     0,   200,     0,     0,     0,
-       0,   346,   289,   347,     0,   291,   292,   170,    23,     0,
-       0,   197,    27,    28,     0,   237,   241,   243,   239,   276,
-     278,   279,   277,     0,     0,   280,     0,   153,   156,   219,
-     181,   206,   184,   187,   186,   200,     0,     0,     0,     0,
-     188,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   200,
-     198,    28,     0,   254,     0,   155,     0,   186,   183,     0,
-       0,     0,     0,   200,   189,   356,   357,   355,   358,   359,
-     352,   361,   362,   363,   354,   353,   360,   348,   349,   350,
-     351,     0,   200,    15,     0,    24,   262,   220,   185,     0,
-     194,     0,   200,   200,     0,   290,    16,    25,   195,   200,
-       0,     0,     0,     0,     0,     0,   190,     0,   192,   191,
-     193
+       0,     0,     0,     0,   157,   149,   144,     0,   206,   179,
+       0,   200,   140,   132,   119,    71,   228,     0,   229,     0,
+       0,     0,     0,     0,   200,     0,     0,    17,    28,     0,
+      21,    22,    13,    18,    19,   129,     0,   125,   127,   178,
+     200,   196,   204,   205,     0,   201,   202,   176,     0,   200,
+     117,     0,     0,     0,   238,     0,   242,     0,   244,     0,
+     240,     0,   286,   287,     0,     0,    40,    51,    54,    79,
+      57,   283,    58,    59,   284,   285,    69,    70,   259,   263,
+     262,   258,   366,   367,   157,     0,   152,   156,   304,   305,
+     303,   301,   302,   299,   300,   371,   156,   157,     0,   161,
+     148,   340,   341,   338,   339,   342,   343,   335,   345,   346,
+     347,   337,   336,   344,   331,   332,   333,   334,   156,   206,
+     210,   211,   186,   207,   208,     0,   200,    11,     0,   163,
+       0,   165,     0,   167,     0,     0,   200,     0,    57,    58,
+      69,    70,   289,   290,     0,   169,    14,     0,   100,    20,
+     130,     0,     0,   203,   200,    26,   255,   156,   233,   235,
+       0,     0,     0,     0,   246,   160,     0,     0,     0,     0,
+     267,     0,     0,   265,   266,   156,   154,     0,   157,     0,
+     218,   150,   186,     0,     0,   180,   209,   206,   182,    12,
+     164,   166,   168,     0,   200,     0,     0,     0,     0,   348,
+     291,   349,     0,   293,   294,   170,    23,     0,     0,   197,
+      27,    28,     0,   239,   243,   245,   241,   278,   280,   281,
+     279,     0,     0,   282,     0,   153,   156,   219,   181,   206,
+     184,   187,   186,   200,     0,     0,     0,     0,   188,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   200,   198,    28,
+       0,   256,     0,   155,     0,   186,   183,     0,     0,     0,
+       0,   200,   189,   358,   359,   357,   360,   361,   354,   363,
+     364,   365,   356,   355,   362,   350,   351,   352,   353,     0,
+     200,    15,     0,    24,   264,   220,   185,     0,   194,     0,
+     200,   200,     0,   292,    16,    25,   195,   200,     0,     0,
+       0,     0,     0,     0,   190,     0,   192,   191,   193
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -562,  -562,  -562,   318,  -562,  -562,  -562,   -50,  -562,   -54,
-    -562,  -426,     0,    -1,   -28,  -562,     2,  -409,   -64,  -562,
-      61,  -272,   356,  -562,  -562,  -562,  -562,  -562,  -561,  -562,
-    -562,  -562,  -408,  -562,   -59,  -508,  -562,  -133,  -131,   -23,
-     -53,  -562,     4,  -562,  -562,    59,  -562,    42,  -178,  -562,
-    -562,  -191,  -562,  -562,  -562,  -562,    50,  -562,   263,    63,
-    -210,    -2,  -134,  -562,  -242
+    -542,  -542,  -542,   338,  -542,  -542,  -542,   -24,  -542,   -29,
+    -542,  -424,     0,    -1,   -32,  -542,     2,  -402,   -59,  -542,
+      25,  -267,   381,  -542,  -542,  -542,  -542,  -542,  -541,  -542,
+    -542,  -542,  -414,  -542,   -36,  -524,  -542,  -113,  -139,   -18,
+     -70,  -542,    -5,  -542,  -542,   307,  -542,    73,  -157,  -542,
+    -542,  -291,  -542,  -542,  -542,  -542,    67,  -542,   267,    63,
+    -211,  -301,    33,  -542,  -248
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-       0,    69,    70,    71,    72,    73,   437,   438,   439,   440,
-      74,   111,   112,   153,   128,   129,   449,    77,    78,    79,
-     154,   276,   155,    80,   300,    81,    82,    83,   587,    84,
-      85,    86,   450,   451,   452,   526,   527,   528,   156,   157,
-     423,   183,   158,   335,   159,   204,   160,   482,   483,   161,
-     162,   468,   184,   546,   163,   247,   248,   164,   165,   249,
-     278,   602,   167,   250,   251
+       0,    69,    70,    71,    72,    73,   441,   442,   443,   444,
+      74,   111,   112,   153,   128,   129,   453,    77,    78,    79,
+     154,   278,   155,    80,   302,    81,    82,    83,   595,    84,
+      85,    86,   454,   455,   456,   532,   533,   534,   156,   157,
+     427,   183,   158,   339,   159,   204,   160,   488,   489,   161,
+     162,   474,   184,   552,   163,   249,   250,   164,   165,   251,
+     280,   610,   167,   252,   253
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -1026,113 +1027,104 @@ static const yytype_int16 yydefgoto[] =
    number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      75,   113,    76,   196,   182,   525,   411,   191,   551,   531,
-     371,   124,   127,   123,   341,   584,   214,   217,   171,   168,
-     434,   219,   541,   630,   253,   255,   181,   280,   264,   356,
-     288,   186,   279,   392,   127,   277,   193,   290,   555,   301,
-     303,   306,   308,   279,   125,   310,   277,   559,   315,   318,
-     298,   175,   416,   454,   279,   532,   534,   277,   536,   658,
-     299,   585,   466,   127,   194,   185,   279,    75,   467,   277,
-      75,   195,    76,   668,   342,   273,   274,   166,   197,   170,
-     213,   634,   343,   174,   489,   427,   176,   646,   177,   216,
-     279,   201,   202,   277,   187,   189,   188,   166,   221,   502,
-     435,   344,   346,   178,   179,   279,   698,   428,   277,   345,
-     347,   126,   436,   285,   525,   491,   215,   218,   525,   336,
-     504,   220,   591,   667,   254,   256,   192,   281,   239,   359,
-     289,   252,   599,   586,   655,   656,   199,   291,   200,   302,
-     304,   307,   309,   284,   264,   311,   234,   337,   316,   319,
-     612,   246,   417,   455,   348,   533,   535,   350,   537,   659,
-     500,   352,   349,   608,   202,   351,   317,   331,   522,   332,
-     127,   333,   338,   334,   206,   207,   208,   295,   646,   297,
-     525,   209,   210,   211,   212,   695,   202,   662,   636,   271,
-     272,   273,   274,   127,   206,   222,   223,   207,   208,   707,
-     202,   320,   353,   224,   225,   363,   209,   210,   211,   212,
-     360,   235,   361,   252,   240,   561,   368,   364,   362,   579,
-     339,   367,   525,   653,   654,   655,   656,   669,   581,   370,
-     264,   374,   282,   265,   365,   694,   279,   372,   366,   277,
-     425,   426,   296,   373,   412,   418,   577,   419,   420,   447,
-     583,   693,   114,   115,   431,   433,   116,   117,   441,   443,
-     444,   445,   446,   453,   646,   704,   322,   647,   456,   422,
-     422,   422,   469,   523,   270,   271,   272,   273,   274,   568,
-     569,   570,   571,    75,   706,   415,   574,   501,   529,   614,
-     530,   181,   181,   181,   710,   711,   424,   424,   424,   540,
-     118,   713,   119,   556,   120,   626,   121,   558,   652,   653,
-     654,   655,   656,    75,    75,   600,   592,   578,   582,   593,
-     122,   375,   376,   377,   378,   379,   380,   381,   382,   383,
-     384,   385,   386,   387,   388,   389,   390,   391,   628,   594,
-     607,   610,   611,   613,   623,   624,   586,   633,   627,   629,
-     639,   635,   637,   640,   660,   661,   666,   664,   663,   665,
-     670,   674,   691,   432,   246,   692,   697,   699,   442,   700,
-     712,   714,   703,   715,   708,   709,   716,   205,   205,   205,
-     205,   717,   718,   550,   719,   553,   720,   459,   198,   461,
-     190,   463,   557,   465,   588,   485,   625,   205,   205,   205,
-     205,   205,   205,     0,     0,   226,     0,     0,   603,   603,
-     603,   603,   236,   237,    75,   497,     0,    75,     0,     0,
-       0,     0,   492,   493,   494,   495,     0,   496,   498,     0,
-      75,   499,     0,   113,   552,     0,     0,   503,     0,     0,
-       0,     0,     0,     0,     0,     0,    75,     0,     0,     0,
-       0,    75,     0,     0,     0,    75,   505,   506,   507,   508,
-     509,   510,   511,   512,   513,   514,   515,   516,   517,   518,
-     519,   520,   521,     0,     0,     0,     0,     0,     0,     0,
+      75,   113,    76,   191,   123,   592,   375,   537,   196,   182,
+     168,   124,   127,   415,   557,   345,   531,   216,   171,   219,
+     547,   221,   593,   255,   257,   282,   181,   279,   290,   396,
+     360,   186,   193,   266,   127,   292,   561,   303,   279,   185,
+     305,   308,   310,   312,   125,   565,   431,   317,   320,   279,
+     176,   638,   420,   458,   538,   540,   542,   666,   187,   189,
+     175,   279,   254,   127,   194,   300,   368,    75,   432,   438,
+      75,   195,    76,   642,   346,   301,   348,   166,   350,   170,
+     275,   276,   347,   174,   349,   197,   351,   279,   177,   472,
+     352,   201,   202,   495,   594,   473,   188,   166,   353,   218,
+     199,   676,   279,   335,   215,   336,   354,   337,   508,   338,
+     223,   126,   254,   497,   355,   675,   287,   217,   325,   220,
+     654,   222,   599,   256,   258,   283,   192,   531,   291,   510,
+     326,   531,   607,   241,   706,   293,   363,   304,   200,   286,
+     306,   309,   311,   313,   178,   179,   236,   318,   321,   439,
+     620,   248,   421,   459,   539,   541,   543,   667,   616,   202,
+     369,   440,   319,   506,   370,   356,   528,   663,   664,   357,
+     127,   266,   703,   202,   267,   715,   202,   297,   340,   299,
+     341,   211,   212,   213,   214,   576,   577,   578,   579,   342,
+     644,   364,   582,   127,   372,   531,   365,   670,   366,   281,
+     367,   322,   371,   226,   227,   376,   211,   212,   213,   214,
+     281,   237,   377,   567,   242,   272,   273,   274,   275,   276,
+     378,   281,   343,   416,   654,   429,   430,   655,   422,   677,
+     587,   423,   284,   281,   266,   279,   374,   531,   424,   589,
+     435,   437,   298,   445,   447,   702,   585,   448,   612,   613,
+     614,   449,   450,   701,   457,   460,   451,   462,   463,   281,
+     654,   591,   475,   507,   529,   535,   324,   712,   660,   661,
+     662,   663,   664,   562,   281,   536,   426,   426,   426,   273,
+     274,   275,   276,   586,   546,    75,   714,   419,   564,   428,
+     428,   428,   590,   181,   181,   181,   718,   719,   600,   601,
+     622,   602,   608,   721,   615,   661,   662,   663,   664,   618,
+     621,   619,   631,   632,   594,    75,    75,   635,   634,   637,
+     641,   643,   645,   379,   380,   381,   382,   383,   384,   385,
+     386,   387,   388,   389,   390,   391,   392,   393,   394,   395,
+     636,   647,   114,   115,   669,   648,   116,   117,   683,   684,
+     685,   686,   687,   688,   689,   690,   691,   692,   693,   694,
+     695,   696,   697,   698,   668,   436,   671,   672,   248,   674,
+     446,   678,   673,   682,   700,   699,   708,   707,   705,   711,
+     716,   205,   207,   209,   207,   717,   720,   722,   723,   724,
+     118,   465,   119,   467,   120,   469,   121,   471,   713,   725,
+     726,   205,   207,   207,   207,   209,   207,   281,   198,   228,
+     122,   727,   728,   556,   559,   190,   238,   239,    75,   563,
+     596,    75,   206,   208,   210,   633,   498,   499,   500,   501,
+     491,   502,   504,     0,    75,   505,   503,   113,   558,     0,
+       0,   509,   206,   224,   225,   208,   210,     0,     0,     0,
+      75,     0,     0,     0,   314,    75,     0,     0,     0,    75,
+     511,   512,   513,   514,   515,   516,   517,   518,   519,   520,
+     521,   522,   523,   524,   525,   526,   527,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     538,   539,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   603,   603,   603,
-     603,   603,   603,   603,   603,   603,   603,   603,   603,   603,
-     603,   603,   603,    75,   609,     0,   312,    75,     0,    75,
-      75,   590,   567,     0,     0,   657,     0,     0,     0,     0,
-      75,   604,   605,   606,     0,     0,     0,     0,     0,   641,
-     642,   127,   643,   644,   645,     0,   646,   603,    75,   647,
-     648,   649,   313,     0,   499,     0,     0,     0,     0,     0,
-     258,   259,   260,   261,   262,   263,     0,   264,     0,     0,
-     265,   266,   267,     0,     0,    75,   458,   632,   460,    75,
-     462,     0,   464,     0,     0,     0,    75,     0,   650,   651,
-     652,   653,   654,   655,   656,     0,     0,     0,     0,     0,
-       0,     0,   113,     0,     0,   484,   484,   486,   487,   268,
-     269,   270,   271,   272,   273,   274,   314,     0,     0,     0,
-     286,    75,     0,     0,     0,    75,     0,     0,     0,   675,
-     676,   677,   678,   679,   680,   681,   682,   683,   684,   685,
-     686,   687,   688,   689,   690,     0,     0,     0,     0,    75,
-     113,   638,     0,     0,     0,     0,   429,     0,     0,     0,
-       0,     0,     0,    75,   258,   259,   260,   261,   262,   263,
-       0,   264,     0,     0,   265,   266,   267,     0,     0,   705,
-       0,     0,    75,     0,   547,     0,     0,     0,     0,     0,
-     671,   548,    75,    75,     0,     0,     0,     0,     0,    75,
-     258,   259,   260,   261,   262,   263,     0,   264,     0,     0,
-     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
-     287,   566,     0,     0,     0,     0,     0,   572,     0,   573,
-       0,     0,     0,   575,   576,   258,   259,   260,   261,   262,
-     263,     0,   264,     0,     0,   265,   266,   267,     0,   268,
-     269,   270,   271,   272,   273,   274,   430,   595,     0,     0,
+     315,     0,     0,     0,   544,   545,     0,     0,   260,   261,
+     262,   263,   264,   265,     0,   266,     0,     0,   267,   268,
+     269,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   617,     0,     0,    75,
+       0,     0,     0,    75,     0,    75,    75,   598,   575,     0,
+       0,     0,     0,     0,     0,     0,    75,   270,   271,   272,
+     273,   274,   275,   276,   316,     0,     0,   127,     0,     0,
+       0,   288,     0,     0,    75,     0,     0,     0,     0,     0,
+     505,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   611,   611,   611,   611,     0,     0,     0,     0,     0,
+       0,     0,     0,    75,   464,   640,   466,    75,   468,     0,
+     470,     0,     0,     0,    75,   260,   261,   262,   263,   264,
+     265,     0,   266,     0,     0,   267,   268,   269,     0,     0,
+     113,     0,     0,   490,   490,   492,   493,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    75,
+       0,     0,     0,    75,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   270,   271,   272,   273,   274,   275,
+     276,   289,     0,     0,     0,     0,     0,    75,   113,   646,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    75,   611,   611,   611,   611,   611,   611,   611,   611,
+     611,   611,   611,   611,   611,   611,   611,   611,     0,     0,
+      75,     0,   553,     0,     0,     0,     0,     0,   679,     0,
+      75,    75,   433,     0,     0,     0,     0,    75,     0,     0,
+       0,     0,     0,     0,     0,     0,   554,     0,     0,   568,
+     569,     0,   611,     0,     0,     0,     0,     0,     0,     0,
+       0,   574,     0,     0,     0,     0,     0,   580,     0,   581,
+       0,     0,     0,   583,   584,     0,   260,   261,   262,   263,
+     264,   265,     0,   266,     0,     0,   267,   268,   269,     0,
+     260,   261,   262,   263,   264,   265,     0,   266,     0,     0,
+     267,   268,   269,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   268,   269,   270,   271,   272,   273,
-     274,   549,   672,     0,     0,   601,   601,   601,   601,     0,
-       0,   258,   259,   260,   261,   262,   263,     0,   264,     0,
-       0,   265,   266,   267,     0,   615,   616,   617,   618,     0,
-       0,   619,   620,   621,   622,   701,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   258,   259,   260,   261,
-     262,   263,     0,   264,     0,     0,   265,   266,   267,     0,
-     268,   269,   270,   271,   272,   273,   274,   596,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   258,
-     259,   260,   261,   262,   263,     0,   264,   572,     0,   265,
-     266,   267,     0,     0,     0,   268,   269,   270,   271,   272,
-     273,   274,   673,     0,   601,   601,   601,   601,   601,   601,
-     601,   601,   601,   601,   601,   601,   601,   601,   601,   601,
-       0,     0,     0,     0,     0,     0,     0,   696,   268,   269,
-     270,   271,   272,   273,   274,   702,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   270,   271,   272,   273,   274,
+     275,   276,   434,   603,     0,   609,   609,   609,   609,   270,
+     271,   272,   273,   274,   275,   276,   555,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   623,   624,   625,
+     626,     0,     0,   627,   628,   629,   630,   680,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   260,   261,   262,
+     263,   264,   265,     0,   266,     0,     0,   267,   268,   269,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   172,     0,   601,   130,   131,     1,   132,   133,
-      87,   134,   135,   136,   137,   138,   139,    88,    10,    89,
-      90,    12,    91,    92,    93,    94,    17,    18,    95,    96,
-      21,    97,    23,    24,    98,    99,   100,   101,    28,     0,
-      30,    31,   102,   103,   104,   105,     0,     0,     0,     0,
-       0,     0,   142,     0,    36,    37,     0,     0,     0,   143,
-      39,   144,    41,   145,    43,   146,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,     0,    54,    55,    56,   147,
-      58,     0,     0,    59,   148,    61,    62,   106,   107,   108,
-     109,     0,     0,     0,   110,     0,     0,     0,   149,   150,
-       0,     0,   173,     0,   169,     0,   152,   241,   242,     1,
-     243,   244,    87,   134,   135,   136,   137,   138,   139,    88,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   260,   261,   262,   263,   264,   265,     0,   266,   580,
+       0,   267,   268,   269,     0,     0,   270,   271,   272,   273,
+     274,   275,   276,   604,     0,     0,   609,   609,   609,   609,
+     609,   609,   609,   609,   609,   609,   609,   609,   609,   609,
+     609,   609,     0,     0,     0,     0,     0,     0,     0,   704,
+     270,   271,   272,   273,   274,   275,   276,   681,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   172,     0,   609,   130,   131,     1,
+     132,   133,    87,   134,   135,   136,   137,   138,   139,    88,
       10,    89,    90,    12,    91,    92,    93,    94,    17,    18,
       95,    96,    21,    97,    23,    24,    98,    99,   100,   101,
       28,     0,    30,    31,   102,   103,   104,   105,     0,     0,
@@ -1141,79 +1133,79 @@ static const yytype_int16 yytable[] =
       47,    48,    49,    50,    51,    52,    53,     0,    54,    55,
       56,   147,    58,     0,     0,    59,   148,    61,    62,   106,
      107,   108,   109,     0,     0,     0,   110,     0,     0,     0,
-     149,   150,     0,     0,     0,     0,   169,     0,   152,     0,
-     245,   130,   131,     1,   132,   133,    87,   134,   135,   136,
-     137,   138,   139,    88,    10,    89,    90,    12,    91,    92,
-      93,    94,    17,    18,    95,    96,    21,    97,   257,    24,
-      98,    99,   100,   101,    28,     0,    30,    31,   102,   103,
-     104,   105,   258,   259,   260,   261,   262,   263,   142,   264,
-      36,    37,   265,   266,   267,   143,    39,   144,    41,   145,
-      43,   146,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,     0,    54,    55,    56,   147,    58,     0,     0,    59,
-     148,    61,    62,   106,   107,   108,   109,     0,     0,     0,
-     110,   268,   269,   270,   271,   272,   273,   274,     0,   275,
-     169,     0,   152,   130,   131,     1,   132,   133,    87,   134,
+     149,   150,     0,     0,   173,     0,   169,     0,   152,   243,
+     244,     1,   245,   246,    87,   134,   135,   136,   137,   138,
+     139,    88,    10,    89,    90,    12,    91,    92,    93,    94,
+      17,    18,    95,    96,    21,    97,    23,    24,    98,    99,
+     100,   101,    28,     0,    30,    31,   102,   103,   104,   105,
+       0,     0,     0,     0,     0,     0,   142,     0,    36,    37,
+       0,     0,     0,   143,    39,   144,    41,   145,    43,   146,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,     0,
+      54,    55,    56,   147,    58,     0,     0,    59,   148,    61,
+      62,   106,   107,   108,   109,     0,     0,     0,   110,     0,
+       0,     0,   149,   150,     0,     0,     0,     0,   169,     0,
+     152,     0,   247,   130,   131,     1,   132,   133,    87,   134,
      135,   136,   137,   138,   139,    88,    10,    89,    90,    12,
-      91,    92,    93,    94,    17,   292,    95,    96,    21,    97,
-      23,    24,    98,    99,   100,   101,    28,     0,    30,    31,
-     102,   103,   104,   105,   258,   259,   260,   261,   262,   263,
-     142,   264,   293,   294,   265,   266,   267,   143,    39,   144,
+      91,    92,    93,    94,    17,    18,    95,    96,    21,    97,
+     259,    24,    98,    99,   100,   101,    28,     0,    30,    31,
+     102,   103,   104,   105,   260,   261,   262,   263,   264,   265,
+     142,   266,    36,    37,   267,   268,   269,   143,    39,   144,
       41,   145,    43,   146,    45,    46,    47,    48,    49,    50,
       51,    52,    53,     0,    54,    55,    56,   147,    58,     0,
        0,    59,   148,    61,    62,   106,   107,   108,   109,     0,
-       0,     0,   110,   268,   269,   270,   271,   272,   273,   274,
-       0,   275,   169,     0,   152,   130,   131,     1,   132,   133,
+       0,     0,   110,   270,   271,   272,   273,   274,   275,   276,
+       0,   277,   169,     0,   152,   130,   131,     1,   132,   133,
       87,   134,   135,   136,   137,   138,   139,    88,    10,    89,
-      90,    12,    91,    92,    93,    94,    17,    18,    95,    96,
+      90,    12,    91,    92,    93,    94,    17,   294,    95,    96,
       21,    97,    23,    24,    98,    99,   100,   101,    28,     0,
-     305,    31,   102,   103,   104,   105,   258,   259,   260,   261,
-     262,   263,   142,   264,    36,    37,   265,   266,   267,   143,
+      30,    31,   102,   103,   104,   105,   260,   261,   262,   263,
+     264,   265,   142,   266,   295,   296,   267,   268,   269,   143,
       39,   144,    41,   145,    43,   146,    45,    46,    47,    48,
       49,    50,    51,    52,    53,     0,    54,    55,    56,   147,
       58,     0,     0,    59,   148,    61,    62,   106,   107,   108,
-     109,     0,     0,     0,   110,   268,   269,   270,   271,   272,
-     273,   274,     0,   275,   169,     0,   152,   130,   131,     1,
+     109,     0,     0,     0,   110,   270,   271,   272,   273,   274,
+     275,   276,     0,   277,   169,     0,   152,   130,   131,     1,
      132,   133,    87,   134,   135,   136,   137,   138,   139,    88,
       10,    89,    90,    12,    91,    92,    93,    94,    17,    18,
       95,    96,    21,    97,    23,    24,    98,    99,   100,   101,
-      28,     0,    30,    31,   102,   103,   104,   105,   258,   259,
-     260,   261,   262,   263,   142,   264,    36,    37,   265,   266,
-     267,   143,    39,   144,    41,   145,    43,   146,    45,    46,
+      28,     0,   307,    31,   102,   103,   104,   105,   260,   261,
+     262,   263,   264,   265,   142,   266,    36,    37,   267,   268,
+     269,   143,    39,   144,    41,   145,    43,   146,    45,    46,
       47,    48,    49,    50,    51,    52,    53,     0,    54,    55,
       56,   147,    58,     0,     0,    59,   148,    61,    62,   106,
-     107,   108,   109,     0,     0,     0,   110,   268,   269,   270,
-     271,   272,   273,   274,     0,   275,   169,     0,   152,   130,
+     107,   108,   109,     0,     0,     0,   110,   270,   271,   272,
+     273,   274,   275,   276,     0,   277,   169,     0,   152,   130,
      131,     1,   132,   133,    87,   134,   135,   136,   137,   138,
      139,    88,    10,    89,    90,    12,    91,    92,    93,    94,
-      17,    18,    95,    96,    21,    97,   340,    24,    98,    99,
+      17,    18,    95,    96,    21,    97,    23,    24,    98,    99,
      100,   101,    28,     0,    30,    31,   102,   103,   104,   105,
-     258,   259,   260,   261,   262,   263,   142,   264,    36,    37,
-     265,   266,   267,   143,    39,   144,    41,   145,    43,   146,
+     260,   261,   262,   263,   264,   265,   142,   266,    36,    37,
+     267,   268,   269,   143,    39,   144,    41,   145,    43,   146,
       45,    46,    47,    48,    49,    50,    51,    52,    53,     0,
       54,    55,    56,   147,    58,     0,     0,    59,   148,    61,
-      62,   106,   107,   108,   109,     0,     0,     0,   110,   268,
-     269,   270,   271,   272,   273,   274,     0,     0,   169,     0,
+      62,   106,   107,   108,   109,     0,     0,     0,   110,   270,
+     271,   272,   273,   274,   275,   276,     0,   277,   169,     0,
      152,   130,   131,     1,   132,   133,    87,   134,   135,   136,
      137,   138,   139,    88,    10,    89,    90,    12,    91,    92,
-      93,    94,    17,    18,    95,    96,    21,    97,    23,    24,
+      93,    94,    17,    18,    95,    96,    21,    97,   344,    24,
       98,    99,   100,   101,    28,     0,    30,    31,   102,   103,
-     104,   105,     0,     0,     0,     0,     0,     0,   142,     0,
-      36,    37,     0,     0,     0,   143,   470,   144,   471,   145,
-     472,   146,   473,    46,    47,    48,    49,    50,    51,    52,
-     474,   475,   476,   477,    56,   147,    58,   478,   479,   480,
-     481,    61,    62,   106,   107,   108,   109,     0,     0,     0,
-     110,     0,     0,     0,   149,   150,     0,     0,     0,     0,
+     104,   105,   260,   261,   262,   263,   264,   265,   142,   266,
+      36,    37,   267,   268,   269,   143,    39,   144,    41,   145,
+      43,   146,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,     0,    54,    55,    56,   147,    58,     0,     0,    59,
+     148,    61,    62,   106,   107,   108,   109,     0,     0,     0,
+     110,   270,   271,   272,   273,   274,   275,   276,     0,     0,
      169,     0,   152,   130,   131,     1,   132,   133,    87,   134,
      135,   136,   137,   138,   139,    88,    10,    89,    90,    12,
       91,    92,    93,    94,    17,    18,    95,    96,    21,    97,
       23,    24,    98,    99,   100,   101,    28,     0,    30,    31,
      102,   103,   104,   105,     0,     0,     0,     0,     0,     0,
-     142,     0,    36,    37,     0,     0,     0,   143,    39,   144,
-      41,   145,    43,   146,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,     0,    54,    55,    56,   147,    58,     0,
-       0,    59,   148,    61,    62,   106,   107,   108,   109,     0,
+     142,     0,    36,    37,     0,     0,     0,   143,   476,   144,
+     477,   145,   478,   146,   479,    46,    47,    48,    49,    50,
+      51,    52,   480,   481,   482,   483,    56,   147,    58,   484,
+     485,   486,   487,    61,    62,   106,   107,   108,   109,     0,
        0,     0,   110,     0,     0,     0,   149,   150,     0,     0,
-       0,     0,   169,   238,   152,   130,   131,     1,   132,   133,
+       0,     0,   169,     0,   152,   130,   131,     1,   132,   133,
       87,   134,   135,   136,   137,   138,   139,    88,    10,    89,
       90,    12,    91,    92,    93,    94,    17,    18,    95,    96,
       21,    97,    23,    24,    98,    99,   100,   101,    28,     0,
@@ -1223,7 +1215,7 @@ static const yytype_int16 yytable[] =
       49,    50,    51,    52,    53,     0,    54,    55,    56,   147,
       58,     0,     0,    59,   148,    61,    62,   106,   107,   108,
      109,     0,     0,     0,   110,     0,     0,     0,   149,   150,
-       0,     0,     0,     0,   169,   321,   152,   130,   131,     1,
+       0,     0,     0,     0,   169,   240,   152,   130,   131,     1,
      132,   133,    87,   134,   135,   136,   137,   138,   139,    88,
       10,    89,    90,    12,    91,    92,    93,    94,    17,    18,
       95,    96,    21,    97,    23,    24,    98,    99,   100,   101,
@@ -1233,7 +1225,7 @@ static const yytype_int16 yytable[] =
       47,    48,    49,    50,    51,    52,    53,     0,    54,    55,
       56,   147,    58,     0,     0,    59,   148,    61,    62,   106,
      107,   108,   109,     0,     0,     0,   110,     0,     0,     0,
-     149,   150,     0,     0,     0,     0,   169,   369,   152,   130,
+     149,   150,     0,     0,     0,     0,   169,   323,   152,   130,
      131,     1,   132,   133,    87,   134,   135,   136,   137,   138,
      139,    88,    10,    89,    90,    12,    91,    92,    93,    94,
       17,    18,    95,    96,    21,    97,    23,    24,    98,    99,
@@ -1243,7 +1235,7 @@ static const yytype_int16 yytable[] =
       45,    46,    47,    48,    49,    50,    51,    52,    53,     0,
       54,    55,    56,   147,    58,     0,     0,    59,   148,    61,
       62,   106,   107,   108,   109,     0,     0,     0,   110,     0,
-       0,     0,   149,   150,     0,     0,     0,     0,   169,   490,
+       0,     0,   149,   150,     0,     0,     0,     0,   169,   373,
      152,   130,   131,     1,   132,   133,    87,   134,   135,   136,
      137,   138,   139,    88,    10,    89,    90,    12,    91,    92,
       93,    94,    17,    18,    95,    96,    21,    97,    23,    24,
@@ -1254,9 +1246,9 @@ static const yytype_int16 yytable[] =
       53,     0,    54,    55,    56,   147,    58,     0,     0,    59,
      148,    61,    62,   106,   107,   108,   109,     0,     0,     0,
      110,     0,     0,     0,   149,   150,     0,     0,     0,     0,
-     169,   560,   152,   130,   131,     1,   132,   133,    87,   134,
-     135,   136,   137,   138,   139,    88,    10,    89,    90,   140,
-      91,    92,    93,    94,    17,    18,    95,    96,   141,    97,
+     169,   496,   152,   130,   131,     1,   132,   133,    87,   134,
+     135,   136,   137,   138,   139,    88,    10,    89,    90,    12,
+      91,    92,    93,    94,    17,    18,    95,    96,    21,    97,
       23,    24,    98,    99,   100,   101,    28,     0,    30,    31,
      102,   103,   104,   105,     0,     0,     0,     0,     0,     0,
      142,     0,    36,    37,     0,     0,     0,   143,    39,   144,
@@ -1264,17 +1256,17 @@ static const yytype_int16 yytable[] =
       51,    52,    53,     0,    54,    55,    56,   147,    58,     0,
        0,    59,   148,    61,    62,   106,   107,   108,   109,     0,
        0,     0,   110,     0,     0,     0,   149,   150,     0,     0,
-       0,     0,   151,     0,   152,   130,   131,     1,   132,   133,
+       0,     0,   169,   566,   152,   130,   131,     1,   132,   133,
       87,   134,   135,   136,   137,   138,   139,    88,    10,    89,
-      90,    12,    91,    92,    93,    94,    17,    18,    95,    96,
-      21,    97,    23,    24,    98,    99,   100,   101,    28,     0,
+      90,   140,    91,    92,    93,    94,    17,    18,    95,    96,
+     141,    97,    23,    24,    98,    99,   100,   101,    28,     0,
       30,    31,   102,   103,   104,   105,     0,     0,     0,     0,
        0,     0,   142,     0,    36,    37,     0,     0,     0,   143,
       39,   144,    41,   145,    43,   146,    45,    46,    47,    48,
       49,    50,    51,    52,    53,     0,    54,    55,    56,   147,
       58,     0,     0,    59,   148,    61,    62,   106,   107,   108,
      109,     0,     0,     0,   110,     0,     0,     0,   149,   150,
-       0,     0,     0,     0,   169,     0,   152,   130,   131,     1,
+       0,     0,     0,     0,   151,     0,   152,   130,   131,     1,
      132,   133,    87,   134,   135,   136,   137,   138,   139,    88,
       10,    89,    90,    12,    91,    92,    93,    94,    17,    18,
       95,    96,    21,    97,    23,    24,    98,    99,   100,   101,
@@ -1284,7 +1276,7 @@ static const yytype_int16 yytable[] =
       47,    48,    49,    50,    51,    52,    53,     0,    54,    55,
       56,   147,    58,     0,     0,    59,   148,    61,    62,   106,
      107,   108,   109,     0,     0,     0,   110,     0,     0,     0,
-     149,   150,     0,     0,     0,     0,   151,     0,   152,   130,
+     149,   150,     0,     0,     0,     0,   169,     0,   152,   130,
      131,     1,   132,   133,    87,   134,   135,   136,   137,   138,
      139,    88,    10,    89,    90,    12,    91,    92,    93,    94,
       17,    18,    95,    96,    21,    97,    23,    24,    98,    99,
@@ -1292,9 +1284,9 @@ static const yytype_int16 yytable[] =
        0,     0,     0,     0,     0,     0,   142,     0,    36,    37,
        0,     0,     0,   143,    39,   144,    41,   145,    43,   146,
       45,    46,    47,    48,    49,    50,    51,    52,    53,     0,
-      54,    55,    56,   147,    58,     0,     0,    59,    60,    61,
+      54,    55,    56,   147,    58,     0,     0,    59,   148,    61,
       62,   106,   107,   108,   109,     0,     0,     0,   110,     0,
-       0,     0,   149,   150,     0,     0,     0,     0,   203,     0,
+       0,     0,   149,   150,     0,     0,     0,     0,   151,     0,
      152,   130,   131,     1,   132,   133,    87,   134,   135,   136,
      137,   138,   139,    88,    10,    89,    90,    12,    91,    92,
       93,    94,    17,    18,    95,    96,    21,    97,    23,    24,
@@ -1305,35 +1297,35 @@ static const yytype_int16 yytable[] =
       53,     0,    54,    55,    56,   147,    58,     0,     0,    59,
       60,    61,    62,   106,   107,   108,   109,     0,     0,     0,
      110,     0,     0,     0,   149,   150,     0,     0,     0,     0,
-     169,     0,   152,   130,   131,     1,   132,   133,    87,   134,
+     203,     0,   152,   130,   131,     1,   132,   133,    87,   134,
      135,   136,   137,   138,   139,    88,    10,    89,    90,    12,
       91,    92,    93,    94,    17,    18,    95,    96,    21,    97,
       23,    24,    98,    99,   100,   101,    28,     0,    30,    31,
      102,   103,   104,   105,     0,     0,     0,     0,     0,     0,
      142,     0,    36,    37,     0,     0,     0,   143,    39,   144,
       41,   145,    43,   146,    45,    46,    47,    48,    49,    50,
-      51,    52,   474,     0,   476,    55,    56,   147,    58,     0,
-       0,   480,   481,    61,    62,   106,   107,   108,   109,     0,
+      51,    52,    53,     0,    54,    55,    56,   147,    58,     0,
+       0,    59,    60,    61,    62,   106,   107,   108,   109,     0,
        0,     0,   110,     0,     0,     0,   149,   150,     0,     0,
-       0,     0,   169,     0,   152,   241,   242,     1,   243,   244,
+       0,     0,   169,     0,   152,   130,   131,     1,   132,   133,
       87,   134,   135,   136,   137,   138,   139,    88,    10,    89,
       90,    12,    91,    92,    93,    94,    17,    18,    95,    96,
       21,    97,    23,    24,    98,    99,   100,   101,    28,     0,
       30,    31,   102,   103,   104,   105,     0,     0,     0,     0,
        0,     0,   142,     0,    36,    37,     0,     0,     0,   143,
       39,   144,    41,   145,    43,   146,    45,    46,    47,    48,
-      49,    50,    51,    52,    53,     0,    54,    55,    56,   147,
-      58,     0,     0,    59,   148,    61,    62,   106,   107,   108,
+      49,    50,    51,    52,   480,     0,   482,    55,    56,   147,
+      58,     0,     0,   486,   487,    61,    62,   106,   107,   108,
      109,     0,     0,     0,   110,     0,     0,     0,   149,   150,
-       0,     0,     0,     0,   169,     0,   152,   130,   131,     1,
-     132,   133,    87,   134,   135,   136,   137,   138,   139,    88,
+       0,     0,     0,     0,   169,     0,   152,   243,   244,     1,
+     245,   246,    87,   134,   135,   136,   137,   138,   139,    88,
       10,    89,    90,    12,    91,    92,    93,    94,    17,    18,
       95,    96,    21,    97,    23,    24,    98,    99,   100,   101,
       28,     0,    30,    31,   102,   103,   104,   105,     0,     0,
        0,     0,     0,     0,   142,     0,    36,    37,     0,     0,
        0,   143,    39,   144,    41,   145,    43,   146,    45,    46,
-      47,    48,    49,    50,    51,    52,   542,     0,   543,    55,
-      56,   147,    58,     0,     0,   544,   545,    61,    62,   106,
+      47,    48,    49,    50,    51,    52,    53,     0,    54,    55,
+      56,   147,    58,     0,     0,    59,   148,    61,    62,   106,
      107,   108,   109,     0,     0,     0,   110,     0,     0,     0,
      149,   150,     0,     0,     0,     0,   169,     0,   152,   130,
      131,     1,   132,   133,    87,   134,   135,   136,   137,   138,
@@ -1342,11 +1334,45 @@ static const yytype_int16 yytable[] =
      100,   101,    28,     0,    30,    31,   102,   103,   104,   105,
        0,     0,     0,     0,     0,     0,   142,     0,    36,    37,
        0,     0,     0,   143,    39,   144,    41,   145,    43,   146,
-      45,    46,    47,    48,    49,    50,    51,    52,    53,     0,
-      54,    55,    56,   147,    58,     0,     0,    59,   148,    61,
+      45,    46,    47,    48,    49,    50,    51,    52,   548,     0,
+     549,    55,    56,   147,    58,     0,     0,   550,   551,    61,
       62,   106,   107,   108,   109,     0,     0,     0,   110,     0,
-       0,     0,   413,     0,     0,     0,     0,     1,   169,     0,
-     152,     3,     4,     5,     6,     7,     8,     9,    10,     0,
+       0,     0,   149,   150,     0,     0,     0,     0,   169,     0,
+     152,   130,   131,     1,   132,   133,    87,   134,   135,   136,
+     137,   138,   139,    88,    10,    89,    90,    12,    91,    92,
+      93,    94,    17,    18,    95,    96,    21,    97,    23,    24,
+      98,    99,   100,   101,    28,     0,    30,    31,   102,   103,
+     104,   105,     0,     0,     0,     0,     0,     0,   142,     0,
+      36,    37,     0,     0,     0,   143,    39,   144,    41,   145,
+      43,   146,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,     0,    54,    55,    56,   147,    58,     0,     0,    59,
+     148,    61,    62,   106,   107,   108,   109,     0,     0,     0,
+     110,     0,     0,     0,   417,     0,     0,     0,     0,     1,
+     169,     0,   152,     3,     4,     5,     6,     7,     8,     9,
+      10,     0,    11,    12,    13,    14,    15,    16,    17,    18,
+       0,    20,    21,    22,    23,    24,    25,    26,    27,     0,
+      28,    29,    30,    31,     0,    33,    34,    35,     0,     0,
+       0,     0,     0,     0,   709,     0,    36,    37,     0,     0,
+       0,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,     0,    54,    55,
+      56,    57,    58,     0,     0,    59,    60,    61,    62,    63,
+      64,     0,     0,    66,     0,     0,    67,     0,   260,   261,
+     262,   263,   264,   265,   418,   266,     0,     0,   267,   268,
+     269,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   270,   271,   272,
+     273,   274,   275,   276,   710,     1,     0,     0,     2,     3,
+       4,     5,     6,     7,     8,     9,    10,     0,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,     0,    28,    29,    30,    31,
+      32,    33,    34,    35,     0,     0,     0,     0,     0,     0,
+       0,     0,    36,    37,     0,     0,     0,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,     0,    54,    55,    56,    57,    58,     0,
+       0,    59,    60,    61,    62,    63,    64,    65,     0,    66,
+       0,     0,    67,     0,     0,     0,     0,     1,     0,     0,
+      68,     3,     4,     5,     6,     7,     8,     9,    10,     0,
       11,    12,    13,    14,    15,    16,    17,    18,     0,    20,
       21,    22,    23,    24,    25,    26,    27,     0,    28,    29,
       30,    31,     0,    33,    34,    35,     0,     0,     0,     0,
@@ -1354,69 +1380,42 @@ static const yytype_int16 yytable[] =
       39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
       49,    50,    51,    52,    53,     0,    54,    55,    56,    57,
       58,     0,     0,    59,    60,    61,    62,    63,    64,     0,
-       0,    66,     0,     0,    67,     0,     0,     0,     0,     0,
-       1,     0,   414,     2,     3,     4,     5,     6,     7,     8,
-       9,    10,     0,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
-       0,    28,    29,    30,    31,    32,    33,    34,    35,     0,
-       0,     0,     0,     0,     0,     0,     0,    36,    37,     0,
-       0,     0,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,     0,    54,
-      55,    56,    57,    58,     0,     0,    59,    60,    61,    62,
-      63,    64,    65,     0,    66,     0,     0,    67,     0,     0,
-       0,     0,     1,     0,     0,    68,     3,     4,     5,     6,
-       7,     8,     9,    10,     0,    11,    12,    13,    14,    15,
-      16,    17,    18,     0,    20,    21,    22,    23,    24,    25,
-      26,    27,     0,    28,    29,    30,    31,     0,    33,    34,
-      35,     0,     0,     0,     0,     0,     0,     0,     0,    36,
-      37,     0,     0,     0,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-       0,    54,    55,    56,    57,    58,     0,     0,    59,    60,
-      61,    62,    63,    64,     0,     0,    66,     0,     0,    67,
-       0,     0,     0,     0,     1,     0,     0,   448,     3,     4,
-       5,     6,     7,     8,     9,    10,     0,    11,    12,    13,
-      14,    15,    16,    17,    18,     0,    20,    21,    22,    23,
-      24,    25,    26,    27,     0,    28,    29,    30,    31,     0,
-      33,    34,    35,     0,     0,     0,     0,     0,     0,     0,
-       0,    36,    37,     0,     0,     0,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,     0,    54,    55,    56,    57,    58,     0,     0,
-      59,    60,    61,    62,    63,    64,     0,     0,    66,     0,
-       0,    67,     0,     0,     0,     0,     1,     0,     0,   589,
-       3,     4,     5,     6,     7,     8,     9,    10,     0,    11,
-      12,    13,    14,    15,    16,    17,    18,     0,    20,    21,
-      22,    23,    24,    25,    26,    27,     0,    28,    29,    30,
-      31,     0,    33,    34,    35,     0,     0,     0,     0,     0,
-       0,     0,     0,    36,    37,     0,     0,     0,    38,    39,
-      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
-      50,    51,    52,    53,     0,    54,    55,    56,    57,    58,
-       0,     0,    59,    60,    61,    62,    63,    64,     0,     0,
-      66,     0,     0,    67,     0,     0,     0,     0,     1,     0,
-       0,   631,     3,     4,     5,     6,     7,     8,     9,    10,
-       0,    11,    12,    13,    14,    15,    16,    17,    18,     0,
-      20,    21,    22,    23,    24,    25,    26,    27,     0,    28,
-      29,    30,    31,     0,    33,    34,    35,     0,     0,     0,
-       0,     0,     0,     0,     0,    36,    37,     0,     0,     0,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
-      48,    49,    50,    51,    52,    53,     0,    54,    55,    56,
-      57,    58,     0,     0,    59,    60,    61,    62,    63,    64,
-       0,     0,     0,     0,     0,    67,     0,     0,     0,     0,
-       0,     1,     0,   524,    87,     3,     4,     5,     6,     7,
-       8,    88,    10,    89,    90,    12,    91,    92,    93,    94,
-      17,    18,    95,    96,    21,    97,    23,    24,    98,    99,
-     100,   101,    28,     0,    30,    31,   102,   103,   104,   105,
+       0,    66,     0,     0,    67,     0,     0,     0,     0,     1,
+       0,     0,   452,     3,     4,     5,     6,     7,     8,     9,
+      10,     0,    11,    12,    13,    14,    15,    16,    17,    18,
+       0,    20,    21,    22,    23,    24,    25,    26,    27,     0,
+      28,    29,    30,    31,     0,    33,    34,    35,     0,     0,
+       0,     0,     0,     0,     0,     0,    36,    37,     0,     0,
+       0,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    48,    49,    50,    51,    52,    53,     0,    54,    55,
+      56,    57,    58,     0,     0,    59,    60,    61,    62,    63,
+      64,     0,     0,    66,     0,     0,    67,     0,     0,     0,
+       0,     1,     0,     0,   597,     3,     4,     5,     6,     7,
+       8,     9,    10,     0,    11,    12,    13,    14,    15,    16,
+      17,    18,     0,    20,    21,    22,    23,    24,    25,    26,
+      27,     0,    28,    29,    30,    31,     0,    33,    34,    35,
        0,     0,     0,     0,     0,     0,     0,     0,    36,    37,
        0,     0,     0,    38,    39,    40,    41,    42,    43,    44,
       45,    46,    47,    48,    49,    50,    51,    52,    53,     0,
       54,    55,    56,    57,    58,     0,     0,    59,    60,    61,
-      62,   106,   107,   108,   109,     0,     1,     0,   110,    87,
+      62,    63,    64,     0,     0,    66,     0,     0,    67,     0,
+       0,     0,     0,     1,     0,     0,   639,     3,     4,     5,
+       6,     7,     8,     9,    10,     0,    11,    12,    13,    14,
+      15,    16,    17,    18,     0,    20,    21,    22,    23,    24,
+      25,    26,    27,     0,    28,    29,    30,    31,     0,    33,
+      34,    35,     0,     0,     0,     0,     0,     0,     0,     0,
+      36,    37,     0,     0,     0,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,     0,    54,    55,    56,    57,    58,     0,     0,    59,
+      60,    61,    62,    63,    64,     0,     0,     0,     0,     0,
+      67,     0,     0,     0,     0,     0,     1,     0,   530,    87,
        3,     4,     5,     6,     7,     8,    88,    10,    89,    90,
       12,    91,    92,    93,    94,    17,    18,    95,    96,    21,
       97,    23,    24,    98,    99,   100,   101,    28,     0,    30,
       31,   102,   103,   104,   105,     0,     0,     0,     0,     0,
        0,     0,     0,    36,    37,     0,     0,     0,    38,    39,
       40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
-      50,    51,    52,    53,     0,    54,    55,    56,   180,    58,
+      50,    51,    52,    53,     0,    54,    55,    56,    57,    58,
        0,     0,    59,    60,    61,    62,   106,   107,   108,   109,
        0,     1,     0,   110,    87,     3,     4,     5,     6,     7,
        8,    88,    10,    89,    90,    12,    91,    92,    93,    94,
@@ -1424,202 +1423,201 @@ static const yytype_int16 yytable[] =
      100,   101,    28,     0,    30,    31,   102,   103,   104,   105,
        0,     0,     0,     0,     0,     0,     0,     0,    36,    37,
        0,     0,     0,    38,    39,    40,    41,    42,    43,    44,
-      45,   227,   228,   229,   230,   231,    51,   232,    53,     0,
-      54,    55,   233,    57,    58,     0,     0,    59,    60,    61,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,     0,
+      54,    55,    56,   180,    58,     0,     0,    59,    60,    61,
       62,   106,   107,   108,   109,     0,     1,     0,   110,    87,
-     134,   135,     5,     6,   138,   139,    88,    10,    89,    90,
+       3,     4,     5,     6,     7,     8,    88,    10,    89,    90,
       12,    91,    92,    93,    94,    17,    18,    95,    96,    21,
       97,    23,    24,    98,    99,   100,   101,    28,     0,    30,
       31,   102,   103,   104,   105,     0,     0,     0,     0,     0,
-       0,     0,     0,    36,    37,     0,     0,     0,   143,    39,
-     144,    41,   145,    43,   146,    45,    46,    47,    48,    49,
-      50,    51,    52,    53,     0,    54,    55,    56,   421,    58,
+       0,     0,     0,    36,    37,     0,     0,     0,    38,    39,
+      40,    41,    42,    43,    44,    45,   229,   230,   231,   232,
+     233,    51,   234,    53,     0,    54,    55,   235,    57,    58,
        0,     0,    59,    60,    61,    62,   106,   107,   108,   109,
-       1,     0,     0,   110,     3,     4,     5,     6,     7,     8,
-       9,    10,     0,    11,    12,    13,    14,    15,     0,    17,
-      18,     0,    20,    21,    22,    23,    24,    25,    99,    27,
-       0,    28,     0,    30,    31,     0,    33,    34,    35,     0,
-       0,     0,     0,     0,     0,     0,     0,    36,    37,     0,
-       0,     0,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,   597,    54,
-      55,    56,    57,    58,     0,     0,    59,    60,    61,    62,
-       0,    64,   258,   259,   260,   261,     0,    67,   598,   264,
-       0,     0,   265,   266,   267,     0,   258,   259,   260,   261,
-     262,   263,     0,   264,   323,     0,   265,   266,   267,     0,
-     324,     0,     0,     0,     0,     0,     0,     0,   258,   259,
-     260,   261,   262,   263,     0,   264,     0,     0,   265,   266,
-     267,   268,   269,   270,   271,   272,   273,   274,   325,     0,
-       0,     0,     0,     0,   326,   268,   269,   270,   271,   272,
-     273,   274,   258,   259,   260,   261,   262,   263,     0,   264,
-     327,     0,   265,   266,   267,     0,   328,   268,   269,   270,
-     271,   272,   273,   274,   258,   259,   260,   261,   262,   263,
-       0,   264,     0,     0,   265,   266,   267,     0,     0,     0,
-       0,     0,     0,     0,   329,     0,     0,     0,     0,     0,
-     330,   268,   269,   270,   271,   272,   273,   274,   258,   259,
-     260,   261,   262,   263,     0,   264,   562,     0,   265,   266,
-     267,     0,     0,   268,   269,   270,   271,   272,   273,   274,
-     258,   259,   260,   261,   262,   263,     0,   264,     0,     0,
-     265,   266,   267,     0,     0,     0,     0,     0,     0,     0,
-     563,     0,     0,     0,     0,     0,     0,   268,   269,   270,
-     271,   272,   273,   274,   258,   259,   260,   261,   262,   263,
-       0,   264,   564,     0,   265,   266,   267,     0,     0,   268,
-     269,   270,   271,   272,   273,   274,   258,   259,   260,   261,
-     262,   263,     0,   264,     0,     0,   265,   266,   267,     0,
-       0,     0,     0,     0,     0,     0,   565,     0,     0,     0,
-       0,     0,     0,   268,   269,   270,   271,   272,   273,   274,
-     258,   259,   260,   261,   262,   263,     0,   264,     0,     0,
-     265,   266,   267,   283,     0,   268,   269,   270,   271,   272,
-     273,   274,   258,   259,   260,   261,   262,   263,     0,   264,
-       0,     0,   265,   266,   267,   258,   259,   260,   261,   262,
-     263,     0,   264,     0,     0,   265,   266,   267,     0,   268,
-     269,   270,   271,   272,   273,   274,   258,   259,   260,   261,
-     262,   263,     0,   264,     0,     0,   265,   266,   267,     0,
-       0,   268,   269,   270,   271,   272,   273,   274,     0,     0,
-       0,     0,     0,     0,   268,   269,   270,   271,   272,   273,
-     274,     0,   357,     0,   358,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   268,   269,   270,   271,   272,
-     273,   274,     0,   457,     0,   358,   258,   259,   260,   261,
-     262,   263,     0,   264,     0,     0,   265,   266,   267,   393,
-     394,   395,   396,   397,   398,     0,   399,     0,     0,   400,
-     401,   402,   393,   394,   395,   396,   397,   398,     0,   399,
-       0,     0,   400,   401,   402,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   268,   269,   270,   271,   272,
-     273,   274,     0,     0,     0,   358,     0,     0,   403,   404,
-     405,   406,   407,   408,   409,     0,   410,     0,     0,     0,
-       0,   403,   404,   405,   406,   407,   408,   409,     0,   488,
-     393,   394,   395,   396,   397,   398,     0,   399,     0,     0,
-     400,   401,   402,   258,   259,   260,   261,   262,   263,     0,
-     264,     0,     0,   265,   266,   267,     0,     0,     0,     0,
-       0,   258,   259,   260,   261,   262,   263,     0,   264,     0,
-       0,   265,   266,   267,     0,     0,     0,     0,     0,   403,
-     404,   405,   406,   407,   408,   409,     0,   580,     0,     0,
-       0,     0,   268,   269,   270,   271,   272,   273,   274,   554,
-     354,   355,     0,     0,     0,     0,     0,     0,     0,     0,
-     268,   269,   270,   271,   272,   273,   274,   258,   259,   260,
-     261,   262,   263,     0,   264,     0,     0,   265,   266,   267,
-     393,   394,   395,   396,   397,   398,     0,   399,     0,     0,
-     400,   401,   402,   641,   642,     0,   643,   644,   645,     0,
-     646,     0,     0,   647,   648,   649,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   268,   269,   270,   271,
-     272,   273,   274,     0,     0,     0,     0,     0,     0,   403,
-     404,   405,   406,   407,   408,   409,     0,     0,     0,     0,
-       0,     0,   650,   651,   652,   653,   654,   655,   656,   641,
-     642,     0,   643,     0,     0,     0,   646,     0,     0,   647,
-     648,   649,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     1,     0,   110,    87,   134,   135,     5,     6,   138,
+     139,    88,    10,    89,    90,    12,    91,    92,    93,    94,
+      17,    18,    95,    96,    21,    97,    23,    24,    98,    99,
+     100,   101,    28,     0,    30,    31,   102,   103,   104,   105,
+       0,     0,     0,     0,     0,     0,     0,     0,    36,    37,
+       0,     0,     0,   143,    39,   144,    41,   145,    43,   146,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,     0,
+      54,    55,    56,   425,    58,     0,     0,    59,    60,    61,
+      62,   106,   107,   108,   109,     1,     0,     0,   110,     3,
+       4,     5,     6,     7,     8,     9,    10,     0,    11,    12,
+      13,    14,    15,     0,    17,    18,     0,    20,    21,    22,
+      23,    24,    25,    99,    27,     0,    28,     0,    30,    31,
+       0,    33,    34,    35,     0,     0,     0,     0,     0,     0,
+       0,     0,    36,    37,     0,     0,     0,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,   605,    54,    55,    56,    57,    58,     0,
+       0,    59,    60,    61,    62,     0,    64,   260,   261,   262,
+     263,     0,    67,   606,   266,     0,     0,   267,   268,   269,
+       0,   260,   261,   262,   263,   264,   265,     0,   266,   327,
+       0,   267,   268,   269,     0,   328,     0,     0,     0,     0,
+       0,     0,     0,   260,   261,   262,   263,   264,   265,     0,
+     266,     0,     0,   267,   268,   269,   270,   271,   272,   273,
+     274,   275,   276,   329,     0,     0,     0,     0,     0,   330,
+     270,   271,   272,   273,   274,   275,   276,   260,   261,   262,
+     263,   264,   265,     0,   266,   331,     0,   267,   268,   269,
+       0,   332,   270,   271,   272,   273,   274,   275,   276,   260,
+     261,   262,   263,   264,   265,     0,   266,     0,     0,   267,
+     268,   269,     0,     0,     0,     0,     0,     0,     0,   333,
+       0,     0,     0,     0,     0,   334,   270,   271,   272,   273,
+     274,   275,   276,   260,   261,   262,   263,   264,   265,     0,
+     266,   570,     0,   267,   268,   269,     0,     0,   270,   271,
+     272,   273,   274,   275,   276,   260,   261,   262,   263,   264,
+     265,     0,   266,     0,     0,   267,   268,   269,     0,     0,
+       0,     0,     0,     0,     0,   571,     0,     0,     0,     0,
+       0,     0,   270,   271,   272,   273,   274,   275,   276,   260,
+     261,   262,   263,   264,   265,     0,   266,   572,     0,   267,
+     268,   269,     0,     0,   270,   271,   272,   273,   274,   275,
+     276,   260,   261,   262,   263,   264,   265,     0,   266,     0,
+       0,   267,   268,   269,     0,     0,     0,     0,     0,     0,
+       0,   573,     0,     0,     0,     0,     0,     0,   270,   271,
+     272,   273,   274,   275,   276,   260,   261,   262,   263,   264,
+     265,     0,   266,   665,     0,   267,   268,   269,     0,     0,
+     270,   271,   272,   273,   274,   275,   276,   649,   650,     0,
+     651,   652,   653,     0,   654,     0,     0,   655,   656,   657,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   650,   651,
-     652,   653,   654,   655,   656
+       0,     0,   285,     0,   270,   271,   272,   273,   274,   275,
+     276,   260,   261,   262,   263,   264,   265,     0,   266,     0,
+       0,   267,   268,   269,     0,     0,   658,   659,   660,   661,
+     662,   663,   664,   260,   261,   262,   263,   264,   265,     0,
+     266,     0,     0,   267,   268,   269,   260,   261,   262,   263,
+     264,   265,     0,   266,     0,     0,   267,   268,   269,     0,
+     270,   271,   272,   273,   274,   275,   276,   260,   261,   262,
+     263,   264,   265,     0,   266,     0,     0,   267,   268,   269,
+       0,     0,   270,   271,   272,   273,   274,   275,   276,     0,
+     361,     0,   362,     0,     0,   270,   271,   272,   273,   274,
+     275,   276,     0,   461,     0,   362,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   270,   271,   272,   273,
+     274,   275,   276,     0,     0,     0,   362,   397,   398,   399,
+     400,   401,   402,     0,   403,     0,     0,   404,   405,   406,
+     397,   398,   399,   400,   401,   402,     0,   403,     0,     0,
+     404,   405,   406,   397,   398,   399,   400,   401,   402,     0,
+     403,     0,     0,   404,   405,   406,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   407,   408,   409,   410,
+     411,   412,   413,     0,   414,     0,     0,     0,     0,   407,
+     408,   409,   410,   411,   412,   413,     0,   494,     0,     0,
+       0,     0,   407,   408,   409,   410,   411,   412,   413,     0,
+     588,   260,   261,   262,   263,   264,   265,     0,   266,     0,
+       0,   267,   268,   269,     0,     0,     0,     0,     0,   260,
+     261,   262,   263,   264,   265,     0,   266,     0,     0,   267,
+     268,   269,   260,   261,   262,   263,   264,   265,     0,   266,
+       0,     0,   267,   268,   269,     0,     0,     0,     0,     0,
+     270,   271,   272,   273,   274,   275,   276,   560,   358,   359,
+       0,     0,     0,     0,     0,     0,     0,     0,   270,   271,
+     272,   273,   274,   275,   276,     0,     0,     0,     0,     0,
+       0,   270,   271,   272,   273,   274,   275,   276,   397,   398,
+     399,   400,   401,   402,     0,   403,     0,     0,   404,   405,
+     406,   649,   650,     0,   651,   652,   653,     0,   654,     0,
+       0,   655,   656,   657,   649,   650,     0,   651,     0,     0,
+       0,   654,     0,     0,   655,   656,   657,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   407,   408,   409,
+     410,   411,   412,   413,     0,     0,     0,     0,     0,     0,
+     658,   659,   660,   661,   662,   663,   664,     0,     0,     0,
+       0,     0,     0,   658,   659,   660,   661,   662,   663,   664
 };
 
 static const yytype_int16 yycheck[] =
 {
-       0,     2,     0,    67,    27,   414,   278,    35,   434,   417,
-     252,     1,    13,     9,   224,   523,     1,     1,    19,    15,
-       9,     1,   430,   584,     1,     1,    27,     1,    52,   239,
-       1,    32,   166,   275,    35,   166,    64,     1,   446,     1,
-       1,     1,     1,   177,    34,     1,   177,   455,     1,     1,
-      37,    34,     1,     1,   188,     1,     1,   188,     1,     1,
-      47,    18,    25,    64,    65,   101,   200,    67,    31,   200,
-      70,   101,    70,   634,    71,    99,   100,    14,     0,    16,
-      72,   589,    79,    20,   356,    25,    25,    52,    25,   101,
-     224,   101,   102,   224,    33,    34,    33,    34,   102,   371,
-      89,    71,    71,    39,    40,   239,   667,    47,   239,    79,
-      79,   101,   101,   101,   523,   357,   101,   101,   527,   101,
-     392,   101,   530,   631,   101,   101,    63,   101,   151,   107,
-     101,   103,   540,    90,    99,   100,    75,   101,    75,   101,
-     101,   101,   101,   171,    52,   101,   147,   101,   101,   101,
-     558,   152,   101,   101,    71,   101,   101,    71,   101,   101,
-     370,    31,    79,   101,   102,    79,   194,    58,   410,    60,
-     171,    62,   101,    64,   115,   116,   117,   178,    52,   180,
-     589,   118,   119,   120,   121,   101,   102,   613,   596,    97,
-      98,    99,   100,   194,   135,   136,   137,   138,   139,   101,
-     102,   202,    31,   140,   141,   106,   143,   144,   145,   146,
-     107,   148,   107,   103,   151,   457,   102,   107,   107,   491,
-     221,   106,   631,    97,    98,    99,   100,   635,   500,   252,
-      52,    29,   169,    55,   102,   661,   370,   101,   106,   370,
-     293,   294,   179,   101,   101,   101,   488,   101,   101,   313,
-     522,   659,    10,    11,    31,   101,    14,    15,   101,   101,
-     101,   101,   101,   101,    52,   673,   203,    55,   101,   292,
-     293,   294,    29,   101,    96,    97,    98,    99,   100,   470,
-     471,   472,   473,   283,   692,   283,   477,   102,    18,   561,
-     101,   292,   293,   294,   702,   703,   292,   293,   294,   101,
-      58,   709,    60,    92,    62,   577,    64,   101,    96,    97,
-      98,    99,   100,   313,   314,    91,   101,   104,   104,   101,
-      78,   258,   259,   260,   261,   262,   263,   264,   265,   266,
-     267,   268,   269,   270,   271,   272,   273,   274,   580,   101,
-     101,    92,   101,     9,    31,    73,    90,   101,   104,   104,
-      91,   101,    37,   101,   101,     9,   628,    73,   104,   104,
-      91,   101,    73,   300,   365,   101,   104,    91,   305,   101,
-      91,    91,   101,    91,   101,   101,   101,   114,   115,   116,
-     117,    91,   101,   433,   101,   439,   101,   324,    70,   326,
-      34,   328,   451,   330,   527,   353,   574,   134,   135,   136,
-     137,   138,   139,    -1,    -1,   142,    -1,    -1,   542,   543,
-     544,   545,   149,   150,   414,   365,    -1,   417,    -1,    -1,
-      -1,    -1,   359,   360,   361,   362,    -1,   364,   365,    -1,
-     430,   368,    -1,   434,   435,    -1,    -1,   374,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,   446,    -1,    -1,    -1,
-      -1,   451,    -1,    -1,    -1,   455,   393,   394,   395,   396,
+       0,     2,     0,    35,     9,   529,   254,   421,    67,    27,
+      15,     1,    13,   280,   438,   226,   418,     1,    19,     1,
+     434,     1,    18,     1,     1,     1,    27,   166,     1,   277,
+     241,    32,    64,    52,    35,     1,   450,     1,   177,   101,
+       1,     1,     1,     1,    34,   459,    25,     1,     1,   188,
+      25,   592,     1,     1,     1,     1,     1,     1,    33,    34,
+      34,   200,   103,    64,    65,    37,   107,    67,    47,     9,
+      70,   101,    70,   597,    71,    47,    71,    14,    71,    16,
+      99,   100,    79,    20,    79,     0,    79,   226,    25,    25,
+      71,   101,   102,   360,    90,    31,    33,    34,    79,   101,
+      75,   642,   241,    58,    72,    60,    71,    62,   375,    64,
+     102,   101,   103,   361,    79,   639,   101,   101,    31,   101,
+      52,   101,   536,   101,   101,   101,    63,   529,   101,   396,
+      31,   533,   546,   151,   675,   101,   107,   101,    75,   171,
+     101,   101,   101,   101,    39,    40,   147,   101,   101,    89,
+     564,   152,   101,   101,   101,   101,   101,   101,   101,   102,
+     102,   101,   194,   374,   106,    31,   414,    99,   100,    31,
+     171,    52,   101,   102,    55,   101,   102,   178,   101,   180,
+     101,   118,   119,   120,   121,   476,   477,   478,   479,   101,
+     604,   107,   483,   194,   102,   597,   107,   621,   107,   166,
+     106,   202,   106,   140,   141,   101,   143,   144,   145,   146,
+     177,   148,   101,   461,   151,    96,    97,    98,    99,   100,
+      29,   188,   223,   101,    52,   295,   296,    55,   101,   643,
+     497,   101,   169,   200,    52,   374,   254,   639,   101,   506,
+      31,   101,   179,   101,   101,   669,   494,   101,   549,   550,
+     551,   101,   101,   667,   101,   101,   315,    15,    15,   226,
+      52,   528,    29,   102,   101,    18,   203,   681,    96,    97,
+      98,    99,   100,    92,   241,   101,   294,   295,   296,    97,
+      98,    99,   100,   104,   101,   285,   700,   285,   101,   294,
+     295,   296,   104,   294,   295,   296,   710,   711,   101,   101,
+     567,   101,    91,   717,   101,    97,    98,    99,   100,    92,
+       9,   101,    31,    73,    90,   315,   316,   104,   585,   104,
+     101,   101,    37,   260,   261,   262,   263,   264,   265,   266,
+     267,   268,   269,   270,   271,   272,   273,   274,   275,   276,
+     588,    91,    10,    11,     9,   101,    14,    15,   649,   650,
+     651,   652,   653,   654,   655,   656,   657,   658,   659,   660,
+     661,   662,   663,   664,   101,   302,   104,    73,   369,   636,
+     307,    91,   104,   101,   101,    73,   101,    91,   104,   101,
+     101,   114,   115,   116,   117,   101,    91,    91,    91,   101,
+      58,   328,    60,   330,    62,   332,    64,   334,   699,    91,
+     101,   134,   135,   136,   137,   138,   139,   374,    70,   142,
+      78,   101,   101,   437,   443,    34,   149,   150,   418,   455,
+     533,   421,   115,   116,   117,   582,   363,   364,   365,   366,
+     357,   368,   369,    -1,   434,   372,   369,   438,   439,    -1,
+      -1,   378,   135,   136,   137,   138,   139,    -1,    -1,    -1,
+     450,    -1,    -1,    -1,     1,   455,    -1,    -1,    -1,   459,
      397,   398,   399,   400,   401,   402,   403,   404,   405,   406,
-     407,   408,   409,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     407,   408,   409,   410,   411,   412,   413,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      37,    -1,    -1,    -1,   431,   432,    -1,    -1,    45,    46,
+      47,    48,    49,    50,    -1,    52,    -1,    -1,    55,    56,
+      57,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   558,    -1,    -1,   529,
+      -1,    -1,    -1,   533,    -1,   535,   536,   535,   475,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,   546,    94,    95,    96,
+      97,    98,    99,   100,   101,    -1,    -1,   558,    -1,    -1,
+      -1,     1,    -1,    -1,   564,    -1,    -1,    -1,    -1,    -1,
+     507,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   548,   549,   550,   551,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   593,   327,   593,   329,   597,   331,    -1,
+     333,    -1,    -1,    -1,   604,    45,    46,    47,    48,    49,
+      50,    -1,    52,    -1,    -1,    55,    56,    57,    -1,    -1,
+     621,    -1,    -1,   356,   357,   358,   359,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   639,
+      -1,    -1,    -1,   643,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    94,    95,    96,    97,    98,    99,
+     100,   101,    -1,    -1,    -1,    -1,    -1,   667,   669,   606,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-     427,   428,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   641,   642,   643,
-     644,   645,   646,   647,   648,   649,   650,   651,   652,   653,
-     654,   655,   656,   523,   552,    -1,     1,   527,    -1,   529,
-     530,   529,   469,    -1,    -1,    31,    -1,    -1,    -1,    -1,
-     540,   543,   544,   545,    -1,    -1,    -1,    -1,    -1,    45,
-      46,   552,    48,    49,    50,    -1,    52,   691,   558,    55,
-      56,    57,    37,    -1,   501,    -1,    -1,    -1,    -1,    -1,
+      -1,   681,   649,   650,   651,   652,   653,   654,   655,   656,
+     657,   658,   659,   660,   661,   662,   663,   664,    -1,    -1,
+     700,    -1,   435,    -1,    -1,    -1,    -1,    -1,   645,    -1,
+     710,   711,     1,    -1,    -1,    -1,    -1,   717,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,     1,    -1,    -1,   462,
+     463,    -1,   699,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,   474,    -1,    -1,    -1,    -1,    -1,   480,    -1,   482,
+      -1,    -1,    -1,   486,   487,    -1,    45,    46,    47,    48,
+      49,    50,    -1,    52,    -1,    -1,    55,    56,    57,    -1,
       45,    46,    47,    48,    49,    50,    -1,    52,    -1,    -1,
-      55,    56,    57,    -1,    -1,   585,   323,   585,   325,   589,
-     327,    -1,   329,    -1,    -1,    -1,   596,    -1,    94,    95,
-      96,    97,    98,    99,   100,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   613,    -1,    -1,   352,   353,   354,   355,    94,
+      55,    56,    57,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    94,    95,    96,    97,    98,
+      99,   100,   101,     1,    -1,   548,   549,   550,   551,    94,
       95,    96,    97,    98,    99,   100,   101,    -1,    -1,    -1,
-       1,   631,    -1,    -1,    -1,   635,    -1,    -1,    -1,   641,
-     642,   643,   644,   645,   646,   647,   648,   649,   650,   651,
-     652,   653,   654,   655,   656,    -1,    -1,    -1,    -1,   659,
-     661,   598,    -1,    -1,    -1,    -1,     1,    -1,    -1,    -1,
-      -1,    -1,    -1,   673,    45,    46,    47,    48,    49,    50,
-      -1,    52,    -1,    -1,    55,    56,    57,    -1,    -1,   691,
-      -1,    -1,   692,    -1,   431,    -1,    -1,    -1,    -1,    -1,
-     637,     1,   702,   703,    -1,    -1,    -1,    -1,    -1,   709,
-      45,    46,    47,    48,    49,    50,    -1,    52,    -1,    -1,
-      55,    56,    57,    94,    95,    96,    97,    98,    99,   100,
-     101,   468,    -1,    -1,    -1,    -1,    -1,   474,    -1,   476,
-      -1,    -1,    -1,   480,   481,    45,    46,    47,    48,    49,
-      50,    -1,    52,    -1,    -1,    55,    56,    57,    -1,    94,
-      95,    96,    97,    98,    99,   100,   101,     1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,   570,   571,   572,
+     573,    -1,    -1,   576,   577,   578,   579,     1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,
+      48,    49,    50,    -1,    52,    -1,    -1,    55,    56,    57,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    94,    95,    96,    97,    98,    99,
-     100,   101,     1,    -1,    -1,   542,   543,   544,   545,    -1,
-      -1,    45,    46,    47,    48,    49,    50,    -1,    52,    -1,
-      -1,    55,    56,    57,    -1,   562,   563,   564,   565,    -1,
-      -1,   568,   569,   570,   571,     1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    45,    46,    47,    48,
-      49,    50,    -1,    52,    -1,    -1,    55,    56,    57,    -1,
+      -1,    45,    46,    47,    48,    49,    50,    -1,    52,   632,
+      -1,    55,    56,    57,    -1,    -1,    94,    95,    96,    97,
+      98,    99,   100,   101,    -1,    -1,   649,   650,   651,   652,
+     653,   654,   655,   656,   657,   658,   659,   660,   661,   662,
+     663,   664,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   672,
       94,    95,    96,    97,    98,    99,   100,   101,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    45,
-      46,    47,    48,    49,    50,    -1,    52,   624,    -1,    55,
-      56,    57,    -1,    -1,    -1,    94,    95,    96,    97,    98,
-      99,   100,   101,    -1,   641,   642,   643,   644,   645,   646,
-     647,   648,   649,   650,   651,   652,   653,   654,   655,   656,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   664,    94,    95,
-      96,    97,    98,    99,   100,   101,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,     1,    -1,   691,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    35,    36,    37,    -1,
-      39,    40,    41,    42,    43,    44,    -1,    -1,    -1,    -1,
-      -1,    -1,    51,    -1,    53,    54,    -1,    -1,    -1,    58,
-      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,    71,    72,    73,    -1,    75,    76,    77,    78,
-      79,    -1,    -1,    82,    83,    84,    85,    86,    87,    88,
-      89,    -1,    -1,    -1,    93,    -1,    -1,    -1,    97,    98,
-      -1,    -1,   101,    -1,   103,    -1,   105,     4,     5,     6,
+      -1,    -1,    -1,    -1,     1,    -1,   699,     4,     5,     6,
        7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
       17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
       27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
@@ -1629,18 +1627,18 @@ static const yytype_int16 yycheck[] =
       67,    68,    69,    70,    71,    72,    73,    -1,    75,    76,
       77,    78,    79,    -1,    -1,    82,    83,    84,    85,    86,
       87,    88,    89,    -1,    -1,    -1,    93,    -1,    -1,    -1,
-      97,    98,    -1,    -1,    -1,    -1,   103,    -1,   105,    -1,
-     107,     4,     5,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,    35,    36,    37,    -1,    39,    40,    41,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
-      73,    -1,    75,    76,    77,    78,    79,    -1,    -1,    82,
-      83,    84,    85,    86,    87,    88,    89,    -1,    -1,    -1,
-      93,    94,    95,    96,    97,    98,    99,   100,    -1,   102,
-     103,    -1,   105,     4,     5,     6,     7,     8,     9,    10,
+      97,    98,    -1,    -1,   101,    -1,   103,    -1,   105,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    -1,    39,    40,    41,    42,    43,    44,
+      -1,    -1,    -1,    -1,    -1,    -1,    51,    -1,    53,    54,
+      -1,    -1,    -1,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,    -1,
+      75,    76,    77,    78,    79,    -1,    -1,    82,    83,    84,
+      85,    86,    87,    88,    89,    -1,    -1,    -1,    93,    -1,
+      -1,    -1,    97,    98,    -1,    -1,    -1,    -1,   103,    -1,
+     105,    -1,   107,     4,     5,     6,     7,     8,     9,    10,
       11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
       21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
       31,    32,    33,    34,    35,    36,    37,    -1,    39,    40,
@@ -1680,17 +1678,17 @@ static const yytype_int16 yycheck[] =
       65,    66,    67,    68,    69,    70,    71,    72,    73,    -1,
       75,    76,    77,    78,    79,    -1,    -1,    82,    83,    84,
       85,    86,    87,    88,    89,    -1,    -1,    -1,    93,    94,
-      95,    96,    97,    98,    99,   100,    -1,    -1,   103,    -1,
+      95,    96,    97,    98,    99,   100,    -1,   102,   103,    -1,
      105,     4,     5,     6,     7,     8,     9,    10,    11,    12,
       13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
       23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
       33,    34,    35,    36,    37,    -1,    39,    40,    41,    42,
-      43,    44,    -1,    -1,    -1,    -1,    -1,    -1,    51,    -1,
-      53,    54,    -1,    -1,    -1,    58,    59,    60,    61,    62,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
       63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
-      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      73,    -1,    75,    76,    77,    78,    79,    -1,    -1,    82,
       83,    84,    85,    86,    87,    88,    89,    -1,    -1,    -1,
-      93,    -1,    -1,    -1,    97,    98,    -1,    -1,    -1,    -1,
+      93,    94,    95,    96,    97,    98,    99,   100,    -1,    -1,
      103,    -1,   105,     4,     5,     6,     7,     8,     9,    10,
       11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
       21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
@@ -1698,10 +1696,10 @@ static const yytype_int16 yycheck[] =
       41,    42,    43,    44,    -1,    -1,    -1,    -1,    -1,    -1,
       51,    -1,    53,    54,    -1,    -1,    -1,    58,    59,    60,
       61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      71,    72,    73,    -1,    75,    76,    77,    78,    79,    -1,
-      -1,    82,    83,    84,    85,    86,    87,    88,    89,    -1,
+      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
+      81,    82,    83,    84,    85,    86,    87,    88,    89,    -1,
       -1,    -1,    93,    -1,    -1,    -1,    97,    98,    -1,    -1,
-      -1,    -1,   103,   104,   105,     4,     5,     6,     7,     8,
+      -1,    -1,   103,    -1,   105,     4,     5,     6,     7,     8,
        9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
       19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
       29,    30,    31,    32,    33,    34,    35,    36,    37,    -1,
@@ -1752,7 +1750,7 @@ static const yytype_int16 yycheck[] =
       71,    72,    73,    -1,    75,    76,    77,    78,    79,    -1,
       -1,    82,    83,    84,    85,    86,    87,    88,    89,    -1,
       -1,    -1,    93,    -1,    -1,    -1,    97,    98,    -1,    -1,
-      -1,    -1,   103,    -1,   105,     4,     5,     6,     7,     8,
+      -1,    -1,   103,   104,   105,     4,     5,     6,     7,     8,
        9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
       19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
       29,    30,    31,    32,    33,    34,    35,    36,    37,    -1,
@@ -1833,8 +1831,42 @@ static const yytype_int16 yycheck[] =
       65,    66,    67,    68,    69,    70,    71,    72,    73,    -1,
       75,    76,    77,    78,    79,    -1,    -1,    82,    83,    84,
       85,    86,    87,    88,    89,    -1,    -1,    -1,    93,    -1,
-      -1,    -1,     1,    -1,    -1,    -1,    -1,     6,   103,    -1,
-     105,    10,    11,    12,    13,    14,    15,    16,    17,    -1,
+      -1,    -1,    97,    98,    -1,    -1,    -1,    -1,   103,    -1,
+     105,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    -1,    39,    40,    41,    42,
+      43,    44,    -1,    -1,    -1,    -1,    -1,    -1,    51,    -1,
+      53,    54,    -1,    -1,    -1,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,    -1,    75,    76,    77,    78,    79,    -1,    -1,    82,
+      83,    84,    85,    86,    87,    88,    89,    -1,    -1,    -1,
+      93,    -1,    -1,    -1,     1,    -1,    -1,    -1,    -1,     6,
+     103,    -1,   105,    10,    11,    12,    13,    14,    15,    16,
+      17,    -1,    19,    20,    21,    22,    23,    24,    25,    26,
+      -1,    28,    29,    30,    31,    32,    33,    34,    35,    -1,
+      37,    38,    39,    40,    -1,    42,    43,    44,    -1,    -1,
+      -1,    -1,    -1,    -1,     1,    -1,    53,    54,    -1,    -1,
+      -1,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    73,    -1,    75,    76,
+      77,    78,    79,    -1,    -1,    82,    83,    84,    85,    86,
+      87,    -1,    -1,    90,    -1,    -1,    93,    -1,    45,    46,
+      47,    48,    49,    50,   101,    52,    -1,    -1,    55,    56,
+      57,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    95,    96,
+      97,    98,    99,   100,   101,     6,    -1,    -1,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    -1,    37,    38,    39,    40,
+      41,    42,    43,    44,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    53,    54,    -1,    -1,    -1,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      71,    72,    73,    -1,    75,    76,    77,    78,    79,    -1,
+      -1,    82,    83,    84,    85,    86,    87,    88,    -1,    90,
+      -1,    -1,    93,    -1,    -1,    -1,    -1,     6,    -1,    -1,
+     101,    10,    11,    12,    13,    14,    15,    16,    17,    -1,
       19,    20,    21,    22,    23,    24,    25,    26,    -1,    28,
       29,    30,    31,    32,    33,    34,    35,    -1,    37,    38,
       39,    40,    -1,    42,    43,    44,    -1,    -1,    -1,    -1,
@@ -1842,62 +1874,35 @@ static const yytype_int16 yycheck[] =
       59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
       69,    70,    71,    72,    73,    -1,    75,    76,    77,    78,
       79,    -1,    -1,    82,    83,    84,    85,    86,    87,    -1,
-      -1,    90,    -1,    -1,    93,    -1,    -1,    -1,    -1,    -1,
-       6,    -1,   101,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    -1,    19,    20,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      -1,    37,    38,    39,    40,    41,    42,    43,    44,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    53,    54,    -1,
-      -1,    -1,    58,    59,    60,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    71,    72,    73,    -1,    75,
-      76,    77,    78,    79,    -1,    -1,    82,    83,    84,    85,
-      86,    87,    88,    -1,    90,    -1,    -1,    93,    -1,    -1,
-      -1,    -1,     6,    -1,    -1,   101,    10,    11,    12,    13,
-      14,    15,    16,    17,    -1,    19,    20,    21,    22,    23,
-      24,    25,    26,    -1,    28,    29,    30,    31,    32,    33,
-      34,    35,    -1,    37,    38,    39,    40,    -1,    42,    43,
-      44,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    53,
-      54,    -1,    -1,    -1,    58,    59,    60,    61,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
-      -1,    75,    76,    77,    78,    79,    -1,    -1,    82,    83,
-      84,    85,    86,    87,    -1,    -1,    90,    -1,    -1,    93,
-      -1,    -1,    -1,    -1,     6,    -1,    -1,   101,    10,    11,
-      12,    13,    14,    15,    16,    17,    -1,    19,    20,    21,
-      22,    23,    24,    25,    26,    -1,    28,    29,    30,    31,
-      32,    33,    34,    35,    -1,    37,    38,    39,    40,    -1,
-      42,    43,    44,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    53,    54,    -1,    -1,    -1,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    73,    -1,    75,    76,    77,    78,    79,    -1,    -1,
-      82,    83,    84,    85,    86,    87,    -1,    -1,    90,    -1,
-      -1,    93,    -1,    -1,    -1,    -1,     6,    -1,    -1,   101,
-      10,    11,    12,    13,    14,    15,    16,    17,    -1,    19,
-      20,    21,    22,    23,    24,    25,    26,    -1,    28,    29,
-      30,    31,    32,    33,    34,    35,    -1,    37,    38,    39,
-      40,    -1,    42,    43,    44,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    53,    54,    -1,    -1,    -1,    58,    59,
-      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    71,    72,    73,    -1,    75,    76,    77,    78,    79,
-      -1,    -1,    82,    83,    84,    85,    86,    87,    -1,    -1,
-      90,    -1,    -1,    93,    -1,    -1,    -1,    -1,     6,    -1,
-      -1,   101,    10,    11,    12,    13,    14,    15,    16,    17,
-      -1,    19,    20,    21,    22,    23,    24,    25,    26,    -1,
-      28,    29,    30,    31,    32,    33,    34,    35,    -1,    37,
-      38,    39,    40,    -1,    42,    43,    44,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    53,    54,    -1,    -1,    -1,
-      58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,    71,    72,    73,    -1,    75,    76,    77,
-      78,    79,    -1,    -1,    82,    83,    84,    85,    86,    87,
-      -1,    -1,    -1,    -1,    -1,    93,    -1,    -1,    -1,    -1,
-      -1,     6,    -1,   101,     9,    10,    11,    12,    13,    14,
-      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    -1,    39,    40,    41,    42,    43,    44,
+      -1,    90,    -1,    -1,    93,    -1,    -1,    -1,    -1,     6,
+      -1,    -1,   101,    10,    11,    12,    13,    14,    15,    16,
+      17,    -1,    19,    20,    21,    22,    23,    24,    25,    26,
+      -1,    28,    29,    30,    31,    32,    33,    34,    35,    -1,
+      37,    38,    39,    40,    -1,    42,    43,    44,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    53,    54,    -1,    -1,
+      -1,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,    71,    72,    73,    -1,    75,    76,
+      77,    78,    79,    -1,    -1,    82,    83,    84,    85,    86,
+      87,    -1,    -1,    90,    -1,    -1,    93,    -1,    -1,    -1,
+      -1,     6,    -1,    -1,   101,    10,    11,    12,    13,    14,
+      15,    16,    17,    -1,    19,    20,    21,    22,    23,    24,
+      25,    26,    -1,    28,    29,    30,    31,    32,    33,    34,
+      35,    -1,    37,    38,    39,    40,    -1,    42,    43,    44,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    53,    54,
       -1,    -1,    -1,    58,    59,    60,    61,    62,    63,    64,
       65,    66,    67,    68,    69,    70,    71,    72,    73,    -1,
       75,    76,    77,    78,    79,    -1,    -1,    82,    83,    84,
-      85,    86,    87,    88,    89,    -1,     6,    -1,    93,     9,
+      85,    86,    87,    -1,    -1,    90,    -1,    -1,    93,    -1,
+      -1,    -1,    -1,     6,    -1,    -1,   101,    10,    11,    12,
+      13,    14,    15,    16,    17,    -1,    19,    20,    21,    22,
+      23,    24,    25,    26,    -1,    28,    29,    30,    31,    32,
+      33,    34,    35,    -1,    37,    38,    39,    40,    -1,    42,
+      43,    44,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      53,    54,    -1,    -1,    -1,    58,    59,    60,    61,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+      73,    -1,    75,    76,    77,    78,    79,    -1,    -1,    82,
+      83,    84,    85,    86,    87,    -1,    -1,    -1,    -1,    -1,
+      93,    -1,    -1,    -1,    -1,    -1,     6,    -1,   101,     9,
       10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
       20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
       30,    31,    32,    33,    34,    35,    36,    37,    -1,    39,
@@ -1923,81 +1928,89 @@ static const yytype_int16 yycheck[] =
       60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
       70,    71,    72,    73,    -1,    75,    76,    77,    78,    79,
       -1,    -1,    82,    83,    84,    85,    86,    87,    88,    89,
-       6,    -1,    -1,    93,    10,    11,    12,    13,    14,    15,
-      16,    17,    -1,    19,    20,    21,    22,    23,    -1,    25,
-      26,    -1,    28,    29,    30,    31,    32,    33,    34,    35,
-      -1,    37,    -1,    39,    40,    -1,    42,    43,    44,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    53,    54,    -1,
-      -1,    -1,    58,    59,    60,    61,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,    71,    72,    73,    17,    75,
-      76,    77,    78,    79,    -1,    -1,    82,    83,    84,    85,
-      -1,    87,    45,    46,    47,    48,    -1,    93,    37,    52,
-      -1,    -1,    55,    56,    57,    -1,    45,    46,    47,    48,
-      49,    50,    -1,    52,    31,    -1,    55,    56,    57,    -1,
-      37,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    45,    46,
-      47,    48,    49,    50,    -1,    52,    -1,    -1,    55,    56,
-      57,    94,    95,    96,    97,    98,    99,   100,    31,    -1,
-      -1,    -1,    -1,    -1,    37,    94,    95,    96,    97,    98,
-      99,   100,    45,    46,    47,    48,    49,    50,    -1,    52,
-      31,    -1,    55,    56,    57,    -1,    37,    94,    95,    96,
-      97,    98,    99,   100,    45,    46,    47,    48,    49,    50,
-      -1,    52,    -1,    -1,    55,    56,    57,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    31,    -1,    -1,    -1,    -1,    -1,
-      37,    94,    95,    96,    97,    98,    99,   100,    45,    46,
-      47,    48,    49,    50,    -1,    52,    31,    -1,    55,    56,
-      57,    -1,    -1,    94,    95,    96,    97,    98,    99,   100,
-      45,    46,    47,    48,    49,    50,    -1,    52,    -1,    -1,
-      55,    56,    57,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      31,    -1,    -1,    -1,    -1,    -1,    -1,    94,    95,    96,
-      97,    98,    99,   100,    45,    46,    47,    48,    49,    50,
-      -1,    52,    31,    -1,    55,    56,    57,    -1,    -1,    94,
-      95,    96,    97,    98,    99,   100,    45,    46,    47,    48,
-      49,    50,    -1,    52,    -1,    -1,    55,    56,    57,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    31,    -1,    -1,    -1,
-      -1,    -1,    -1,    94,    95,    96,    97,    98,    99,   100,
-      45,    46,    47,    48,    49,    50,    -1,    52,    -1,    -1,
-      55,    56,    57,    36,    -1,    94,    95,    96,    97,    98,
-      99,   100,    45,    46,    47,    48,    49,    50,    -1,    52,
-      -1,    -1,    55,    56,    57,    45,    46,    47,    48,    49,
-      50,    -1,    52,    -1,    -1,    55,    56,    57,    -1,    94,
-      95,    96,    97,    98,    99,   100,    45,    46,    47,    48,
-      49,    50,    -1,    52,    -1,    -1,    55,    56,    57,    -1,
-      -1,    94,    95,    96,    97,    98,    99,   100,    -1,    -1,
-      -1,    -1,    -1,    -1,    94,    95,    96,    97,    98,    99,
-     100,    -1,   102,    -1,   104,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    94,    95,    96,    97,    98,
-      99,   100,    -1,   102,    -1,   104,    45,    46,    47,    48,
-      49,    50,    -1,    52,    -1,    -1,    55,    56,    57,    45,
+      -1,     6,    -1,    93,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    -1,    39,    40,    41,    42,    43,    44,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    53,    54,
+      -1,    -1,    -1,    58,    59,    60,    61,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,    -1,
+      75,    76,    77,    78,    79,    -1,    -1,    82,    83,    84,
+      85,    86,    87,    88,    89,     6,    -1,    -1,    93,    10,
+      11,    12,    13,    14,    15,    16,    17,    -1,    19,    20,
+      21,    22,    23,    -1,    25,    26,    -1,    28,    29,    30,
+      31,    32,    33,    34,    35,    -1,    37,    -1,    39,    40,
+      -1,    42,    43,    44,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    53,    54,    -1,    -1,    -1,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+      71,    72,    73,    17,    75,    76,    77,    78,    79,    -1,
+      -1,    82,    83,    84,    85,    -1,    87,    45,    46,    47,
+      48,    -1,    93,    37,    52,    -1,    -1,    55,    56,    57,
+      -1,    45,    46,    47,    48,    49,    50,    -1,    52,    31,
+      -1,    55,    56,    57,    -1,    37,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    45,    46,    47,    48,    49,    50,    -1,
+      52,    -1,    -1,    55,    56,    57,    94,    95,    96,    97,
+      98,    99,   100,    31,    -1,    -1,    -1,    -1,    -1,    37,
+      94,    95,    96,    97,    98,    99,   100,    45,    46,    47,
+      48,    49,    50,    -1,    52,    31,    -1,    55,    56,    57,
+      -1,    37,    94,    95,    96,    97,    98,    99,   100,    45,
       46,    47,    48,    49,    50,    -1,    52,    -1,    -1,    55,
-      56,    57,    45,    46,    47,    48,    49,    50,    -1,    52,
-      -1,    -1,    55,    56,    57,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    94,    95,    96,    97,    98,
-      99,   100,    -1,    -1,    -1,   104,    -1,    -1,    94,    95,
-      96,    97,    98,    99,   100,    -1,   102,    -1,    -1,    -1,
-      -1,    94,    95,    96,    97,    98,    99,   100,    -1,   102,
-      45,    46,    47,    48,    49,    50,    -1,    52,    -1,    -1,
-      55,    56,    57,    45,    46,    47,    48,    49,    50,    -1,
-      52,    -1,    -1,    55,    56,    57,    -1,    -1,    -1,    -1,
-      -1,    45,    46,    47,    48,    49,    50,    -1,    52,    -1,
-      -1,    55,    56,    57,    -1,    -1,    -1,    -1,    -1,    94,
-      95,    96,    97,    98,    99,   100,    -1,   102,    -1,    -1,
-      -1,    -1,    94,    95,    96,    97,    98,    99,   100,   101,
-      84,    85,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      56,    57,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    31,
+      -1,    -1,    -1,    -1,    -1,    37,    94,    95,    96,    97,
+      98,    99,   100,    45,    46,    47,    48,    49,    50,    -1,
+      52,    31,    -1,    55,    56,    57,    -1,    -1,    94,    95,
+      96,    97,    98,    99,   100,    45,    46,    47,    48,    49,
+      50,    -1,    52,    -1,    -1,    55,    56,    57,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    31,    -1,    -1,    -1,    -1,
+      -1,    -1,    94,    95,    96,    97,    98,    99,   100,    45,
+      46,    47,    48,    49,    50,    -1,    52,    31,    -1,    55,
+      56,    57,    -1,    -1,    94,    95,    96,    97,    98,    99,
+     100,    45,    46,    47,    48,    49,    50,    -1,    52,    -1,
+      -1,    55,    56,    57,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    31,    -1,    -1,    -1,    -1,    -1,    -1,    94,    95,
+      96,    97,    98,    99,   100,    45,    46,    47,    48,    49,
+      50,    -1,    52,    31,    -1,    55,    56,    57,    -1,    -1,
+      94,    95,    96,    97,    98,    99,   100,    45,    46,    -1,
+      48,    49,    50,    -1,    52,    -1,    -1,    55,    56,    57,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    36,    -1,    94,    95,    96,    97,    98,    99,
+     100,    45,    46,    47,    48,    49,    50,    -1,    52,    -1,
+      -1,    55,    56,    57,    -1,    -1,    94,    95,    96,    97,
+      98,    99,   100,    45,    46,    47,    48,    49,    50,    -1,
+      52,    -1,    -1,    55,    56,    57,    45,    46,    47,    48,
+      49,    50,    -1,    52,    -1,    -1,    55,    56,    57,    -1,
       94,    95,    96,    97,    98,    99,   100,    45,    46,    47,
       48,    49,    50,    -1,    52,    -1,    -1,    55,    56,    57,
+      -1,    -1,    94,    95,    96,    97,    98,    99,   100,    -1,
+     102,    -1,   104,    -1,    -1,    94,    95,    96,    97,    98,
+      99,   100,    -1,   102,    -1,   104,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    94,    95,    96,    97,
+      98,    99,   100,    -1,    -1,    -1,   104,    45,    46,    47,
+      48,    49,    50,    -1,    52,    -1,    -1,    55,    56,    57,
       45,    46,    47,    48,    49,    50,    -1,    52,    -1,    -1,
-      55,    56,    57,    45,    46,    -1,    48,    49,    50,    -1,
+      55,    56,    57,    45,    46,    47,    48,    49,    50,    -1,
       52,    -1,    -1,    55,    56,    57,    -1,    -1,    -1,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    94,    95,    96,    97,
-      98,    99,   100,    -1,    -1,    -1,    -1,    -1,    -1,    94,
-      95,    96,    97,    98,    99,   100,    -1,    -1,    -1,    -1,
-      -1,    -1,    94,    95,    96,    97,    98,    99,   100,    45,
-      46,    -1,    48,    -1,    -1,    -1,    52,    -1,    -1,    55,
-      56,    57,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      98,    99,   100,    -1,   102,    -1,    -1,    -1,    -1,    94,
+      95,    96,    97,    98,    99,   100,    -1,   102,    -1,    -1,
+      -1,    -1,    94,    95,    96,    97,    98,    99,   100,    -1,
+     102,    45,    46,    47,    48,    49,    50,    -1,    52,    -1,
+      -1,    55,    56,    57,    -1,    -1,    -1,    -1,    -1,    45,
+      46,    47,    48,    49,    50,    -1,    52,    -1,    -1,    55,
+      56,    57,    45,    46,    47,    48,    49,    50,    -1,    52,
+      -1,    -1,    55,    56,    57,    -1,    -1,    -1,    -1,    -1,
+      94,    95,    96,    97,    98,    99,   100,   101,    84,    85,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    95,
-      96,    97,    98,    99,   100
+      96,    97,    98,    99,   100,    -1,    -1,    -1,    -1,    -1,
+      -1,    94,    95,    96,    97,    98,    99,   100,    45,    46,
+      47,    48,    49,    50,    -1,    52,    -1,    -1,    55,    56,
+      57,    45,    46,    -1,    48,    49,    50,    -1,    52,    -1,
+      -1,    55,    56,    57,    45,    46,    -1,    48,    -1,    -1,
+      -1,    52,    -1,    -1,    55,    56,    57,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    94,    95,    96,
+      97,    98,    99,   100,    -1,    -1,    -1,    -1,    -1,    -1,
+      94,    95,    96,    97,    98,    99,   100,    -1,    -1,    -1,
+      -1,    -1,    -1,    94,    95,    96,    97,    98,    99,   100
 };
 
 /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
@@ -2024,59 +2037,59 @@ static const yytype_uint8 yystos[] =
      167,   121,     1,   101,   167,    34,   128,   167,    39,    40,
       78,   121,   147,   149,   160,   101,   121,   128,   167,   128,
      130,   122,   167,   122,   121,   101,   126,     0,   111,   128,
-     167,   101,   102,   103,   153,   166,   153,   153,   153,   167,
-     167,   167,   167,    72,     1,   101,   101,     1,   101,     1,
-     101,   102,   153,   153,   167,   167,   166,    66,    67,    68,
-      69,    70,    72,    77,   121,   167,   166,   166,   104,   147,
-     167,     4,     5,     7,     8,   107,   121,   163,   164,   167,
-     171,   172,   103,     1,   101,     1,   101,    31,    45,    46,
-      47,    48,    49,    50,    52,    55,    56,    57,    94,    95,
-      96,    97,    98,    99,   100,   102,   129,   146,   168,   170,
-       1,   101,   167,    36,   122,   101,     1,   101,     1,   101,
-       1,   101,    26,    53,    54,   121,   167,   121,    37,    47,
-     132,     1,   101,     1,   101,    39,     1,   101,     1,   101,
-       1,   101,     1,    37,   101,     1,   101,   122,     1,   101,
-     121,   104,   167,    31,    37,    31,    37,    31,    37,    31,
-      37,    58,    60,    62,    64,   151,   101,   101,   101,   121,
-      31,   168,    71,    79,    71,    79,    71,    79,    71,    79,
-      71,    79,    31,    31,    84,    85,   168,   102,   104,   107,
-     107,   107,   107,   106,   107,   102,   106,   106,   102,   104,
-     147,   172,   101,   101,    29,   167,   167,   167,   167,   167,
-     167,   167,   167,   167,   167,   167,   167,   167,   167,   167,
-     167,   167,   172,    45,    46,    47,    48,    49,    50,    52,
-      55,    56,    57,    94,    95,    96,    97,    98,    99,   100,
-     102,   129,   101,     1,   101,   124,     1,   101,   101,   101,
-     101,    78,   147,   148,   150,   148,   148,    25,    47,     1,
-     101,    31,   167,   101,     9,    89,   101,   114,   115,   116,
-     117,   101,   167,   101,   101,   101,   101,   126,   101,   124,
-     140,   141,   142,   101,     1,   101,   101,   102,   166,   167,
-     166,   167,   166,   167,   166,   167,    25,    31,   159,    29,
-      59,    61,    63,    65,    73,    74,    75,    76,    80,    81,
-      82,    83,   155,   156,   166,   155,   166,   166,   102,   129,
-     104,   172,   167,   167,   167,   167,   167,   164,   167,   167,
-     168,   102,   129,   167,   129,   167,   167,   167,   167,   167,
+     167,   101,   102,   103,   153,   166,   153,   166,   153,   166,
+     153,   167,   167,   167,   167,    72,     1,   101,   101,     1,
+     101,     1,   101,   102,   153,   153,   167,   167,   166,    66,
+      67,    68,    69,    70,    72,    77,   121,   167,   166,   166,
+     104,   147,   167,     4,     5,     7,     8,   107,   121,   163,
+     164,   167,   171,   172,   103,     1,   101,     1,   101,    31,
+      45,    46,    47,    48,    49,    50,    52,    55,    56,    57,
+      94,    95,    96,    97,    98,    99,   100,   102,   129,   146,
+     168,   170,     1,   101,   167,    36,   122,   101,     1,   101,
+       1,   101,     1,   101,    26,    53,    54,   121,   167,   121,
+      37,    47,   132,     1,   101,     1,   101,    39,     1,   101,
+       1,   101,     1,   101,     1,    37,   101,     1,   101,   122,
+       1,   101,   121,   104,   167,    31,    31,    31,    37,    31,
+      37,    31,    37,    31,    37,    58,    60,    62,    64,   151,
+     101,   101,   101,   121,    31,   168,    71,    79,    71,    79,
+      71,    79,    71,    79,    71,    79,    31,    31,    84,    85,
+     168,   102,   104,   107,   107,   107,   107,   106,   107,   102,
+     106,   106,   102,   104,   147,   172,   101,   101,    29,   167,
      167,   167,   167,   167,   167,   167,   167,   167,   167,   167,
-     167,   167,   172,   101,   101,   125,   143,   144,   145,    18,
-     101,   140,     1,   101,     1,   101,     1,   101,   167,   167,
-     101,   140,    73,    75,    82,    83,   161,   166,     1,   101,
-     115,   119,   121,   117,   101,   140,    92,   142,   101,   140,
-     104,   172,    31,    31,    31,    31,   166,   167,   159,   159,
-     159,   159,   166,   166,   159,   166,   166,   172,   104,   129,
-     102,   129,   104,   129,   143,    18,    90,   136,   145,   101,
-     124,   140,   101,   101,   101,     1,   101,    17,    37,   140,
-      91,   166,   169,   170,   169,   169,   169,   101,   101,   122,
-      92,   101,   140,     9,   129,   166,   166,   166,   166,   166,
-     166,   166,   166,    31,    73,   156,   129,   104,   172,   104,
-     136,   101,   124,   101,   143,   101,   140,    37,   167,    91,
-     101,    45,    46,    48,    49,    50,    52,    55,    56,    57,
-      94,    95,    96,    97,    98,    99,   100,    31,     1,   101,
-     101,     9,   119,   104,    73,   104,   129,   143,   136,   140,
-      91,   167,     1,   101,   101,   169,   169,   169,   169,   169,
-     169,   169,   169,   169,   169,   169,   169,   169,   169,   169,
-     169,    73,   101,   140,   119,   101,   166,   104,   136,    91,
-     101,     1,   101,   101,   140,   169,   140,   101,   101,   101,
-     140,   140,    91,   140,    91,    91,   101,    91,   101,   101,
-     101
+     167,   167,   167,   167,   167,   167,   172,    45,    46,    47,
+      48,    49,    50,    52,    55,    56,    57,    94,    95,    96,
+      97,    98,    99,   100,   102,   129,   101,     1,   101,   124,
+       1,   101,   101,   101,   101,    78,   147,   148,   150,   148,
+     148,    25,    47,     1,   101,    31,   167,   101,     9,    89,
+     101,   114,   115,   116,   117,   101,   167,   101,   101,   101,
+     101,   126,   101,   124,   140,   141,   142,   101,     1,   101,
+     101,   102,    15,    15,   166,   167,   166,   167,   166,   167,
+     166,   167,    25,    31,   159,    29,    59,    61,    63,    65,
+      73,    74,    75,    76,    80,    81,    82,    83,   155,   156,
+     166,   155,   166,   166,   102,   129,   104,   172,   167,   167,
+     167,   167,   167,   164,   167,   167,   168,   102,   129,   167,
+     129,   167,   167,   167,   167,   167,   167,   167,   167,   167,
+     167,   167,   167,   167,   167,   167,   167,   167,   172,   101,
+     101,   125,   143,   144,   145,    18,   101,   140,     1,   101,
+       1,   101,     1,   101,   167,   167,   101,   140,    73,    75,
+      82,    83,   161,   166,     1,   101,   115,   119,   121,   117,
+     101,   140,    92,   142,   101,   140,   104,   172,   166,   166,
+      31,    31,    31,    31,   166,   167,   159,   159,   159,   159,
+     166,   166,   159,   166,   166,   172,   104,   129,   102,   129,
+     104,   129,   143,    18,    90,   136,   145,   101,   124,   140,
+     101,   101,   101,     1,   101,    17,    37,   140,    91,   166,
+     169,   170,   169,   169,   169,   101,   101,   122,    92,   101,
+     140,     9,   129,   166,   166,   166,   166,   166,   166,   166,
+     166,    31,    73,   156,   129,   104,   172,   104,   136,   101,
+     124,   101,   143,   101,   140,    37,   167,    91,   101,    45,
+      46,    48,    49,    50,    52,    55,    56,    57,    94,    95,
+      96,    97,    98,    99,   100,    31,     1,   101,   101,     9,
+     119,   104,    73,   104,   129,   143,   136,   140,    91,   167,
+       1,   101,   101,   169,   169,   169,   169,   169,   169,   169,
+     169,   169,   169,   169,   169,   169,   169,   169,   169,    73,
+     101,   140,   119,   101,   166,   104,   136,    91,   101,     1,
+     101,   101,   140,   169,   140,   101,   101,   101,   140,   140,
+      91,   140,    91,    91,   101,    91,   101,   101,   101
 };
 
 /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM.  */
@@ -2106,19 +2119,20 @@ static const yytype_uint8 yyr1[] =
      145,   145,   146,   146,   146,   146,   146,   146,   146,   146,
      146,   146,   146,   146,   146,   146,   146,   147,   148,   148,
      149,   149,   150,   150,   150,   150,   150,   150,   150,   150,
-     150,   150,   150,   150,   150,   151,   151,   151,   151,   152,
-     152,   153,   153,   153,   153,   154,   154,   154,   154,   154,
-     155,   155,   155,   155,   155,   156,   157,   157,   157,   157,
-     157,   157,   157,   157,   157,   157,   158,   158,   158,   158,
-     158,   158,   158,   158,   159,   159,   160,   160,   161,   161,
-     161,   161,   161,   162,   162,   162,   163,   163,   163,   164,
-     164,   164,   164,   164,   165,   165,   166,   166,   167,   167,
+     150,   150,   150,   150,   150,   150,   150,   151,   151,   151,
+     151,   152,   152,   153,   153,   153,   153,   154,   154,   154,
+     154,   154,   155,   155,   155,   155,   155,   156,   157,   157,
+     157,   157,   157,   157,   157,   157,   157,   157,   158,   158,
+     158,   158,   158,   158,   158,   158,   159,   159,   160,   160,
+     161,   161,   161,   161,   161,   162,   162,   162,   163,   163,
+     163,   164,   164,   164,   164,   164,   165,   165,   166,   166,
      167,   167,   167,   167,   167,   167,   167,   167,   167,   167,
-     167,   167,   167,   167,   167,   167,   167,   168,   168,   168,
+     167,   167,   167,   167,   167,   167,   167,   167,   167,   168,
      168,   168,   168,   168,   168,   168,   168,   168,   168,   168,
-     168,   168,   168,   168,   168,   168,   169,   169,   169,   169,
+     168,   168,   168,   168,   168,   168,   168,   168,   169,   169,
      169,   169,   169,   169,   169,   169,   169,   169,   169,   169,
-     169,   169,   169,   169,   170,   170,   171,   171,   172,   172
+     169,   169,   169,   169,   169,   169,   170,   170,   171,   171,
+     172,   172
 };
 
 /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM.  */
@@ -2147,20 +2161,21 @@ static const yytype_int8 yyr2[] =
        0,     1,     1,     2,     1,     1,     0,     1,     1,     2,
        1,     1,     1,     1,     1,     1,     2,     3,     5,     6,
        8,     3,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     2,     2,     2,     2,     4,     6,     4,     6,
-       4,     6,     4,     6,     5,     1,     1,     1,     1,     2,
-       2,     1,     2,     4,     6,     2,     4,     4,     1,     1,
-       1,     1,     5,     2,     2,     2,     3,     3,     3,     3,
-       3,     3,     3,     3,     3,     3,     6,     6,     6,     6,
-       6,     4,     4,     4,     1,     1,     2,     4,     1,     2,
-       5,     2,     2,     3,     3,     3,     1,     3,     3,     3,
-       3,     3,     3,     3,     2,     2,     1,     1,     1,     1,
+       1,     1,     2,     5,     2,     5,     2,     2,     4,     6,
+       4,     6,     4,     6,     4,     6,     5,     1,     1,     1,
+       1,     2,     2,     1,     2,     4,     6,     2,     4,     4,
+       1,     1,     1,     1,     5,     2,     2,     2,     3,     3,
+       3,     3,     3,     3,     3,     3,     3,     3,     6,     6,
+       6,     6,     6,     4,     4,     4,     1,     1,     2,     4,
+       1,     2,     5,     2,     2,     3,     3,     3,     1,     3,
+       3,     3,     3,     3,     3,     3,     2,     2,     1,     1,
+       1,     1,     3,     3,     3,     3,     3,     3,     3,     3,
+       3,     3,     3,     3,     3,     3,     3,     3,     3,     1,
+       1,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+       3,     3,     3,     3,     3,     3,     3,     3,     1,     1,
        3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-       3,     3,     3,     3,     3,     3,     3,     1,     1,     3,
-       3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-       3,     3,     3,     3,     3,     3,     1,     1,     3,     3,
-       3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
-       3,     3,     3,     3,     4,     4,     0,     1,     1,     3
+       3,     3,     3,     3,     3,     3,     4,     4,     0,     1,
+       1,     3
 };
 
 
@@ -2428,283 +2443,283 @@ yydestruct (const char *yymsg,
     case YYSYMBOL_tVARID: /* tVARID  */
 #line 218 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2432 "engines/director/lingo/lingo-gr.cpp"
+#line 2447 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_tSTRING: /* tSTRING  */
 #line 218 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2438 "engines/director/lingo/lingo-gr.cpp"
+#line 2453 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_tSYMBOL: /* tSYMBOL  */
 #line 218 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2444 "engines/director/lingo/lingo-gr.cpp"
+#line 2459 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_tENDCLAUSE: /* tENDCLAUSE  */
 #line 218 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2450 "engines/director/lingo/lingo-gr.cpp"
+#line 2465 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_script: /* script  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2456 "engines/director/lingo/lingo-gr.cpp"
+#line 2471 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_scriptpart: /* scriptpart  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2462 "engines/director/lingo/lingo-gr.cpp"
+#line 2477 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_macro: /* macro  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2468 "engines/director/lingo/lingo-gr.cpp"
+#line 2483 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_factory: /* factory  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2474 "engines/director/lingo/lingo-gr.cpp"
+#line 2489 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_method: /* method  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2480 "engines/director/lingo/lingo-gr.cpp"
+#line 2495 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_methodlistline: /* methodlistline  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2486 "engines/director/lingo/lingo-gr.cpp"
+#line 2501 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_handler: /* handler  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2492 "engines/director/lingo/lingo-gr.cpp"
+#line 2507 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_CMDID: /* CMDID  */
 #line 218 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2498 "engines/director/lingo/lingo-gr.cpp"
+#line 2513 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_ID: /* ID  */
 #line 218 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2504 "engines/director/lingo/lingo-gr.cpp"
+#line 2519 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_stmt: /* stmt  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2510 "engines/director/lingo/lingo-gr.cpp"
+#line 2525 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_stmt_insideif: /* stmt_insideif  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2516 "engines/director/lingo/lingo-gr.cpp"
+#line 2531 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_stmtoneliner: /* stmtoneliner  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2522 "engines/director/lingo/lingo-gr.cpp"
+#line 2537 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_proc: /* proc  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2528 "engines/director/lingo/lingo-gr.cpp"
+#line 2543 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_asgn: /* asgn  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2534 "engines/director/lingo/lingo-gr.cpp"
+#line 2549 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_definevars: /* definevars  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2540 "engines/director/lingo/lingo-gr.cpp"
+#line 2555 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_ifstmt: /* ifstmt  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2546 "engines/director/lingo/lingo-gr.cpp"
+#line 2561 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_ifelsestmt: /* ifelsestmt  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2552 "engines/director/lingo/lingo-gr.cpp"
+#line 2567 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_loop: /* loop  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2558 "engines/director/lingo/lingo-gr.cpp"
+#line 2573 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_tell: /* tell  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2564 "engines/director/lingo/lingo-gr.cpp"
+#line 2579 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_when: /* when  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2570 "engines/director/lingo/lingo-gr.cpp"
+#line 2585 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_stmtlistline: /* stmtlistline  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2576 "engines/director/lingo/lingo-gr.cpp"
+#line 2591 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_stmtlistline_insideif: /* stmtlistline_insideif  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2582 "engines/director/lingo/lingo-gr.cpp"
+#line 2597 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_simpleexpr_nounarymath: /* simpleexpr_nounarymath  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2588 "engines/director/lingo/lingo-gr.cpp"
+#line 2603 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_var: /* var  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2594 "engines/director/lingo/lingo-gr.cpp"
+#line 2609 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_varorchunk: /* varorchunk  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2600 "engines/director/lingo/lingo-gr.cpp"
+#line 2615 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_varorthe: /* varorthe  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2606 "engines/director/lingo/lingo-gr.cpp"
+#line 2621 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_chunk: /* chunk  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2612 "engines/director/lingo/lingo-gr.cpp"
+#line 2627 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_object: /* object  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2618 "engines/director/lingo/lingo-gr.cpp"
+#line 2633 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_the: /* the  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2624 "engines/director/lingo/lingo-gr.cpp"
+#line 2639 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_theobj: /* theobj  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2630 "engines/director/lingo/lingo-gr.cpp"
+#line 2645 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_menu: /* menu  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2636 "engines/director/lingo/lingo-gr.cpp"
+#line 2651 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_thedatetime: /* thedatetime  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2642 "engines/director/lingo/lingo-gr.cpp"
+#line 2657 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_thenumberof: /* thenumberof  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2648 "engines/director/lingo/lingo-gr.cpp"
+#line 2663 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_writablethe: /* writablethe  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2654 "engines/director/lingo/lingo-gr.cpp"
+#line 2669 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_writabletheobj: /* writabletheobj  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2660 "engines/director/lingo/lingo-gr.cpp"
+#line 2675 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_list: /* list  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2666 "engines/director/lingo/lingo-gr.cpp"
+#line 2681 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_proppair: /* proppair  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2672 "engines/director/lingo/lingo-gr.cpp"
+#line 2687 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_unarymath: /* unarymath  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2678 "engines/director/lingo/lingo-gr.cpp"
+#line 2693 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_simpleexpr: /* simpleexpr  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2684 "engines/director/lingo/lingo-gr.cpp"
+#line 2699 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_expr: /* expr  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2690 "engines/director/lingo/lingo-gr.cpp"
+#line 2705 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_expr_nounarymath: /* expr_nounarymath  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2696 "engines/director/lingo/lingo-gr.cpp"
+#line 2711 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_expr_noeq: /* expr_noeq  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2702 "engines/director/lingo/lingo-gr.cpp"
+#line 2717 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case YYSYMBOL_sprite: /* sprite  */
 #line 219 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).node); }
-#line 2708 "engines/director/lingo/lingo-gr.cpp"
+#line 2723 "engines/director/lingo/lingo-gr.cpp"
         break;
 
       default:
@@ -2974,7 +2989,7 @@ yyreduce:
   case 2: /* script: scriptpartlist  */
 #line 225 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->_compiler->_assemblyAST = Common::SharedPtr<Node>(new ScriptNode((yyvsp[0].nodelist))); (yyval.node) = nullptr; }
-#line 2978 "engines/director/lingo/lingo-gr.cpp"
+#line 2993 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 3: /* scriptpartlist: scriptpart  */
@@ -2985,7 +3000,7 @@ yyreduce:
 			list->push_back((yyvsp[0].node));
 		}
 		(yyval.nodelist) = list; }
-#line 2989 "engines/director/lingo/lingo-gr.cpp"
+#line 3004 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 4: /* scriptpartlist: scriptpartlist scriptpart  */
@@ -2995,61 +3010,61 @@ yyreduce:
 			(yyvsp[-1].nodelist)->push_back((yyvsp[0].node));
 		}
 		(yyval.nodelist) = (yyvsp[-1].nodelist); }
-#line 2999 "engines/director/lingo/lingo-gr.cpp"
+#line 3014 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 5: /* scriptpart: '\n'  */
 #line 240 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = nullptr; }
-#line 3005 "engines/director/lingo/lingo-gr.cpp"
+#line 3020 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 10: /* scriptpart: tENDCLAUSE endargdef '\n'  */
 #line 245 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = nullptr; delete (yyvsp[-2].s); }
-#line 3011 "engines/director/lingo/lingo-gr.cpp"
+#line 3026 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 11: /* macro: tMACRO ID idlist '\n' stmtlist  */
 #line 274 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new HandlerNode((yyvsp[-3].s), (yyvsp[-2].idlist), (yyvsp[0].nodelist)); }
-#line 3017 "engines/director/lingo/lingo-gr.cpp"
+#line 3032 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 12: /* macro: tMACRO ID idlist error '\n' stmtlist  */
 #line 275 "engines/director/lingo/lingo-gr.y"
                                                 { TRIM_GARBAGE((yyval.node), new HandlerNode((yyvsp[-4].s), (yyvsp[-3].idlist), (yyvsp[0].nodelist))); }
-#line 3023 "engines/director/lingo/lingo-gr.cpp"
+#line 3038 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 13: /* factory: tFACTORY ID '\n' methodlist  */
 #line 280 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new FactoryNode((yyvsp[-2].s), (yyvsp[0].nodelist)); }
-#line 3029 "engines/director/lingo/lingo-gr.cpp"
+#line 3044 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 14: /* factory: tFACTORY ID error '\n' methodlist  */
 #line 281 "engines/director/lingo/lingo-gr.y"
                                                 { TRIM_GARBAGE((yyval.node), new FactoryNode((yyvsp[-3].s), (yyvsp[0].nodelist))); }
-#line 3035 "engines/director/lingo/lingo-gr.cpp"
+#line 3050 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 15: /* method: tMETHOD ID idlist '\n' stmtlist  */
 #line 284 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new HandlerNode((yyvsp[-3].s), (yyvsp[-2].idlist), (yyvsp[0].nodelist)); }
-#line 3041 "engines/director/lingo/lingo-gr.cpp"
+#line 3056 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 16: /* method: tMETHOD ID idlist error '\n' stmtlist  */
 #line 285 "engines/director/lingo/lingo-gr.y"
                                                         { TRIM_GARBAGE((yyval.node), new HandlerNode((yyvsp[-4].s), (yyvsp[-3].idlist), (yyvsp[0].nodelist))); }
-#line 3047 "engines/director/lingo/lingo-gr.cpp"
+#line 3062 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 17: /* methodlist: %empty  */
 #line 288 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.nodelist) = new NodeList; }
-#line 3053 "engines/director/lingo/lingo-gr.cpp"
+#line 3068 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 19: /* nonemptymethodlist: methodlistline  */
@@ -3060,7 +3075,7 @@ yyreduce:
 			list->push_back((yyvsp[0].node));
 		}
 		(yyval.nodelist) = list; }
-#line 3064 "engines/director/lingo/lingo-gr.cpp"
+#line 3079 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 20: /* nonemptymethodlist: nonemptymethodlist methodlistline  */
@@ -3070,19 +3085,19 @@ yyreduce:
 			(yyvsp[-1].nodelist)->push_back((yyvsp[0].node));
 		}
 		(yyval.nodelist) = (yyvsp[-1].nodelist); }
-#line 3074 "engines/director/lingo/lingo-gr.cpp"
+#line 3089 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 21: /* methodlistline: '\n'  */
 #line 305 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = nullptr; }
-#line 3080 "engines/director/lingo/lingo-gr.cpp"
+#line 3095 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 23: /* methodlistline: tENDCLAUSE endargdef '\n'  */
 #line 307 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = nullptr; delete (yyvsp[-2].s); }
-#line 3086 "engines/director/lingo/lingo-gr.cpp"
+#line 3101 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 24: /* handler: tON ID idlist '\n' stmtlist tENDCLAUSE endargdef '\n'  */
@@ -3091,7 +3106,7 @@ yyreduce:
 		(yyval.node) = new HandlerNode((yyvsp[-6].s), (yyvsp[-5].idlist), (yyvsp[-3].nodelist));
 		checkEnd((yyvsp[-2].s), (yyvsp[-6].s), false);
 		delete (yyvsp[-2].s); }
-#line 3095 "engines/director/lingo/lingo-gr.cpp"
+#line 3110 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 25: /* handler: tON ID idlist error '\n' stmtlist tENDCLAUSE endargdef '\n'  */
@@ -3100,441 +3115,441 @@ yyreduce:
 		TRIM_GARBAGE((yyval.node), new HandlerNode((yyvsp[-7].s), (yyvsp[-6].idlist), (yyvsp[-3].nodelist)));
 		checkEnd((yyvsp[-2].s), (yyvsp[-7].s), false);
 		delete (yyvsp[-2].s); }
-#line 3104 "engines/director/lingo/lingo-gr.cpp"
+#line 3119 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 26: /* handler: tON ID idlist '\n' stmtlist  */
 #line 320 "engines/director/lingo/lingo-gr.y"
                                       {	// D4. No 'end' clause
 		(yyval.node) = new HandlerNode((yyvsp[-3].s), (yyvsp[-2].idlist), (yyvsp[0].nodelist)); }
-#line 3111 "engines/director/lingo/lingo-gr.cpp"
+#line 3126 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 27: /* handler: tON ID idlist error '\n' stmtlist  */
 #line 322 "engines/director/lingo/lingo-gr.y"
                                             {	// D4. No 'end' clause
 		TRIM_GARBAGE((yyval.node), new HandlerNode((yyvsp[-4].s), (yyvsp[-3].idlist), (yyvsp[0].nodelist))); }
-#line 3118 "engines/director/lingo/lingo-gr.cpp"
+#line 3133 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 29: /* endargdef: ID  */
 #line 327 "engines/director/lingo/lingo-gr.y"
                                                         { delete (yyvsp[0].s); }
-#line 3124 "engines/director/lingo/lingo-gr.cpp"
+#line 3139 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 30: /* endargdef: endargdef ',' ID  */
 #line 328 "engines/director/lingo/lingo-gr.y"
                                                 { delete (yyvsp[0].s); }
-#line 3130 "engines/director/lingo/lingo-gr.cpp"
+#line 3145 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 32: /* CMDID: tABBREVIATED  */
 #line 336 "engines/director/lingo/lingo-gr.y"
                         { (yyval.s) = new Common::String("abbreviated"); }
-#line 3136 "engines/director/lingo/lingo-gr.cpp"
+#line 3151 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 33: /* CMDID: tABBREV  */
 #line 337 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("abbrev"); }
-#line 3142 "engines/director/lingo/lingo-gr.cpp"
+#line 3157 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 34: /* CMDID: tABBR  */
 #line 338 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("abbr"); }
-#line 3148 "engines/director/lingo/lingo-gr.cpp"
+#line 3163 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 35: /* CMDID: tAFTER  */
 #line 339 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("after"); }
-#line 3154 "engines/director/lingo/lingo-gr.cpp"
+#line 3169 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 36: /* CMDID: tBEFORE  */
 #line 340 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("before"); }
-#line 3160 "engines/director/lingo/lingo-gr.cpp"
+#line 3175 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 37: /* CMDID: tCAST  */
 #line 341 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("cast"); }
-#line 3166 "engines/director/lingo/lingo-gr.cpp"
+#line 3181 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 38: /* CMDID: tCASTLIB  */
 #line 342 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("castLib"); }
-#line 3172 "engines/director/lingo/lingo-gr.cpp"
+#line 3187 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 39: /* CMDID: tCHAR  */
 #line 343 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("char"); }
-#line 3178 "engines/director/lingo/lingo-gr.cpp"
+#line 3193 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 40: /* CMDID: tCHARS  */
 #line 344 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("chars"); }
-#line 3184 "engines/director/lingo/lingo-gr.cpp"
+#line 3199 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 41: /* CMDID: tDATE  */
 #line 345 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("date"); }
-#line 3190 "engines/director/lingo/lingo-gr.cpp"
+#line 3205 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 42: /* CMDID: tDELETE  */
 #line 346 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("delete"); }
-#line 3196 "engines/director/lingo/lingo-gr.cpp"
+#line 3211 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 43: /* CMDID: tDOWN  */
 #line 347 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("down"); }
-#line 3202 "engines/director/lingo/lingo-gr.cpp"
+#line 3217 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 44: /* CMDID: tFIELD  */
 #line 348 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("field"); }
-#line 3208 "engines/director/lingo/lingo-gr.cpp"
+#line 3223 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 45: /* CMDID: tFRAME  */
 #line 349 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("frame"); }
-#line 3214 "engines/director/lingo/lingo-gr.cpp"
+#line 3229 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 46: /* CMDID: tHILITE  */
 #line 350 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("hilite"); }
-#line 3220 "engines/director/lingo/lingo-gr.cpp"
+#line 3235 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 47: /* CMDID: tIN  */
 #line 351 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("in"); }
-#line 3226 "engines/director/lingo/lingo-gr.cpp"
+#line 3241 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 48: /* CMDID: tINTERSECTS  */
 #line 352 "engines/director/lingo/lingo-gr.y"
                         { (yyval.s) = new Common::String("intersects"); }
-#line 3232 "engines/director/lingo/lingo-gr.cpp"
+#line 3247 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 49: /* CMDID: tINTO  */
 #line 353 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("into"); }
-#line 3238 "engines/director/lingo/lingo-gr.cpp"
+#line 3253 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 50: /* CMDID: tITEM  */
 #line 354 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("item"); }
-#line 3244 "engines/director/lingo/lingo-gr.cpp"
+#line 3259 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 51: /* CMDID: tITEMS  */
 #line 355 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("items"); }
-#line 3250 "engines/director/lingo/lingo-gr.cpp"
+#line 3265 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 52: /* CMDID: tLAST  */
 #line 356 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("last"); }
-#line 3256 "engines/director/lingo/lingo-gr.cpp"
+#line 3271 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 53: /* CMDID: tLINE  */
 #line 357 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("line"); }
-#line 3262 "engines/director/lingo/lingo-gr.cpp"
+#line 3277 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 54: /* CMDID: tLINES  */
 #line 358 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("lines"); }
-#line 3268 "engines/director/lingo/lingo-gr.cpp"
+#line 3283 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 55: /* CMDID: tLONG  */
 #line 359 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("long"); }
-#line 3274 "engines/director/lingo/lingo-gr.cpp"
+#line 3289 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 56: /* CMDID: tMEMBER  */
 #line 360 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("member"); }
-#line 3280 "engines/director/lingo/lingo-gr.cpp"
+#line 3295 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 57: /* CMDID: tMENU  */
 #line 361 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("menu"); }
-#line 3286 "engines/director/lingo/lingo-gr.cpp"
+#line 3301 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 58: /* CMDID: tMENUITEM  */
 #line 362 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("menuItem"); }
-#line 3292 "engines/director/lingo/lingo-gr.cpp"
+#line 3307 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 59: /* CMDID: tMENUITEMS  */
 #line 363 "engines/director/lingo/lingo-gr.y"
                         { (yyval.s) = new Common::String("menuItems"); }
-#line 3298 "engines/director/lingo/lingo-gr.cpp"
+#line 3313 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 60: /* CMDID: tMOVIE  */
 #line 364 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("movie"); }
-#line 3304 "engines/director/lingo/lingo-gr.cpp"
+#line 3319 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 61: /* CMDID: tNEXT  */
 #line 365 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("next"); }
-#line 3310 "engines/director/lingo/lingo-gr.cpp"
+#line 3325 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 62: /* CMDID: tNUMBER  */
 #line 366 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("number"); }
-#line 3316 "engines/director/lingo/lingo-gr.cpp"
+#line 3331 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 63: /* CMDID: tOF  */
 #line 367 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("of"); }
-#line 3322 "engines/director/lingo/lingo-gr.cpp"
+#line 3337 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 64: /* CMDID: tPREVIOUS  */
 #line 368 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("previous"); }
-#line 3328 "engines/director/lingo/lingo-gr.cpp"
+#line 3343 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 65: /* CMDID: tREPEAT  */
 #line 369 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("repeat"); }
-#line 3334 "engines/director/lingo/lingo-gr.cpp"
+#line 3349 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 66: /* CMDID: tSCRIPT  */
 #line 370 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("script"); }
-#line 3340 "engines/director/lingo/lingo-gr.cpp"
+#line 3355 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 67: /* CMDID: tASSERTERROR  */
 #line 371 "engines/director/lingo/lingo-gr.y"
                         { (yyval.s) = new Common::String("scummvmAssertError"); }
-#line 3346 "engines/director/lingo/lingo-gr.cpp"
+#line 3361 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 68: /* CMDID: tSHORT  */
 #line 372 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("short"); }
-#line 3352 "engines/director/lingo/lingo-gr.cpp"
+#line 3367 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 69: /* CMDID: tSOUND  */
 #line 373 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("sound"); }
-#line 3358 "engines/director/lingo/lingo-gr.cpp"
+#line 3373 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 70: /* CMDID: tSPRITE  */
 #line 374 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("sprite"); }
-#line 3364 "engines/director/lingo/lingo-gr.cpp"
+#line 3379 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 71: /* CMDID: tTHE  */
 #line 375 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("the"); }
-#line 3370 "engines/director/lingo/lingo-gr.cpp"
+#line 3385 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 72: /* CMDID: tTIME  */
 #line 376 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("time"); }
-#line 3376 "engines/director/lingo/lingo-gr.cpp"
+#line 3391 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 73: /* CMDID: tTO  */
 #line 377 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("to"); }
-#line 3382 "engines/director/lingo/lingo-gr.cpp"
+#line 3397 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 74: /* CMDID: tWHILE  */
 #line 378 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("while"); }
-#line 3388 "engines/director/lingo/lingo-gr.cpp"
+#line 3403 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 75: /* CMDID: tWINDOW  */
 #line 379 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("window"); }
-#line 3394 "engines/director/lingo/lingo-gr.cpp"
+#line 3409 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 76: /* CMDID: tWITH  */
 #line 380 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("with"); }
-#line 3400 "engines/director/lingo/lingo-gr.cpp"
+#line 3415 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 77: /* CMDID: tWITHIN  */
 #line 381 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("within"); }
-#line 3406 "engines/director/lingo/lingo-gr.cpp"
+#line 3421 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 78: /* CMDID: tWORD  */
 #line 382 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("word"); }
-#line 3412 "engines/director/lingo/lingo-gr.cpp"
+#line 3427 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 79: /* CMDID: tWORDS  */
 #line 383 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("words"); }
-#line 3418 "engines/director/lingo/lingo-gr.cpp"
+#line 3433 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 81: /* ID: tELSE  */
 #line 387 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("else"); }
-#line 3424 "engines/director/lingo/lingo-gr.cpp"
+#line 3439 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 82: /* ID: tENDCLAUSE  */
 #line 388 "engines/director/lingo/lingo-gr.y"
                         { (yyval.s) = new Common::String("end"); delete (yyvsp[0].s); }
-#line 3430 "engines/director/lingo/lingo-gr.cpp"
+#line 3445 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 83: /* ID: tEXIT  */
 #line 389 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("exit"); }
-#line 3436 "engines/director/lingo/lingo-gr.cpp"
+#line 3451 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 84: /* ID: tFACTORY  */
 #line 390 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("factory"); }
-#line 3442 "engines/director/lingo/lingo-gr.cpp"
+#line 3457 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 85: /* ID: tGLOBAL  */
 #line 391 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("global"); }
-#line 3448 "engines/director/lingo/lingo-gr.cpp"
+#line 3463 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 86: /* ID: tGO  */
 #line 392 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("go"); }
-#line 3454 "engines/director/lingo/lingo-gr.cpp"
+#line 3469 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 87: /* ID: tIF  */
 #line 393 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("if"); }
-#line 3460 "engines/director/lingo/lingo-gr.cpp"
+#line 3475 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 88: /* ID: tINSTANCE  */
 #line 394 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("instance"); }
-#line 3466 "engines/director/lingo/lingo-gr.cpp"
+#line 3481 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 89: /* ID: tMACRO  */
 #line 395 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("macro"); }
-#line 3472 "engines/director/lingo/lingo-gr.cpp"
+#line 3487 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 90: /* ID: tMETHOD  */
 #line 396 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("method"); }
-#line 3478 "engines/director/lingo/lingo-gr.cpp"
+#line 3493 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 91: /* ID: tON  */
 #line 397 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("on"); }
-#line 3484 "engines/director/lingo/lingo-gr.cpp"
+#line 3499 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 92: /* ID: tOPEN  */
 #line 398 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("open"); }
-#line 3490 "engines/director/lingo/lingo-gr.cpp"
+#line 3505 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 93: /* ID: tPLAY  */
 #line 399 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("play"); }
-#line 3496 "engines/director/lingo/lingo-gr.cpp"
+#line 3511 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 94: /* ID: tPROPERTY  */
 #line 400 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("property"); }
-#line 3502 "engines/director/lingo/lingo-gr.cpp"
+#line 3517 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 95: /* ID: tPUT  */
 #line 401 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("put"); }
-#line 3508 "engines/director/lingo/lingo-gr.cpp"
+#line 3523 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 96: /* ID: tRETURN  */
 #line 402 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("return"); }
-#line 3514 "engines/director/lingo/lingo-gr.cpp"
+#line 3529 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 97: /* ID: tSET  */
 #line 403 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("set"); }
-#line 3520 "engines/director/lingo/lingo-gr.cpp"
+#line 3535 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 98: /* ID: tTELL  */
 #line 404 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("tell"); }
-#line 3526 "engines/director/lingo/lingo-gr.cpp"
+#line 3541 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 99: /* ID: tTHEN  */
 #line 405 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.s) = new Common::String("then"); }
-#line 3532 "engines/director/lingo/lingo-gr.cpp"
+#line 3547 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 100: /* idlist: %empty  */
 #line 408 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.idlist) = new IDList; }
-#line 3538 "engines/director/lingo/lingo-gr.cpp"
+#line 3553 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 103: /* nonemptyidlist: ID  */
@@ -3543,7 +3558,7 @@ yyreduce:
 		Common::Array<Common::String *> *list = new IDList;
 		list->push_back((yyvsp[0].s));
 		(yyval.idlist) = list; }
-#line 3547 "engines/director/lingo/lingo-gr.cpp"
+#line 3562 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 104: /* nonemptyidlist: nonemptyidlist ',' ID  */
@@ -3551,97 +3566,97 @@ yyreduce:
                                                         {
 		(yyvsp[-2].idlist)->push_back((yyvsp[0].s));
 		(yyval.idlist) = (yyvsp[-2].idlist); }
-#line 3555 "engines/director/lingo/lingo-gr.cpp"
+#line 3570 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 106: /* stmt: tENDIF '\n'  */
 #line 428 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = nullptr; }
-#line 3561 "engines/director/lingo/lingo-gr.cpp"
+#line 3576 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 116: /* proc: CMDID cmdargs '\n'  */
 #line 444 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new CmdNode((yyvsp[-2].s), (yyvsp[-1].nodelist), g_lingo->_compiler->_linenumber - 1); }
-#line 3567 "engines/director/lingo/lingo-gr.cpp"
+#line 3582 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 117: /* proc: CMDID cmdargs error '\n'  */
 #line 445 "engines/director/lingo/lingo-gr.y"
                                                         { TRIM_GARBAGE((yyval.node), new CmdNode((yyvsp[-3].s), (yyvsp[-2].nodelist), g_lingo->_compiler->_linenumber - 1)); }
-#line 3573 "engines/director/lingo/lingo-gr.cpp"
+#line 3588 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 118: /* proc: tPUT cmdargs '\n'  */
 #line 446 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new CmdNode(new Common::String("put"), (yyvsp[-1].nodelist), g_lingo->_compiler->_linenumber - 1); }
-#line 3579 "engines/director/lingo/lingo-gr.cpp"
+#line 3594 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 119: /* proc: tPUT cmdargs error '\n'  */
 #line 447 "engines/director/lingo/lingo-gr.y"
                                                                         { TRIM_GARBAGE((yyval.node), new CmdNode(new Common::String("put"), (yyvsp[-2].nodelist), g_lingo->_compiler->_linenumber - 1)); }
-#line 3585 "engines/director/lingo/lingo-gr.cpp"
+#line 3600 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 120: /* proc: tGO cmdargs '\n'  */
 #line 448 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new CmdNode(new Common::String("go"), (yyvsp[-1].nodelist), g_lingo->_compiler->_linenumber - 1); }
-#line 3591 "engines/director/lingo/lingo-gr.cpp"
+#line 3606 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 121: /* proc: tGO cmdargs error '\n'  */
 #line 449 "engines/director/lingo/lingo-gr.y"
                                                                         { TRIM_GARBAGE((yyval.node), new CmdNode(new Common::String("go"), (yyvsp[-2].nodelist), g_lingo->_compiler->_linenumber - 1)); }
-#line 3597 "engines/director/lingo/lingo-gr.cpp"
+#line 3612 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 122: /* proc: tGO frameargs '\n'  */
 #line 450 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new CmdNode(new Common::String("go"), (yyvsp[-1].nodelist), g_lingo->_compiler->_linenumber - 1); }
-#line 3603 "engines/director/lingo/lingo-gr.cpp"
+#line 3618 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 123: /* proc: tGO frameargs error '\n'  */
 #line 451 "engines/director/lingo/lingo-gr.y"
                                                                 { TRIM_GARBAGE((yyval.node), new CmdNode(new Common::String("go"), (yyvsp[-2].nodelist), g_lingo->_compiler->_linenumber - 1)); }
-#line 3609 "engines/director/lingo/lingo-gr.cpp"
+#line 3624 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 124: /* proc: tPLAY cmdargs '\n'  */
 #line 452 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new CmdNode(new Common::String("play"), (yyvsp[-1].nodelist), g_lingo->_compiler->_linenumber - 1); }
-#line 3615 "engines/director/lingo/lingo-gr.cpp"
+#line 3630 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 125: /* proc: tPLAY cmdargs error '\n'  */
 #line 453 "engines/director/lingo/lingo-gr.y"
                                                                 { TRIM_GARBAGE((yyval.node), new CmdNode(new Common::String("play"), (yyvsp[-2].nodelist), g_lingo->_compiler->_linenumber - 1)); }
-#line 3621 "engines/director/lingo/lingo-gr.cpp"
+#line 3636 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 126: /* proc: tPLAY frameargs '\n'  */
 #line 454 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new CmdNode(new Common::String("play"), (yyvsp[-1].nodelist), g_lingo->_compiler->_linenumber - 1); }
-#line 3627 "engines/director/lingo/lingo-gr.cpp"
+#line 3642 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 127: /* proc: tPLAY frameargs error '\n'  */
 #line 455 "engines/director/lingo/lingo-gr.y"
                                                                 { TRIM_GARBAGE((yyval.node), new CmdNode(new Common::String("play"), (yyvsp[-2].nodelist), g_lingo->_compiler->_linenumber - 1)); }
-#line 3633 "engines/director/lingo/lingo-gr.cpp"
+#line 3648 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 128: /* proc: tOPEN cmdargs '\n'  */
 #line 456 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new CmdNode(new Common::String("open"), (yyvsp[-1].nodelist), g_lingo->_compiler->_linenumber - 1); }
-#line 3639 "engines/director/lingo/lingo-gr.cpp"
+#line 3654 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 129: /* proc: tOPEN cmdargs error '\n'  */
 #line 457 "engines/director/lingo/lingo-gr.y"
                                                                 { TRIM_GARBAGE((yyval.node), new CmdNode(new Common::String("open"), (yyvsp[-2].nodelist), g_lingo->_compiler->_linenumber - 1)); }
-#line 3645 "engines/director/lingo/lingo-gr.cpp"
+#line 3660 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 130: /* proc: tOPEN expr tWITH expr '\n'  */
@@ -3651,97 +3666,97 @@ yyreduce:
 		args->push_back((yyvsp[-3].node));
 		args->push_back((yyvsp[-1].node));
 		(yyval.node) = new CmdNode(new Common::String("open"), args, g_lingo->_compiler->_linenumber - 1); }
-#line 3655 "engines/director/lingo/lingo-gr.cpp"
+#line 3670 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 131: /* proc: tNEXT tREPEAT '\n'  */
 #line 463 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new NextRepeatNode(); }
-#line 3661 "engines/director/lingo/lingo-gr.cpp"
+#line 3676 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 132: /* proc: tNEXT tREPEAT error '\n'  */
 #line 464 "engines/director/lingo/lingo-gr.y"
                                                                 { TRIM_GARBAGE((yyval.node), new NextRepeatNode()); }
-#line 3667 "engines/director/lingo/lingo-gr.cpp"
+#line 3682 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 133: /* proc: tEXIT tREPEAT '\n'  */
 #line 465 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new ExitRepeatNode(); }
-#line 3673 "engines/director/lingo/lingo-gr.cpp"
+#line 3688 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 134: /* proc: tEXIT tREPEAT error '\n'  */
 #line 466 "engines/director/lingo/lingo-gr.y"
                                                                 { TRIM_GARBAGE((yyval.node), new ExitRepeatNode()); }
-#line 3679 "engines/director/lingo/lingo-gr.cpp"
+#line 3694 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 135: /* proc: tEXIT '\n'  */
 #line 467 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new ExitNode(); }
-#line 3685 "engines/director/lingo/lingo-gr.cpp"
+#line 3700 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 136: /* proc: tEXIT error '\n'  */
 #line 468 "engines/director/lingo/lingo-gr.y"
                                                                         { TRIM_GARBAGE((yyval.node), new ExitNode()); }
-#line 3691 "engines/director/lingo/lingo-gr.cpp"
+#line 3706 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 137: /* proc: tRETURN '\n'  */
 #line 469 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new ReturnNode(nullptr); }
-#line 3697 "engines/director/lingo/lingo-gr.cpp"
+#line 3712 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 138: /* proc: tRETURN error '\n'  */
 #line 470 "engines/director/lingo/lingo-gr.y"
                                                                         { TRIM_GARBAGE((yyval.node), new ReturnNode(nullptr)); }
-#line 3703 "engines/director/lingo/lingo-gr.cpp"
+#line 3718 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 139: /* proc: tRETURN expr '\n'  */
 #line 471 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new ReturnNode((yyvsp[-1].node)); }
-#line 3709 "engines/director/lingo/lingo-gr.cpp"
+#line 3724 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 140: /* proc: tRETURN expr error '\n'  */
 #line 472 "engines/director/lingo/lingo-gr.y"
                                                                         { TRIM_GARBAGE((yyval.node), new ReturnNode((yyvsp[-2].node))); }
-#line 3715 "engines/director/lingo/lingo-gr.cpp"
+#line 3730 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 141: /* proc: tDELETE chunk '\n'  */
 #line 473 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new DeleteNode((yyvsp[-1].node)); }
-#line 3721 "engines/director/lingo/lingo-gr.cpp"
+#line 3736 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 142: /* proc: tDELETE chunk error '\n'  */
 #line 474 "engines/director/lingo/lingo-gr.y"
                                                                 { TRIM_GARBAGE((yyval.node), new DeleteNode((yyvsp[-2].node))); }
-#line 3727 "engines/director/lingo/lingo-gr.cpp"
+#line 3742 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 143: /* proc: tHILITE chunk '\n'  */
 #line 475 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new HiliteNode((yyvsp[-1].node)); }
-#line 3733 "engines/director/lingo/lingo-gr.cpp"
+#line 3748 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 144: /* proc: tHILITE chunk error '\n'  */
 #line 476 "engines/director/lingo/lingo-gr.y"
                                                                 { TRIM_GARBAGE((yyval.node), new HiliteNode((yyvsp[-2].node))); }
-#line 3739 "engines/director/lingo/lingo-gr.cpp"
+#line 3754 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 145: /* proc: tASSERTERROR stmtoneliner  */
 #line 477 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new AssertErrorNode((yyvsp[0].node)); }
-#line 3745 "engines/director/lingo/lingo-gr.cpp"
+#line 3760 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 146: /* cmdargs: %empty  */
@@ -3749,7 +3764,7 @@ yyreduce:
                                                                                         {
 		// This matches `cmd`
 		(yyval.nodelist) = new NodeList; }
-#line 3753 "engines/director/lingo/lingo-gr.cpp"
+#line 3768 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 147: /* cmdargs: expr trailingcomma  */
@@ -3759,7 +3774,7 @@ yyreduce:
 		NodeList *args = new NodeList;
 		args->push_back((yyvsp[-1].node));
 		(yyval.nodelist) = args; }
-#line 3763 "engines/director/lingo/lingo-gr.cpp"
+#line 3778 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 148: /* cmdargs: expr ',' nonemptyexprlist trailingcomma  */
@@ -3768,7 +3783,7 @@ yyreduce:
 		// This matches `cmd arg, ...)
 		(yyvsp[-1].nodelist)->insert_at(0, (yyvsp[-3].node));
 		(yyval.nodelist) = (yyvsp[-1].nodelist); }
-#line 3772 "engines/director/lingo/lingo-gr.cpp"
+#line 3787 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 149: /* cmdargs: expr expr_nounarymath trailingcomma  */
@@ -3779,7 +3794,7 @@ yyreduce:
 		args->push_back((yyvsp[-2].node));
 		args->push_back((yyvsp[-1].node));
 		(yyval.nodelist) = args; }
-#line 3783 "engines/director/lingo/lingo-gr.cpp"
+#line 3798 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 150: /* cmdargs: expr expr_nounarymath ',' nonemptyexprlist trailingcomma  */
@@ -3789,7 +3804,7 @@ yyreduce:
 		(yyvsp[-1].nodelist)->insert_at(0, (yyvsp[-3].node));
 		(yyvsp[-1].nodelist)->insert_at(0, (yyvsp[-4].node));
 		(yyval.nodelist) = (yyvsp[-1].nodelist); }
-#line 3793 "engines/director/lingo/lingo-gr.cpp"
+#line 3808 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 151: /* cmdargs: '(' ')'  */
@@ -3797,7 +3812,7 @@ yyreduce:
                                                                         {
 		// This matches `cmd()`
 		(yyval.nodelist) = new NodeList; }
-#line 3801 "engines/director/lingo/lingo-gr.cpp"
+#line 3816 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 152: /* cmdargs: '(' expr ',' ')'  */
@@ -3807,7 +3822,7 @@ yyreduce:
 		NodeList *args = new NodeList;
 		args->push_back((yyvsp[-2].node));
 		(yyval.nodelist) = args; }
-#line 3811 "engines/director/lingo/lingo-gr.cpp"
+#line 3826 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 153: /* cmdargs: '(' expr ',' nonemptyexprlist trailingcomma ')'  */
@@ -3816,7 +3831,7 @@ yyreduce:
 		// This matches `cmd(arg, ...)`
 		(yyvsp[-2].nodelist)->insert_at(0, (yyvsp[-4].node));
 		(yyval.nodelist) = (yyvsp[-2].nodelist); }
-#line 3820 "engines/director/lingo/lingo-gr.cpp"
+#line 3835 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 154: /* cmdargs: '(' var expr_nounarymath trailingcomma ')'  */
@@ -3827,7 +3842,7 @@ yyreduce:
 		args->push_back((yyvsp[-3].node));
 		args->push_back((yyvsp[-2].node));
 		(yyval.nodelist) = args; }
-#line 3831 "engines/director/lingo/lingo-gr.cpp"
+#line 3846 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 155: /* cmdargs: '(' var expr_nounarymath ',' nonemptyexprlist trailingcomma ')'  */
@@ -3837,7 +3852,7 @@ yyreduce:
 		(yyvsp[-2].nodelist)->insert_at(0, (yyvsp[-4].node));
 		(yyvsp[-2].nodelist)->insert_at(0, (yyvsp[-5].node));
 		(yyval.nodelist) = (yyvsp[-2].nodelist); }
-#line 3841 "engines/director/lingo/lingo-gr.cpp"
+#line 3856 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 158: /* frameargs: tFRAME expr  */
@@ -3847,7 +3862,7 @@ yyreduce:
 		NodeList *args = new NodeList;
 		args->push_back(new FrameNode((yyvsp[0].node)));
 		(yyval.nodelist) = args; }
-#line 3851 "engines/director/lingo/lingo-gr.cpp"
+#line 3866 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 159: /* frameargs: tMOVIE expr  */
@@ -3858,7 +3873,7 @@ yyreduce:
 		args->push_back(new IntNode(1));
 		args->push_back(new MovieNode((yyvsp[0].node)));
 		(yyval.nodelist) = args; }
-#line 3862 "engines/director/lingo/lingo-gr.cpp"
+#line 3877 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 160: /* frameargs: tFRAME expr tOF tMOVIE expr  */
@@ -3869,7 +3884,7 @@ yyreduce:
 		args->push_back(new FrameNode((yyvsp[-3].node)));
 		args->push_back(new MovieNode((yyvsp[0].node)));
 		(yyval.nodelist) = args; }
-#line 3873 "engines/director/lingo/lingo-gr.cpp"
+#line 3888 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 161: /* frameargs: expr tOF tMOVIE expr  */
@@ -3880,7 +3895,7 @@ yyreduce:
 		args->push_back((yyvsp[-3].node));
 		args->push_back(new MovieNode((yyvsp[0].node)));
 		(yyval.nodelist) = args; }
-#line 3884 "engines/director/lingo/lingo-gr.cpp"
+#line 3899 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 162: /* frameargs: tFRAME expr expr_nounarymath  */
@@ -3891,91 +3906,91 @@ yyreduce:
 		args->push_back(new FrameNode((yyvsp[-1].node)));
 		args->push_back((yyvsp[0].node));
 		(yyval.nodelist) = args; }
-#line 3895 "engines/director/lingo/lingo-gr.cpp"
+#line 3910 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 163: /* asgn: tPUT expr tINTO varorchunk '\n'  */
 #line 565 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new PutIntoNode((yyvsp[-3].node), (yyvsp[-1].node)); }
-#line 3901 "engines/director/lingo/lingo-gr.cpp"
+#line 3916 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 164: /* asgn: tPUT expr tINTO varorchunk error '\n'  */
 #line 566 "engines/director/lingo/lingo-gr.y"
                                                 { TRIM_GARBAGE((yyval.node), new PutIntoNode((yyvsp[-4].node), (yyvsp[-2].node))); }
-#line 3907 "engines/director/lingo/lingo-gr.cpp"
+#line 3922 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 165: /* asgn: tPUT expr tAFTER varorchunk '\n'  */
 #line 567 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new PutAfterNode((yyvsp[-3].node), (yyvsp[-1].node)); }
-#line 3913 "engines/director/lingo/lingo-gr.cpp"
+#line 3928 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 166: /* asgn: tPUT expr tAFTER varorchunk error '\n'  */
 #line 568 "engines/director/lingo/lingo-gr.y"
                                                         { TRIM_GARBAGE((yyval.node), new PutAfterNode((yyvsp[-4].node), (yyvsp[-2].node))); }
-#line 3919 "engines/director/lingo/lingo-gr.cpp"
+#line 3934 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 167: /* asgn: tPUT expr tBEFORE varorchunk '\n'  */
 #line 569 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new PutBeforeNode((yyvsp[-3].node), (yyvsp[-1].node)); }
-#line 3925 "engines/director/lingo/lingo-gr.cpp"
+#line 3940 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 168: /* asgn: tPUT expr tBEFORE varorchunk error '\n'  */
 #line 570 "engines/director/lingo/lingo-gr.y"
                                                         { TRIM_GARBAGE((yyval.node), new PutBeforeNode((yyvsp[-4].node), (yyvsp[-2].node))); }
-#line 3931 "engines/director/lingo/lingo-gr.cpp"
+#line 3946 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 169: /* asgn: tSET varorthe to expr '\n'  */
 #line 571 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new SetNode((yyvsp[-3].node), (yyvsp[-1].node)); }
-#line 3937 "engines/director/lingo/lingo-gr.cpp"
+#line 3952 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 170: /* asgn: tSET varorthe to expr error '\n'  */
 #line 572 "engines/director/lingo/lingo-gr.y"
                                                 { TRIM_GARBAGE((yyval.node), new SetNode((yyvsp[-4].node), (yyvsp[-2].node))); }
-#line 3943 "engines/director/lingo/lingo-gr.cpp"
+#line 3958 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 173: /* definevars: tGLOBAL idlist '\n'  */
 #line 577 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new GlobalNode((yyvsp[-1].idlist)); }
-#line 3949 "engines/director/lingo/lingo-gr.cpp"
+#line 3964 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 174: /* definevars: tGLOBAL idlist error '\n'  */
 #line 578 "engines/director/lingo/lingo-gr.y"
                                                         { TRIM_GARBAGE((yyval.node), new GlobalNode((yyvsp[-2].idlist))); }
-#line 3955 "engines/director/lingo/lingo-gr.cpp"
+#line 3970 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 175: /* definevars: tPROPERTY idlist '\n'  */
 #line 579 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new PropertyNode((yyvsp[-1].idlist)); }
-#line 3961 "engines/director/lingo/lingo-gr.cpp"
+#line 3976 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 176: /* definevars: tPROPERTY idlist error '\n'  */
 #line 580 "engines/director/lingo/lingo-gr.y"
                                                                 { TRIM_GARBAGE((yyval.node), new PropertyNode((yyvsp[-2].idlist))); }
-#line 3967 "engines/director/lingo/lingo-gr.cpp"
+#line 3982 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 177: /* definevars: tINSTANCE idlist '\n'  */
 #line 581 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new InstanceNode((yyvsp[-1].idlist)); }
-#line 3973 "engines/director/lingo/lingo-gr.cpp"
+#line 3988 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 178: /* definevars: tINSTANCE idlist error '\n'  */
 #line 582 "engines/director/lingo/lingo-gr.y"
                                                                 { TRIM_GARBAGE((yyval.node), new InstanceNode((yyvsp[-2].idlist))); }
-#line 3979 "engines/director/lingo/lingo-gr.cpp"
+#line 3994 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 179: /* ifstmt: tIF expr tTHEN stmt  */
@@ -3984,21 +3999,21 @@ yyreduce:
 		NodeList *stmtlist = new NodeList;
 		stmtlist->push_back((yyvsp[0].node));
 		(yyval.node) = new IfStmtNode((yyvsp[-2].node), stmtlist); }
-#line 3988 "engines/director/lingo/lingo-gr.cpp"
+#line 4003 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 180: /* ifstmt: tIF expr tTHEN '\n' stmtlist_insideif endif  */
 #line 589 "engines/director/lingo/lingo-gr.y"
                                                       {
 		(yyval.node) = new IfStmtNode((yyvsp[-4].node), (yyvsp[-1].nodelist)); }
-#line 3995 "engines/director/lingo/lingo-gr.cpp"
+#line 4010 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 181: /* ifstmt: tIF expr tTHEN error '\n' stmtlist_insideif endif  */
 #line 591 "engines/director/lingo/lingo-gr.y"
                                                             {
 		TRIM_GARBAGE((yyval.node), new IfStmtNode((yyvsp[-5].node), (yyvsp[-1].nodelist))); }
-#line 4002 "engines/director/lingo/lingo-gr.cpp"
+#line 4017 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 182: /* ifelsestmt: tIF expr tTHEN stmt tELSE stmt  */
@@ -4009,7 +4024,7 @@ yyreduce:
 		NodeList *stmtlist2 = new NodeList;
 		stmtlist2->push_back((yyvsp[0].node));
 		(yyval.node) = new IfElseStmtNode((yyvsp[-4].node), stmtlist1, stmtlist2); }
-#line 4013 "engines/director/lingo/lingo-gr.cpp"
+#line 4028 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 183: /* ifelsestmt: tIF expr tTHEN stmt tELSE '\n' stmtlist_insideif endif  */
@@ -4018,7 +4033,7 @@ yyreduce:
 		NodeList *stmtlist1 = new NodeList;
 		stmtlist1->push_back((yyvsp[-4].node));
 		(yyval.node) = new IfElseStmtNode((yyvsp[-6].node), stmtlist1, (yyvsp[-1].nodelist)); }
-#line 4022 "engines/director/lingo/lingo-gr.cpp"
+#line 4037 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 184: /* ifelsestmt: tIF expr tTHEN '\n' stmtlist_insideif tELSE stmt  */
@@ -4027,14 +4042,14 @@ yyreduce:
 		NodeList *stmtlist2 = new NodeList;
 		stmtlist2->push_back((yyvsp[0].node));
 		(yyval.node) = new IfElseStmtNode((yyvsp[-5].node), (yyvsp[-2].nodelist), stmtlist2); }
-#line 4031 "engines/director/lingo/lingo-gr.cpp"
+#line 4046 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 185: /* ifelsestmt: tIF expr tTHEN '\n' stmtlist_insideif tELSE '\n' stmtlist_insideif endif  */
 #line 609 "engines/director/lingo/lingo-gr.y"
                                                                                                          {
 		(yyval.node) = new IfElseStmtNode((yyvsp[-7].node), (yyvsp[-4].nodelist), (yyvsp[-1].nodelist)); }
-#line 4038 "engines/director/lingo/lingo-gr.cpp"
+#line 4053 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 186: /* endif: %empty  */
@@ -4046,63 +4061,63 @@ yyreduce:
 			compiler->_assemblyContext->_id);
 
 		}
-#line 4050 "engines/director/lingo/lingo-gr.cpp"
+#line 4065 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 188: /* loop: tREPEAT tWHILE expr '\n' stmtlist tENDREPEAT '\n'  */
 #line 622 "engines/director/lingo/lingo-gr.y"
                                                         {
 		(yyval.node) = new RepeatWhileNode((yyvsp[-4].node), (yyvsp[-2].nodelist)); }
-#line 4057 "engines/director/lingo/lingo-gr.cpp"
+#line 4072 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 189: /* loop: tREPEAT tWHILE expr error '\n' stmtlist tENDREPEAT '\n'  */
 #line 624 "engines/director/lingo/lingo-gr.y"
                                                                   {
 		TRIM_GARBAGE((yyval.node), new RepeatWhileNode((yyvsp[-5].node), (yyvsp[-2].nodelist))); }
-#line 4064 "engines/director/lingo/lingo-gr.cpp"
+#line 4079 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 190: /* loop: tREPEAT tWITH ID tEQ expr tTO expr '\n' stmtlist tENDREPEAT '\n'  */
 #line 626 "engines/director/lingo/lingo-gr.y"
                                                                                        {
 		(yyval.node) = new RepeatWithToNode((yyvsp[-8].s), (yyvsp[-6].node), false, (yyvsp[-4].node), (yyvsp[-2].nodelist)); }
-#line 4071 "engines/director/lingo/lingo-gr.cpp"
+#line 4086 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 191: /* loop: tREPEAT tWITH ID tEQ expr tTO expr error '\n' stmtlist tENDREPEAT '\n'  */
 #line 628 "engines/director/lingo/lingo-gr.y"
                                                                                              {
 		TRIM_GARBAGE((yyval.node), new RepeatWithToNode((yyvsp[-9].s), (yyvsp[-7].node), false, (yyvsp[-5].node), (yyvsp[-2].nodelist))); }
-#line 4078 "engines/director/lingo/lingo-gr.cpp"
+#line 4093 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 192: /* loop: tREPEAT tWITH ID tEQ expr tDOWN tTO expr '\n' stmtlist tENDREPEAT '\n'  */
 #line 630 "engines/director/lingo/lingo-gr.y"
                                                                                              {
 		(yyval.node) = new RepeatWithToNode((yyvsp[-9].s), (yyvsp[-7].node), true, (yyvsp[-4].node), (yyvsp[-2].nodelist)); }
-#line 4085 "engines/director/lingo/lingo-gr.cpp"
+#line 4100 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 193: /* loop: tREPEAT tWITH ID tEQ expr tDOWN tTO expr error '\n' stmtlist tENDREPEAT '\n'  */
 #line 632 "engines/director/lingo/lingo-gr.y"
                                                                                                    {
 		TRIM_GARBAGE((yyval.node), new RepeatWithToNode((yyvsp[-10].s), (yyvsp[-8].node), true, (yyvsp[-5].node), (yyvsp[-2].nodelist))); }
-#line 4092 "engines/director/lingo/lingo-gr.cpp"
+#line 4107 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 194: /* loop: tREPEAT tWITH ID tIN expr '\n' stmtlist tENDREPEAT '\n'  */
 #line 634 "engines/director/lingo/lingo-gr.y"
                                                                   {
 		(yyval.node) = new RepeatWithInNode((yyvsp[-6].s), (yyvsp[-4].node), (yyvsp[-2].nodelist)); }
-#line 4099 "engines/director/lingo/lingo-gr.cpp"
+#line 4114 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 195: /* loop: tREPEAT tWITH ID tIN expr error '\n' stmtlist tENDREPEAT '\n'  */
 #line 636 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		TRIM_GARBAGE((yyval.node), new RepeatWithInNode((yyvsp[-7].s), (yyvsp[-5].node), (yyvsp[-2].nodelist))); }
-#line 4106 "engines/director/lingo/lingo-gr.cpp"
+#line 4121 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 196: /* tell: tTELL expr tTO stmtoneliner  */
@@ -4111,33 +4126,33 @@ yyreduce:
 		NodeList *stmtlist = new NodeList;
 		stmtlist->push_back((yyvsp[0].node));
 		(yyval.node) = new TellNode((yyvsp[-2].node), stmtlist); }
-#line 4115 "engines/director/lingo/lingo-gr.cpp"
+#line 4130 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 197: /* tell: tTELL expr '\n' stmtlist tENDTELL '\n'  */
 #line 644 "engines/director/lingo/lingo-gr.y"
                                                         {
 		(yyval.node) = new TellNode((yyvsp[-4].node), (yyvsp[-2].nodelist)); }
-#line 4122 "engines/director/lingo/lingo-gr.cpp"
+#line 4137 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 198: /* tell: tTELL expr error '\n' stmtlist tENDTELL '\n'  */
 #line 646 "engines/director/lingo/lingo-gr.y"
                                                         {
 		TRIM_GARBAGE((yyval.node), new TellNode((yyvsp[-5].node), (yyvsp[-2].nodelist))); }
-#line 4129 "engines/director/lingo/lingo-gr.cpp"
+#line 4144 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 199: /* when: tWHEN '\n'  */
 #line 650 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new WhenNode((yyvsp[-1].w).eventName, (yyvsp[-1].w).stmt); }
-#line 4135 "engines/director/lingo/lingo-gr.cpp"
+#line 4150 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 200: /* stmtlist: %empty  */
 #line 652 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.nodelist) = new NodeList; }
-#line 4141 "engines/director/lingo/lingo-gr.cpp"
+#line 4156 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 202: /* nonemptystmtlist: stmtlistline  */
@@ -4148,7 +4163,7 @@ yyreduce:
 			list->push_back((yyvsp[0].node));
 		}
 		(yyval.nodelist) = list; }
-#line 4152 "engines/director/lingo/lingo-gr.cpp"
+#line 4167 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 203: /* nonemptystmtlist: nonemptystmtlist stmtlistline  */
@@ -4158,19 +4173,19 @@ yyreduce:
 			(yyvsp[-1].nodelist)->push_back((yyvsp[0].node));
 		}
 		(yyval.nodelist) = (yyvsp[-1].nodelist); }
-#line 4162 "engines/director/lingo/lingo-gr.cpp"
+#line 4177 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 204: /* stmtlistline: '\n'  */
 #line 670 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = nullptr; }
-#line 4168 "engines/director/lingo/lingo-gr.cpp"
+#line 4183 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 206: /* stmtlist_insideif: %empty  */
 #line 674 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.nodelist) = new NodeList; }
-#line 4174 "engines/director/lingo/lingo-gr.cpp"
+#line 4189 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 208: /* nonemptystmtlist_insideif: stmtlistline_insideif  */
@@ -4181,7 +4196,7 @@ yyreduce:
 			list->push_back((yyvsp[0].node));
 		}
 		(yyval.nodelist) = list; }
-#line 4185 "engines/director/lingo/lingo-gr.cpp"
+#line 4200 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 209: /* nonemptystmtlist_insideif: nonemptystmtlist_insideif stmtlistline_insideif  */
@@ -4191,55 +4206,55 @@ yyreduce:
 			(yyvsp[-1].nodelist)->push_back((yyvsp[0].node));
 		}
 		(yyval.nodelist) = (yyvsp[-1].nodelist); }
-#line 4195 "engines/director/lingo/lingo-gr.cpp"
+#line 4210 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 210: /* stmtlistline_insideif: '\n'  */
 #line 692 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = nullptr; }
-#line 4201 "engines/director/lingo/lingo-gr.cpp"
+#line 4216 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 212: /* simpleexpr_nounarymath: tINT  */
 #line 699 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new IntNode((yyvsp[0].i)); }
-#line 4207 "engines/director/lingo/lingo-gr.cpp"
+#line 4222 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 213: /* simpleexpr_nounarymath: tFLOAT  */
 #line 700 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new FloatNode((yyvsp[0].f)); }
-#line 4213 "engines/director/lingo/lingo-gr.cpp"
+#line 4228 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 214: /* simpleexpr_nounarymath: tSYMBOL  */
 #line 701 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new SymbolNode((yyvsp[0].s)); }
-#line 4219 "engines/director/lingo/lingo-gr.cpp"
+#line 4234 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 215: /* simpleexpr_nounarymath: tSTRING  */
 #line 702 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new StringNode((yyvsp[0].s)); }
-#line 4225 "engines/director/lingo/lingo-gr.cpp"
+#line 4240 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 216: /* simpleexpr_nounarymath: tNOT simpleexpr  */
 #line 703 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new UnaryOpNode(LC::c_not, (yyvsp[0].node)); }
-#line 4231 "engines/director/lingo/lingo-gr.cpp"
+#line 4246 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 217: /* simpleexpr_nounarymath: ID '(' ')'  */
 #line 704 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new FuncNode((yyvsp[-2].s), new NodeList); }
-#line 4237 "engines/director/lingo/lingo-gr.cpp"
+#line 4252 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 218: /* simpleexpr_nounarymath: ID '(' nonemptyexprlist trailingcomma ')'  */
 #line 705 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new FuncNode((yyvsp[-4].s), (yyvsp[-2].nodelist)); }
-#line 4243 "engines/director/lingo/lingo-gr.cpp"
+#line 4258 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 219: /* simpleexpr_nounarymath: ID '(' var expr_nounarymath trailingcomma ')'  */
@@ -4250,7 +4265,7 @@ yyreduce:
 		args->push_back((yyvsp[-3].node));
 		args->push_back((yyvsp[-2].node));
 		(yyval.node) = new FuncNode((yyvsp[-5].s), args); }
-#line 4254 "engines/director/lingo/lingo-gr.cpp"
+#line 4269 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 220: /* simpleexpr_nounarymath: ID '(' var expr_nounarymath ',' nonemptyexprlist trailingcomma ')'  */
@@ -4260,788 +4275,808 @@ yyreduce:
 		(yyvsp[-2].nodelist)->insert_at(0, (yyvsp[-4].node));
 		(yyvsp[-2].nodelist)->insert_at(0, (yyvsp[-5].node));
 		(yyval.node) = new FuncNode((yyvsp[-7].s), (yyvsp[-2].nodelist)); }
-#line 4264 "engines/director/lingo/lingo-gr.cpp"
+#line 4279 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 221: /* simpleexpr_nounarymath: '(' expr ')'  */
 #line 717 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = (yyvsp[-1].node); }
-#line 4270 "engines/director/lingo/lingo-gr.cpp"
+#line 4285 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 227: /* var: ID  */
 #line 725 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new VarNode((yyvsp[0].s)); }
-#line 4276 "engines/director/lingo/lingo-gr.cpp"
+#line 4291 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 232: /* chunk: tFIELD refargs  */
 #line 735 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.node) = new FuncNode(new Common::String("field"), (yyvsp[0].nodelist)); }
-#line 4282 "engines/director/lingo/lingo-gr.cpp"
+#line 4297 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 233: /* chunk: tCAST refargs  */
+  case 233: /* chunk: tCAST simpleexpr tOF tCASTLIB simpleexpr  */
 #line 736 "engines/director/lingo/lingo-gr.y"
+                                                         {
+		NodeList *args = new NodeList;
+		args->push_back((yyvsp[-3].node));
+		args->push_back((yyvsp[0].node));
+		(yyval.node) = new FuncNode(new Common::String("cast"), args);	}
+#line 4307 "engines/director/lingo/lingo-gr.cpp"
+    break;
+
+  case 234: /* chunk: tCAST refargs  */
+#line 741 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new FuncNode(new Common::String("cast"), (yyvsp[0].nodelist)); }
-#line 4288 "engines/director/lingo/lingo-gr.cpp"
+#line 4313 "engines/director/lingo/lingo-gr.cpp"
+    break;
+
+  case 235: /* chunk: tMEMBER simpleexpr tOF tCASTLIB simpleexpr  */
+#line 742 "engines/director/lingo/lingo-gr.y"
+                                                           {
+		NodeList *args = new NodeList;
+		args->push_back((yyvsp[-3].node));
+		args->push_back((yyvsp[0].node));
+		(yyval.node) = new FuncNode(new Common::String("member"), args);	}
+#line 4323 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 234: /* chunk: tMEMBER refargs  */
-#line 737 "engines/director/lingo/lingo-gr.y"
+  case 236: /* chunk: tMEMBER refargs  */
+#line 747 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new FuncNode(new Common::String("member"), (yyvsp[0].nodelist)); }
-#line 4294 "engines/director/lingo/lingo-gr.cpp"
+#line 4329 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 235: /* chunk: tCASTLIB refargs  */
-#line 738 "engines/director/lingo/lingo-gr.y"
+  case 237: /* chunk: tCASTLIB refargs  */
+#line 748 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new FuncNode(new Common::String("castLib"), (yyvsp[0].nodelist)); }
-#line 4300 "engines/director/lingo/lingo-gr.cpp"
+#line 4335 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 236: /* chunk: tCHAR expr tOF simpleexpr  */
-#line 739 "engines/director/lingo/lingo-gr.y"
+  case 238: /* chunk: tCHAR expr tOF simpleexpr  */
+#line 749 "engines/director/lingo/lingo-gr.y"
                                                 {
 		(yyval.node) = new ChunkExprNode(kChunkChar, (yyvsp[-2].node), nullptr, (yyvsp[0].node)); }
-#line 4307 "engines/director/lingo/lingo-gr.cpp"
+#line 4342 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 237: /* chunk: tCHAR expr tTO expr tOF simpleexpr  */
-#line 741 "engines/director/lingo/lingo-gr.y"
+  case 239: /* chunk: tCHAR expr tTO expr tOF simpleexpr  */
+#line 751 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		(yyval.node) = new ChunkExprNode(kChunkChar, (yyvsp[-4].node), (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4314 "engines/director/lingo/lingo-gr.cpp"
+#line 4349 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 238: /* chunk: tWORD expr tOF simpleexpr  */
-#line 743 "engines/director/lingo/lingo-gr.y"
+  case 240: /* chunk: tWORD expr tOF simpleexpr  */
+#line 753 "engines/director/lingo/lingo-gr.y"
                                                 {
 		(yyval.node) = new ChunkExprNode(kChunkWord, (yyvsp[-2].node), nullptr, (yyvsp[0].node)); }
-#line 4321 "engines/director/lingo/lingo-gr.cpp"
+#line 4356 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 239: /* chunk: tWORD expr tTO expr tOF simpleexpr  */
-#line 745 "engines/director/lingo/lingo-gr.y"
+  case 241: /* chunk: tWORD expr tTO expr tOF simpleexpr  */
+#line 755 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		(yyval.node) = new ChunkExprNode(kChunkWord, (yyvsp[-4].node), (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4328 "engines/director/lingo/lingo-gr.cpp"
+#line 4363 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 240: /* chunk: tITEM expr tOF simpleexpr  */
-#line 747 "engines/director/lingo/lingo-gr.y"
+  case 242: /* chunk: tITEM expr tOF simpleexpr  */
+#line 757 "engines/director/lingo/lingo-gr.y"
                                                 {
 		(yyval.node) = new ChunkExprNode(kChunkItem, (yyvsp[-2].node), nullptr, (yyvsp[0].node)); }
-#line 4335 "engines/director/lingo/lingo-gr.cpp"
+#line 4370 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 241: /* chunk: tITEM expr tTO expr tOF simpleexpr  */
-#line 749 "engines/director/lingo/lingo-gr.y"
+  case 243: /* chunk: tITEM expr tTO expr tOF simpleexpr  */
+#line 759 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		(yyval.node) = new ChunkExprNode(kChunkItem, (yyvsp[-4].node), (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4342 "engines/director/lingo/lingo-gr.cpp"
+#line 4377 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 242: /* chunk: tLINE expr tOF simpleexpr  */
-#line 751 "engines/director/lingo/lingo-gr.y"
+  case 244: /* chunk: tLINE expr tOF simpleexpr  */
+#line 761 "engines/director/lingo/lingo-gr.y"
                                                 {
 		(yyval.node) = new ChunkExprNode(kChunkLine, (yyvsp[-2].node), nullptr, (yyvsp[0].node)); }
-#line 4349 "engines/director/lingo/lingo-gr.cpp"
+#line 4384 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 243: /* chunk: tLINE expr tTO expr tOF simpleexpr  */
-#line 753 "engines/director/lingo/lingo-gr.y"
+  case 245: /* chunk: tLINE expr tTO expr tOF simpleexpr  */
+#line 763 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		(yyval.node) = new ChunkExprNode(kChunkLine, (yyvsp[-4].node), (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4356 "engines/director/lingo/lingo-gr.cpp"
+#line 4391 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 244: /* chunk: tTHE tLAST chunktype inof simpleexpr  */
-#line 755 "engines/director/lingo/lingo-gr.y"
+  case 246: /* chunk: tTHE tLAST chunktype inof simpleexpr  */
+#line 765 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new TheLastNode((yyvsp[-2].chunktype), (yyvsp[0].node)); }
-#line 4362 "engines/director/lingo/lingo-gr.cpp"
+#line 4397 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 245: /* chunktype: tCHAR  */
-#line 758 "engines/director/lingo/lingo-gr.y"
+  case 247: /* chunktype: tCHAR  */
+#line 768 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.chunktype) = kChunkChar; }
-#line 4368 "engines/director/lingo/lingo-gr.cpp"
+#line 4403 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 246: /* chunktype: tWORD  */
-#line 759 "engines/director/lingo/lingo-gr.y"
+  case 248: /* chunktype: tWORD  */
+#line 769 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.chunktype) = kChunkWord; }
-#line 4374 "engines/director/lingo/lingo-gr.cpp"
+#line 4409 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 247: /* chunktype: tITEM  */
-#line 760 "engines/director/lingo/lingo-gr.y"
+  case 249: /* chunktype: tITEM  */
+#line 770 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.chunktype) = kChunkItem; }
-#line 4380 "engines/director/lingo/lingo-gr.cpp"
+#line 4415 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 248: /* chunktype: tLINE  */
-#line 761 "engines/director/lingo/lingo-gr.y"
+  case 250: /* chunktype: tLINE  */
+#line 771 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.chunktype) = kChunkLine; }
-#line 4386 "engines/director/lingo/lingo-gr.cpp"
+#line 4421 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 249: /* object: tSCRIPT refargs  */
-#line 764 "engines/director/lingo/lingo-gr.y"
+  case 251: /* object: tSCRIPT refargs  */
+#line 774 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.node) = new FuncNode(new Common::String("script"), (yyvsp[0].nodelist)); }
-#line 4392 "engines/director/lingo/lingo-gr.cpp"
+#line 4427 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 250: /* object: tWINDOW refargs  */
-#line 765 "engines/director/lingo/lingo-gr.y"
+  case 252: /* object: tWINDOW refargs  */
+#line 775 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new FuncNode(new Common::String("window"), (yyvsp[0].nodelist)); }
-#line 4398 "engines/director/lingo/lingo-gr.cpp"
+#line 4433 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 251: /* refargs: simpleexpr  */
-#line 768 "engines/director/lingo/lingo-gr.y"
+  case 253: /* refargs: simpleexpr  */
+#line 778 "engines/director/lingo/lingo-gr.y"
                                                                                 {
 		// This matches `ref arg` and `ref(arg)`
 		NodeList *args = new NodeList;
 		args->push_back((yyvsp[0].node));
 		(yyval.nodelist) = args; }
-#line 4408 "engines/director/lingo/lingo-gr.cpp"
+#line 4443 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 252: /* refargs: '(' ')'  */
-#line 773 "engines/director/lingo/lingo-gr.y"
+  case 254: /* refargs: '(' ')'  */
+#line 783 "engines/director/lingo/lingo-gr.y"
                                                                                         {
 		// This matches `ref()`
 		(yyval.nodelist) = new NodeList; }
-#line 4416 "engines/director/lingo/lingo-gr.cpp"
+#line 4451 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 253: /* refargs: '(' expr ',' ')'  */
-#line 776 "engines/director/lingo/lingo-gr.y"
+  case 255: /* refargs: '(' expr ',' ')'  */
+#line 786 "engines/director/lingo/lingo-gr.y"
                            {
 		// This matches `ref(arg,)`
 		NodeList *args = new NodeList;
 		args->push_back((yyvsp[-2].node));
 		(yyval.nodelist) = args; }
-#line 4426 "engines/director/lingo/lingo-gr.cpp"
+#line 4461 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 254: /* refargs: '(' expr ',' nonemptyexprlist trailingcomma ')'  */
-#line 781 "engines/director/lingo/lingo-gr.y"
+  case 256: /* refargs: '(' expr ',' nonemptyexprlist trailingcomma ')'  */
+#line 791 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		// This matches `ref(arg, ...)`
 		(yyvsp[-2].nodelist)->insert_at(0, (yyvsp[-4].node));
 		(yyval.nodelist) = (yyvsp[-2].nodelist); }
-#line 4435 "engines/director/lingo/lingo-gr.cpp"
+#line 4470 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 255: /* the: tTHE ID  */
-#line 787 "engines/director/lingo/lingo-gr.y"
+  case 257: /* the: tTHE ID  */
+#line 797 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new TheNode((yyvsp[0].s)); }
-#line 4441 "engines/director/lingo/lingo-gr.cpp"
+#line 4476 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 256: /* the: tTHE ID tOF theobj  */
-#line 788 "engines/director/lingo/lingo-gr.y"
+  case 258: /* the: tTHE ID tOF theobj  */
+#line 798 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheOfNode((yyvsp[-2].s), (yyvsp[0].node)); }
-#line 4447 "engines/director/lingo/lingo-gr.cpp"
+#line 4482 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 257: /* the: tTHE tNUMBER tOF theobj  */
-#line 789 "engines/director/lingo/lingo-gr.y"
+  case 259: /* the: tTHE tNUMBER tOF theobj  */
+#line 799 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheOfNode(new Common::String("number"), (yyvsp[0].node)); }
-#line 4453 "engines/director/lingo/lingo-gr.cpp"
+#line 4488 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 262: /* theobj: tMENUITEM simpleexpr tOF tMENU simpleexpr  */
-#line 796 "engines/director/lingo/lingo-gr.y"
+  case 264: /* theobj: tMENUITEM simpleexpr tOF tMENU simpleexpr  */
+#line 806 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new MenuItemNode((yyvsp[-3].node), (yyvsp[0].node)); }
-#line 4459 "engines/director/lingo/lingo-gr.cpp"
+#line 4494 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 263: /* theobj: tSOUND simpleexpr  */
-#line 797 "engines/director/lingo/lingo-gr.y"
+  case 265: /* theobj: tSOUND simpleexpr  */
+#line 807 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new SoundNode((yyvsp[0].node)); }
-#line 4465 "engines/director/lingo/lingo-gr.cpp"
+#line 4500 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 264: /* theobj: tSPRITE simpleexpr  */
-#line 798 "engines/director/lingo/lingo-gr.y"
+  case 266: /* theobj: tSPRITE simpleexpr  */
+#line 808 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new SpriteNode((yyvsp[0].node)); }
-#line 4471 "engines/director/lingo/lingo-gr.cpp"
+#line 4506 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 265: /* menu: tMENU simpleexpr  */
-#line 801 "engines/director/lingo/lingo-gr.y"
+  case 267: /* menu: tMENU simpleexpr  */
+#line 811 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new MenuNode((yyvsp[0].node)); }
-#line 4477 "engines/director/lingo/lingo-gr.cpp"
+#line 4512 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 266: /* thedatetime: tTHE tABBREVIATED tDATE  */
-#line 803 "engines/director/lingo/lingo-gr.y"
+  case 268: /* thedatetime: tTHE tABBREVIATED tDATE  */
+#line 813 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new TheDateTimeNode(kTheAbbr, kTheDate); }
-#line 4483 "engines/director/lingo/lingo-gr.cpp"
+#line 4518 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 267: /* thedatetime: tTHE tABBREVIATED tTIME  */
-#line 804 "engines/director/lingo/lingo-gr.y"
+  case 269: /* thedatetime: tTHE tABBREVIATED tTIME  */
+#line 814 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheDateTimeNode(kTheAbbr, kTheTime); }
-#line 4489 "engines/director/lingo/lingo-gr.cpp"
+#line 4524 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 268: /* thedatetime: tTHE tABBREV tDATE  */
-#line 805 "engines/director/lingo/lingo-gr.y"
+  case 270: /* thedatetime: tTHE tABBREV tDATE  */
+#line 815 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheDateTimeNode(kTheAbbr, kTheDate); }
-#line 4495 "engines/director/lingo/lingo-gr.cpp"
+#line 4530 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 269: /* thedatetime: tTHE tABBREV tTIME  */
-#line 806 "engines/director/lingo/lingo-gr.y"
+  case 271: /* thedatetime: tTHE tABBREV tTIME  */
+#line 816 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheDateTimeNode(kTheAbbr, kTheTime); }
-#line 4501 "engines/director/lingo/lingo-gr.cpp"
+#line 4536 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 270: /* thedatetime: tTHE tABBR tDATE  */
-#line 807 "engines/director/lingo/lingo-gr.y"
+  case 272: /* thedatetime: tTHE tABBR tDATE  */
+#line 817 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new TheDateTimeNode(kTheAbbr, kTheDate); }
-#line 4507 "engines/director/lingo/lingo-gr.cpp"
+#line 4542 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 271: /* thedatetime: tTHE tABBR tTIME  */
-#line 808 "engines/director/lingo/lingo-gr.y"
+  case 273: /* thedatetime: tTHE tABBR tTIME  */
+#line 818 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new TheDateTimeNode(kTheAbbr, kTheTime); }
-#line 4513 "engines/director/lingo/lingo-gr.cpp"
+#line 4548 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 272: /* thedatetime: tTHE tLONG tDATE  */
-#line 809 "engines/director/lingo/lingo-gr.y"
+  case 274: /* thedatetime: tTHE tLONG tDATE  */
+#line 819 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new TheDateTimeNode(kTheLong, kTheDate); }
-#line 4519 "engines/director/lingo/lingo-gr.cpp"
+#line 4554 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 273: /* thedatetime: tTHE tLONG tTIME  */
-#line 810 "engines/director/lingo/lingo-gr.y"
+  case 275: /* thedatetime: tTHE tLONG tTIME  */
+#line 820 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new TheDateTimeNode(kTheLong, kTheTime); }
-#line 4525 "engines/director/lingo/lingo-gr.cpp"
+#line 4560 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 274: /* thedatetime: tTHE tSHORT tDATE  */
-#line 811 "engines/director/lingo/lingo-gr.y"
+  case 276: /* thedatetime: tTHE tSHORT tDATE  */
+#line 821 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new TheDateTimeNode(kTheShort, kTheDate); }
-#line 4531 "engines/director/lingo/lingo-gr.cpp"
+#line 4566 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 275: /* thedatetime: tTHE tSHORT tTIME  */
-#line 812 "engines/director/lingo/lingo-gr.y"
+  case 277: /* thedatetime: tTHE tSHORT tTIME  */
+#line 822 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new TheDateTimeNode(kTheShort, kTheTime); }
-#line 4537 "engines/director/lingo/lingo-gr.cpp"
+#line 4572 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 276: /* thenumberof: tTHE tNUMBER tOF tCHARS inof simpleexpr  */
-#line 816 "engines/director/lingo/lingo-gr.y"
+  case 278: /* thenumberof: tTHE tNUMBER tOF tCHARS inof simpleexpr  */
+#line 826 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheNumberOfNode(kNumberOfChars, (yyvsp[0].node)); }
-#line 4543 "engines/director/lingo/lingo-gr.cpp"
+#line 4578 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 277: /* thenumberof: tTHE tNUMBER tOF tWORDS inof simpleexpr  */
-#line 817 "engines/director/lingo/lingo-gr.y"
+  case 279: /* thenumberof: tTHE tNUMBER tOF tWORDS inof simpleexpr  */
+#line 827 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheNumberOfNode(kNumberOfWords, (yyvsp[0].node)); }
-#line 4549 "engines/director/lingo/lingo-gr.cpp"
+#line 4584 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 278: /* thenumberof: tTHE tNUMBER tOF tITEMS inof simpleexpr  */
-#line 818 "engines/director/lingo/lingo-gr.y"
+  case 280: /* thenumberof: tTHE tNUMBER tOF tITEMS inof simpleexpr  */
+#line 828 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheNumberOfNode(kNumberOfItems, (yyvsp[0].node)); }
-#line 4555 "engines/director/lingo/lingo-gr.cpp"
+#line 4590 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 279: /* thenumberof: tTHE tNUMBER tOF tLINES inof simpleexpr  */
-#line 819 "engines/director/lingo/lingo-gr.y"
+  case 281: /* thenumberof: tTHE tNUMBER tOF tLINES inof simpleexpr  */
+#line 829 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheNumberOfNode(kNumberOfLines, (yyvsp[0].node)); }
-#line 4561 "engines/director/lingo/lingo-gr.cpp"
+#line 4596 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 280: /* thenumberof: tTHE tNUMBER tOF tMENUITEMS inof menu  */
-#line 820 "engines/director/lingo/lingo-gr.y"
+  case 282: /* thenumberof: tTHE tNUMBER tOF tMENUITEMS inof menu  */
+#line 830 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheNumberOfNode(kNumberOfMenuItems, (yyvsp[0].node)); }
-#line 4567 "engines/director/lingo/lingo-gr.cpp"
+#line 4602 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 281: /* thenumberof: tTHE tNUMBER tOF tMENUS  */
-#line 821 "engines/director/lingo/lingo-gr.y"
+  case 283: /* thenumberof: tTHE tNUMBER tOF tMENUS  */
+#line 831 "engines/director/lingo/lingo-gr.y"
                                                                         { (yyval.node) = new TheNumberOfNode(kNumberOfMenus, nullptr); }
-#line 4573 "engines/director/lingo/lingo-gr.cpp"
+#line 4608 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 282: /* thenumberof: tTHE tNUMBER tOF tXTRAS  */
-#line 822 "engines/director/lingo/lingo-gr.y"
+  case 284: /* thenumberof: tTHE tNUMBER tOF tXTRAS  */
+#line 832 "engines/director/lingo/lingo-gr.y"
                                                                         { (yyval.node) = new TheNumberOfNode(kNumberOfXtras, nullptr); }
-#line 4579 "engines/director/lingo/lingo-gr.cpp"
+#line 4614 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 283: /* thenumberof: tTHE tNUMBER tOF tCASTLIBS  */
-#line 823 "engines/director/lingo/lingo-gr.y"
+  case 285: /* thenumberof: tTHE tNUMBER tOF tCASTLIBS  */
+#line 833 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new TheNumberOfNode(kNumberOfCastlibs, nullptr); }
-#line 4585 "engines/director/lingo/lingo-gr.cpp"
+#line 4620 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 286: /* writablethe: tTHE ID  */
-#line 828 "engines/director/lingo/lingo-gr.y"
+  case 288: /* writablethe: tTHE ID  */
+#line 838 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new TheNode((yyvsp[0].s)); }
-#line 4591 "engines/director/lingo/lingo-gr.cpp"
+#line 4626 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 287: /* writablethe: tTHE ID tOF writabletheobj  */
-#line 829 "engines/director/lingo/lingo-gr.y"
+  case 289: /* writablethe: tTHE ID tOF writabletheobj  */
+#line 839 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new TheOfNode((yyvsp[-2].s), (yyvsp[0].node)); }
-#line 4597 "engines/director/lingo/lingo-gr.cpp"
+#line 4632 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 289: /* writabletheobj: tMENU expr_noeq  */
-#line 833 "engines/director/lingo/lingo-gr.y"
+  case 291: /* writabletheobj: tMENU expr_noeq  */
+#line 843 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new MenuNode((yyvsp[0].node)); }
-#line 4603 "engines/director/lingo/lingo-gr.cpp"
+#line 4638 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 290: /* writabletheobj: tMENUITEM expr_noeq tOF tMENU expr_noeq  */
-#line 834 "engines/director/lingo/lingo-gr.y"
+  case 292: /* writabletheobj: tMENUITEM expr_noeq tOF tMENU expr_noeq  */
+#line 844 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new MenuItemNode((yyvsp[-3].node), (yyvsp[0].node)); }
-#line 4609 "engines/director/lingo/lingo-gr.cpp"
+#line 4644 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 291: /* writabletheobj: tSOUND expr_noeq  */
-#line 835 "engines/director/lingo/lingo-gr.y"
+  case 293: /* writabletheobj: tSOUND expr_noeq  */
+#line 845 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new SoundNode((yyvsp[0].node)); }
-#line 4615 "engines/director/lingo/lingo-gr.cpp"
+#line 4650 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 292: /* writabletheobj: tSPRITE expr_noeq  */
-#line 836 "engines/director/lingo/lingo-gr.y"
+  case 294: /* writabletheobj: tSPRITE expr_noeq  */
+#line 846 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new SpriteNode((yyvsp[0].node)); }
-#line 4621 "engines/director/lingo/lingo-gr.cpp"
+#line 4656 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 293: /* list: '[' exprlist ']'  */
-#line 839 "engines/director/lingo/lingo-gr.y"
+  case 295: /* list: '[' exprlist ']'  */
+#line 849 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new ListNode((yyvsp[-1].nodelist)); }
-#line 4627 "engines/director/lingo/lingo-gr.cpp"
+#line 4662 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 294: /* list: '[' ':' ']'  */
-#line 840 "engines/director/lingo/lingo-gr.y"
+  case 296: /* list: '[' ':' ']'  */
+#line 850 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new PropListNode(new NodeList); }
-#line 4633 "engines/director/lingo/lingo-gr.cpp"
+#line 4668 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 295: /* list: '[' proplist ']'  */
-#line 841 "engines/director/lingo/lingo-gr.y"
+  case 297: /* list: '[' proplist ']'  */
+#line 851 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new PropListNode((yyvsp[-1].nodelist)); }
-#line 4639 "engines/director/lingo/lingo-gr.cpp"
+#line 4674 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 296: /* proplist: proppair  */
-#line 847 "engines/director/lingo/lingo-gr.y"
+  case 298: /* proplist: proppair  */
+#line 857 "engines/director/lingo/lingo-gr.y"
                                                         {
 		NodeList *list = new NodeList;
 		list->push_back((yyvsp[0].node));
 		(yyval.nodelist) = list; }
-#line 4648 "engines/director/lingo/lingo-gr.cpp"
+#line 4683 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 297: /* proplist: proplist ',' proppair  */
-#line 851 "engines/director/lingo/lingo-gr.y"
+  case 299: /* proplist: proplist ',' proppair  */
+#line 861 "engines/director/lingo/lingo-gr.y"
                                                 {
 		(yyvsp[-2].nodelist)->push_back((yyvsp[0].node));
 		(yyval.nodelist) = (yyvsp[-2].nodelist); }
-#line 4656 "engines/director/lingo/lingo-gr.cpp"
+#line 4691 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 298: /* proplist: proplist ',' expr  */
-#line 854 "engines/director/lingo/lingo-gr.y"
+  case 300: /* proplist: proplist ',' expr  */
+#line 864 "engines/director/lingo/lingo-gr.y"
                                         {
 		(yyvsp[-2].nodelist)->push_back((yyvsp[0].node));
 		(yyval.nodelist) = (yyvsp[-2].nodelist); }
-#line 4664 "engines/director/lingo/lingo-gr.cpp"
+#line 4699 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 299: /* proppair: tSYMBOL ':' expr  */
-#line 859 "engines/director/lingo/lingo-gr.y"
+  case 301: /* proppair: tSYMBOL ':' expr  */
+#line 869 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new PropPairNode(new SymbolNode((yyvsp[-2].s)), (yyvsp[0].node)); }
-#line 4670 "engines/director/lingo/lingo-gr.cpp"
+#line 4705 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 300: /* proppair: ID ':' expr  */
-#line 860 "engines/director/lingo/lingo-gr.y"
+  case 302: /* proppair: ID ':' expr  */
+#line 870 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new PropPairNode(new SymbolNode((yyvsp[-2].s)), (yyvsp[0].node)); }
-#line 4676 "engines/director/lingo/lingo-gr.cpp"
+#line 4711 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 301: /* proppair: tSTRING ':' expr  */
-#line 861 "engines/director/lingo/lingo-gr.y"
+  case 303: /* proppair: tSTRING ':' expr  */
+#line 871 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new PropPairNode(new StringNode((yyvsp[-2].s)), (yyvsp[0].node)); }
-#line 4682 "engines/director/lingo/lingo-gr.cpp"
+#line 4717 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 302: /* proppair: tINT ':' expr  */
-#line 862 "engines/director/lingo/lingo-gr.y"
+  case 304: /* proppair: tINT ':' expr  */
+#line 872 "engines/director/lingo/lingo-gr.y"
                                     { (yyval.node) = new PropPairNode(new IntNode((yyvsp[-2].i)), (yyvsp[0].node)); }
-#line 4688 "engines/director/lingo/lingo-gr.cpp"
+#line 4723 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 303: /* proppair: tFLOAT ':' expr  */
-#line 863 "engines/director/lingo/lingo-gr.y"
+  case 305: /* proppair: tFLOAT ':' expr  */
+#line 873 "engines/director/lingo/lingo-gr.y"
                                     { (yyval.node) = new PropPairNode(new FloatNode((yyvsp[-2].f)), (yyvsp[0].node)); }
-#line 4694 "engines/director/lingo/lingo-gr.cpp"
+#line 4729 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 304: /* unarymath: '+' simpleexpr  */
-#line 866 "engines/director/lingo/lingo-gr.y"
+  case 306: /* unarymath: '+' simpleexpr  */
+#line 876 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = (yyvsp[0].node); }
-#line 4700 "engines/director/lingo/lingo-gr.cpp"
+#line 4735 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 305: /* unarymath: '-' simpleexpr  */
-#line 867 "engines/director/lingo/lingo-gr.y"
+  case 307: /* unarymath: '-' simpleexpr  */
+#line 877 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.node) = new UnaryOpNode(LC::c_negate, (yyvsp[0].node)); }
-#line 4706 "engines/director/lingo/lingo-gr.cpp"
+#line 4741 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 310: /* expr: expr '+' expr  */
-#line 877 "engines/director/lingo/lingo-gr.y"
+  case 312: /* expr: expr '+' expr  */
+#line 887 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_add, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4712 "engines/director/lingo/lingo-gr.cpp"
+#line 4747 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 311: /* expr: expr '-' expr  */
-#line 878 "engines/director/lingo/lingo-gr.y"
+  case 313: /* expr: expr '-' expr  */
+#line 888 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_sub, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4718 "engines/director/lingo/lingo-gr.cpp"
+#line 4753 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 312: /* expr: expr '*' expr  */
-#line 879 "engines/director/lingo/lingo-gr.y"
+  case 314: /* expr: expr '*' expr  */
+#line 889 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_mul, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4724 "engines/director/lingo/lingo-gr.cpp"
+#line 4759 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 313: /* expr: expr '/' expr  */
-#line 880 "engines/director/lingo/lingo-gr.y"
+  case 315: /* expr: expr '/' expr  */
+#line 890 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_div, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4730 "engines/director/lingo/lingo-gr.cpp"
+#line 4765 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 314: /* expr: expr tMOD expr  */
-#line 881 "engines/director/lingo/lingo-gr.y"
+  case 316: /* expr: expr tMOD expr  */
+#line 891 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_mod, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4736 "engines/director/lingo/lingo-gr.cpp"
+#line 4771 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 315: /* expr: expr '>' expr  */
-#line 882 "engines/director/lingo/lingo-gr.y"
+  case 317: /* expr: expr '>' expr  */
+#line 892 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_gt, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4742 "engines/director/lingo/lingo-gr.cpp"
+#line 4777 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 316: /* expr: expr '<' expr  */
-#line 883 "engines/director/lingo/lingo-gr.y"
+  case 318: /* expr: expr '<' expr  */
+#line 893 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_lt, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4748 "engines/director/lingo/lingo-gr.cpp"
+#line 4783 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 317: /* expr: expr tEQ expr  */
-#line 884 "engines/director/lingo/lingo-gr.y"
+  case 319: /* expr: expr tEQ expr  */
+#line 894 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_eq, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4754 "engines/director/lingo/lingo-gr.cpp"
+#line 4789 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 318: /* expr: expr tNEQ expr  */
-#line 885 "engines/director/lingo/lingo-gr.y"
+  case 320: /* expr: expr tNEQ expr  */
+#line 895 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_neq, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4760 "engines/director/lingo/lingo-gr.cpp"
+#line 4795 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 319: /* expr: expr tGE expr  */
-#line 886 "engines/director/lingo/lingo-gr.y"
+  case 321: /* expr: expr tGE expr  */
+#line 896 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_ge, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4766 "engines/director/lingo/lingo-gr.cpp"
+#line 4801 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 320: /* expr: expr tLE expr  */
-#line 887 "engines/director/lingo/lingo-gr.y"
+  case 322: /* expr: expr tLE expr  */
+#line 897 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_le, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4772 "engines/director/lingo/lingo-gr.cpp"
+#line 4807 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 321: /* expr: expr tAND expr  */
-#line 888 "engines/director/lingo/lingo-gr.y"
+  case 323: /* expr: expr tAND expr  */
+#line 898 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_and, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4778 "engines/director/lingo/lingo-gr.cpp"
+#line 4813 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 322: /* expr: expr tOR expr  */
-#line 889 "engines/director/lingo/lingo-gr.y"
+  case 324: /* expr: expr tOR expr  */
+#line 899 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_or, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4784 "engines/director/lingo/lingo-gr.cpp"
+#line 4819 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 323: /* expr: expr '&' expr  */
-#line 890 "engines/director/lingo/lingo-gr.y"
+  case 325: /* expr: expr '&' expr  */
+#line 900 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_ampersand, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4790 "engines/director/lingo/lingo-gr.cpp"
+#line 4825 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 324: /* expr: expr tCONCAT expr  */
-#line 891 "engines/director/lingo/lingo-gr.y"
+  case 326: /* expr: expr tCONCAT expr  */
+#line 901 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_concat, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4796 "engines/director/lingo/lingo-gr.cpp"
+#line 4831 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 325: /* expr: expr tCONTAINS expr  */
-#line 892 "engines/director/lingo/lingo-gr.y"
+  case 327: /* expr: expr tCONTAINS expr  */
+#line 902 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_contains, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4802 "engines/director/lingo/lingo-gr.cpp"
+#line 4837 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 326: /* expr: expr tSTARTS expr  */
-#line 893 "engines/director/lingo/lingo-gr.y"
+  case 328: /* expr: expr tSTARTS expr  */
+#line 903 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.node) = new BinaryOpNode(LC::c_starts, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4808 "engines/director/lingo/lingo-gr.cpp"
+#line 4843 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 329: /* expr_nounarymath: expr_nounarymath '+' expr  */
-#line 902 "engines/director/lingo/lingo-gr.y"
+  case 331: /* expr_nounarymath: expr_nounarymath '+' expr  */
+#line 912 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_add, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4814 "engines/director/lingo/lingo-gr.cpp"
+#line 4849 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 330: /* expr_nounarymath: expr_nounarymath '-' expr  */
-#line 903 "engines/director/lingo/lingo-gr.y"
+  case 332: /* expr_nounarymath: expr_nounarymath '-' expr  */
+#line 913 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_sub, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4820 "engines/director/lingo/lingo-gr.cpp"
+#line 4855 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 331: /* expr_nounarymath: expr_nounarymath '*' expr  */
-#line 904 "engines/director/lingo/lingo-gr.y"
+  case 333: /* expr_nounarymath: expr_nounarymath '*' expr  */
+#line 914 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_mul, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4826 "engines/director/lingo/lingo-gr.cpp"
+#line 4861 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 332: /* expr_nounarymath: expr_nounarymath '/' expr  */
-#line 905 "engines/director/lingo/lingo-gr.y"
+  case 334: /* expr_nounarymath: expr_nounarymath '/' expr  */
+#line 915 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_div, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4832 "engines/director/lingo/lingo-gr.cpp"
+#line 4867 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 333: /* expr_nounarymath: expr_nounarymath tMOD expr  */
-#line 906 "engines/director/lingo/lingo-gr.y"
+  case 335: /* expr_nounarymath: expr_nounarymath tMOD expr  */
+#line 916 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_mod, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4838 "engines/director/lingo/lingo-gr.cpp"
+#line 4873 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 334: /* expr_nounarymath: expr_nounarymath '>' expr  */
-#line 907 "engines/director/lingo/lingo-gr.y"
+  case 336: /* expr_nounarymath: expr_nounarymath '>' expr  */
+#line 917 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_gt, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4844 "engines/director/lingo/lingo-gr.cpp"
+#line 4879 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 335: /* expr_nounarymath: expr_nounarymath '<' expr  */
-#line 908 "engines/director/lingo/lingo-gr.y"
+  case 337: /* expr_nounarymath: expr_nounarymath '<' expr  */
+#line 918 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_lt, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4850 "engines/director/lingo/lingo-gr.cpp"
+#line 4885 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 336: /* expr_nounarymath: expr_nounarymath tEQ expr  */
-#line 909 "engines/director/lingo/lingo-gr.y"
+  case 338: /* expr_nounarymath: expr_nounarymath tEQ expr  */
+#line 919 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_eq, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4856 "engines/director/lingo/lingo-gr.cpp"
+#line 4891 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 337: /* expr_nounarymath: expr_nounarymath tNEQ expr  */
-#line 910 "engines/director/lingo/lingo-gr.y"
+  case 339: /* expr_nounarymath: expr_nounarymath tNEQ expr  */
+#line 920 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_neq, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4862 "engines/director/lingo/lingo-gr.cpp"
+#line 4897 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 338: /* expr_nounarymath: expr_nounarymath tGE expr  */
-#line 911 "engines/director/lingo/lingo-gr.y"
+  case 340: /* expr_nounarymath: expr_nounarymath tGE expr  */
+#line 921 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_ge, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4868 "engines/director/lingo/lingo-gr.cpp"
+#line 4903 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 339: /* expr_nounarymath: expr_nounarymath tLE expr  */
-#line 912 "engines/director/lingo/lingo-gr.y"
+  case 341: /* expr_nounarymath: expr_nounarymath tLE expr  */
+#line 922 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_le, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4874 "engines/director/lingo/lingo-gr.cpp"
+#line 4909 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 340: /* expr_nounarymath: expr_nounarymath tAND expr  */
-#line 913 "engines/director/lingo/lingo-gr.y"
+  case 342: /* expr_nounarymath: expr_nounarymath tAND expr  */
+#line 923 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_and, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4880 "engines/director/lingo/lingo-gr.cpp"
+#line 4915 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 341: /* expr_nounarymath: expr_nounarymath tOR expr  */
-#line 914 "engines/director/lingo/lingo-gr.y"
+  case 343: /* expr_nounarymath: expr_nounarymath tOR expr  */
+#line 924 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_or, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4886 "engines/director/lingo/lingo-gr.cpp"
+#line 4921 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 342: /* expr_nounarymath: expr_nounarymath '&' expr  */
-#line 915 "engines/director/lingo/lingo-gr.y"
+  case 344: /* expr_nounarymath: expr_nounarymath '&' expr  */
+#line 925 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_ampersand, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4892 "engines/director/lingo/lingo-gr.cpp"
+#line 4927 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 343: /* expr_nounarymath: expr_nounarymath tCONCAT expr  */
-#line 916 "engines/director/lingo/lingo-gr.y"
+  case 345: /* expr_nounarymath: expr_nounarymath tCONCAT expr  */
+#line 926 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new BinaryOpNode(LC::c_concat, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4898 "engines/director/lingo/lingo-gr.cpp"
+#line 4933 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 344: /* expr_nounarymath: expr_nounarymath tCONTAINS expr  */
-#line 917 "engines/director/lingo/lingo-gr.y"
+  case 346: /* expr_nounarymath: expr_nounarymath tCONTAINS expr  */
+#line 927 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new BinaryOpNode(LC::c_contains, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4904 "engines/director/lingo/lingo-gr.cpp"
+#line 4939 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 345: /* expr_nounarymath: expr_nounarymath tSTARTS expr  */
-#line 918 "engines/director/lingo/lingo-gr.y"
+  case 347: /* expr_nounarymath: expr_nounarymath tSTARTS expr  */
+#line 928 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new BinaryOpNode(LC::c_starts, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4910 "engines/director/lingo/lingo-gr.cpp"
+#line 4945 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 348: /* expr_noeq: expr_noeq '+' expr_noeq  */
-#line 923 "engines/director/lingo/lingo-gr.y"
+  case 350: /* expr_noeq: expr_noeq '+' expr_noeq  */
+#line 933 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_add, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4916 "engines/director/lingo/lingo-gr.cpp"
+#line 4951 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 349: /* expr_noeq: expr_noeq '-' expr_noeq  */
-#line 924 "engines/director/lingo/lingo-gr.y"
+  case 351: /* expr_noeq: expr_noeq '-' expr_noeq  */
+#line 934 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_sub, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4922 "engines/director/lingo/lingo-gr.cpp"
+#line 4957 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 350: /* expr_noeq: expr_noeq '*' expr_noeq  */
-#line 925 "engines/director/lingo/lingo-gr.y"
+  case 352: /* expr_noeq: expr_noeq '*' expr_noeq  */
+#line 935 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_mul, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4928 "engines/director/lingo/lingo-gr.cpp"
+#line 4963 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 351: /* expr_noeq: expr_noeq '/' expr_noeq  */
-#line 926 "engines/director/lingo/lingo-gr.y"
+  case 353: /* expr_noeq: expr_noeq '/' expr_noeq  */
+#line 936 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_div, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4934 "engines/director/lingo/lingo-gr.cpp"
+#line 4969 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 352: /* expr_noeq: expr_noeq tMOD expr_noeq  */
-#line 927 "engines/director/lingo/lingo-gr.y"
+  case 354: /* expr_noeq: expr_noeq tMOD expr_noeq  */
+#line 937 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_mod, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4940 "engines/director/lingo/lingo-gr.cpp"
+#line 4975 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 353: /* expr_noeq: expr_noeq '>' expr_noeq  */
-#line 928 "engines/director/lingo/lingo-gr.y"
+  case 355: /* expr_noeq: expr_noeq '>' expr_noeq  */
+#line 938 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_gt, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4946 "engines/director/lingo/lingo-gr.cpp"
+#line 4981 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 354: /* expr_noeq: expr_noeq '<' expr_noeq  */
-#line 929 "engines/director/lingo/lingo-gr.y"
+  case 356: /* expr_noeq: expr_noeq '<' expr_noeq  */
+#line 939 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_lt, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4952 "engines/director/lingo/lingo-gr.cpp"
+#line 4987 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 355: /* expr_noeq: expr_noeq tNEQ expr_noeq  */
-#line 930 "engines/director/lingo/lingo-gr.y"
+  case 357: /* expr_noeq: expr_noeq tNEQ expr_noeq  */
+#line 940 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_neq, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4958 "engines/director/lingo/lingo-gr.cpp"
+#line 4993 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 356: /* expr_noeq: expr_noeq tGE expr_noeq  */
-#line 931 "engines/director/lingo/lingo-gr.y"
+  case 358: /* expr_noeq: expr_noeq tGE expr_noeq  */
+#line 941 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_ge, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4964 "engines/director/lingo/lingo-gr.cpp"
+#line 4999 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 357: /* expr_noeq: expr_noeq tLE expr_noeq  */
-#line 932 "engines/director/lingo/lingo-gr.y"
+  case 359: /* expr_noeq: expr_noeq tLE expr_noeq  */
+#line 942 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_le, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4970 "engines/director/lingo/lingo-gr.cpp"
+#line 5005 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 358: /* expr_noeq: expr_noeq tAND expr_noeq  */
-#line 933 "engines/director/lingo/lingo-gr.y"
+  case 360: /* expr_noeq: expr_noeq tAND expr_noeq  */
+#line 943 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_and, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4976 "engines/director/lingo/lingo-gr.cpp"
+#line 5011 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 359: /* expr_noeq: expr_noeq tOR expr_noeq  */
-#line 934 "engines/director/lingo/lingo-gr.y"
+  case 361: /* expr_noeq: expr_noeq tOR expr_noeq  */
+#line 944 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_or, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4982 "engines/director/lingo/lingo-gr.cpp"
+#line 5017 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 360: /* expr_noeq: expr_noeq '&' expr_noeq  */
-#line 935 "engines/director/lingo/lingo-gr.y"
+  case 362: /* expr_noeq: expr_noeq '&' expr_noeq  */
+#line 945 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_ampersand, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4988 "engines/director/lingo/lingo-gr.cpp"
+#line 5023 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 361: /* expr_noeq: expr_noeq tCONCAT expr_noeq  */
-#line 936 "engines/director/lingo/lingo-gr.y"
+  case 363: /* expr_noeq: expr_noeq tCONCAT expr_noeq  */
+#line 946 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_concat, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 4994 "engines/director/lingo/lingo-gr.cpp"
+#line 5029 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 362: /* expr_noeq: expr_noeq tCONTAINS expr_noeq  */
-#line 937 "engines/director/lingo/lingo-gr.y"
+  case 364: /* expr_noeq: expr_noeq tCONTAINS expr_noeq  */
+#line 947 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new BinaryOpNode(LC::c_contains, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 5000 "engines/director/lingo/lingo-gr.cpp"
+#line 5035 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 363: /* expr_noeq: expr_noeq tSTARTS expr_noeq  */
-#line 938 "engines/director/lingo/lingo-gr.y"
+  case 365: /* expr_noeq: expr_noeq tSTARTS expr_noeq  */
+#line 948 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new BinaryOpNode(LC::c_starts, (yyvsp[-2].node), (yyvsp[0].node)); }
-#line 5006 "engines/director/lingo/lingo-gr.cpp"
+#line 5041 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 364: /* sprite: tSPRITE expr tINTERSECTS simpleexpr  */
-#line 941 "engines/director/lingo/lingo-gr.y"
+  case 366: /* sprite: tSPRITE expr tINTERSECTS simpleexpr  */
+#line 951 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.node) = new IntersectsNode((yyvsp[-2].node), (yyvsp[0].node)); }
-#line 5012 "engines/director/lingo/lingo-gr.cpp"
+#line 5047 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 365: /* sprite: tSPRITE expr tWITHIN simpleexpr  */
-#line 942 "engines/director/lingo/lingo-gr.y"
+  case 367: /* sprite: tSPRITE expr tWITHIN simpleexpr  */
+#line 952 "engines/director/lingo/lingo-gr.y"
                                                         { (yyval.node) = new WithinNode((yyvsp[-2].node), (yyvsp[0].node)); }
-#line 5018 "engines/director/lingo/lingo-gr.cpp"
+#line 5053 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 366: /* exprlist: %empty  */
-#line 945 "engines/director/lingo/lingo-gr.y"
+  case 368: /* exprlist: %empty  */
+#line 955 "engines/director/lingo/lingo-gr.y"
                                                                 { (yyval.nodelist) = new NodeList; }
-#line 5024 "engines/director/lingo/lingo-gr.cpp"
+#line 5059 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 368: /* nonemptyexprlist: expr  */
-#line 949 "engines/director/lingo/lingo-gr.y"
+  case 370: /* nonemptyexprlist: expr  */
+#line 959 "engines/director/lingo/lingo-gr.y"
                                                         {
 		NodeList *list = new NodeList;
 		list->push_back((yyvsp[0].node));
 		(yyval.nodelist) = list; }
-#line 5033 "engines/director/lingo/lingo-gr.cpp"
+#line 5068 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 369: /* nonemptyexprlist: nonemptyexprlist ',' expr  */
-#line 953 "engines/director/lingo/lingo-gr.y"
+  case 371: /* nonemptyexprlist: nonemptyexprlist ',' expr  */
+#line 963 "engines/director/lingo/lingo-gr.y"
                                                 {
 		(yyvsp[-2].nodelist)->push_back((yyvsp[0].node));
 		(yyval.nodelist) = (yyvsp[-2].nodelist); }
-#line 5041 "engines/director/lingo/lingo-gr.cpp"
+#line 5076 "engines/director/lingo/lingo-gr.cpp"
     break;
 
 
-#line 5045 "engines/director/lingo/lingo-gr.cpp"
+#line 5080 "engines/director/lingo/lingo-gr.cpp"
 
       default: break;
     }
@@ -5239,7 +5274,7 @@ yyreturnlab:
   return yyresult;
 }
 
-#line 958 "engines/director/lingo/lingo-gr.y"
+#line 968 "engines/director/lingo/lingo-gr.y"
 
 
 int yyreport_syntax_error(const yypcontext_t *ctx) {
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index 3c09c551fd0..8db5852a1a4 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -733,7 +733,17 @@ varorthe: var
 	;
 
 chunk: tFIELD refargs		{ $$ = new FuncNode(new Common::String("field"), $refargs); }
+	| tCAST simpleexpr[m] tOF tCASTLIB simpleexpr[l] {
+		NodeList *args = new NodeList;
+		args->push_back($m);
+		args->push_back($l);
+		$$ = new FuncNode(new Common::String("cast"), args);	}
 	| tCAST refargs			{ $$ = new FuncNode(new Common::String("cast"), $refargs); }
+	| tMEMBER simpleexpr[m] tOF tCASTLIB simpleexpr[l] {
+		NodeList *args = new NodeList;
+		args->push_back($m);
+		args->push_back($l);
+		$$ = new FuncNode(new Common::String("member"), args);	}
 	| tMEMBER refargs		{ $$ = new FuncNode(new Common::String("member"), $refargs); }
 	| tCASTLIB refargs		{ $$ = new FuncNode(new Common::String("castLib"), $refargs); }
 	| tCHAR expr[idx] tOF simpleexpr[src]	{


Commit: 993579d251d7ee982ff8473c260f9033e2a64270
    https://github.com/scummvm/scummvm/commit/993579d251d7ee982ff8473c260f9033e2a64270
Author: Scott Percival (code at moral.net.au)
Date: 2026-07-25T13:26:51+02:00

Commit Message:
DIRECTOR: Refresh sprite cast pointers after a media copy

Fixes choosing body parts in Math Heads.

Changed paths:
    engines/director/lingo/lingo-the.cpp


diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 987872e762d..0441a8fd762 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -2231,6 +2231,8 @@ void Lingo::setTheCast(Datum &id1, int field, Datum &d) {
 		CastMember *replacement = (CastMember *)d.u.obj;
 		Cast *cast = movie->getCast(id);
 		cast->duplicateCastMember(replacement, nullptr, id.member);
+		Score *score = movie->getScore();
+		score->refreshPointersForCastMemberID(id);
 		return;
 	}
 
@@ -2749,6 +2751,8 @@ void Lingo::setObjectProp(Datum &obj, Common::String &propName, Datum &val) {
 			CastMember *replacement = (CastMember *)val.u.obj;
 			Cast *cast = movie->getCast(id);
 			cast->duplicateCastMember(replacement, nullptr, id.member);
+			Score *score = movie->getScore();
+			score->refreshPointersForCastMemberID(id);
 			return;
 		}
 


Commit: 139df7adb4f388dda92df79a6a6ba37c8dabddc3
    https://github.com/scummvm/scummvm/commit/139df7adb4f388dda92df79a6a6ba37c8dabddc3
Author: Scott Percival (code at moral.net.au)
Date: 2026-07-25T13:26:51+02:00

Commit Message:
DIRECTOR: Print castLib in debug draw overlay

Changed paths:
    engines/director/window.cpp


diff --git a/engines/director/window.cpp b/engines/director/window.cpp
index e9a623b2f4a..b9964b79489 100644
--- a/engines/director/window.cpp
+++ b/engines/director/window.cpp
@@ -168,8 +168,8 @@ void Window::drawChannelBox(Director::Movie *currentMovie, Graphics::ManagedSurf
 		Common::Rect bbox = channel->getBbox();
 		blitTo->frameRect(bbox, g_director->_wm->_colorWhite);
 
-		font->drawString(blitTo, Common::String::format("m: %d, ch: %d, fr: %d", channel->_sprite->_castId.member, selectedChannel, channel->_filmLoopFrame ? channel->_filmLoopFrame : channel->_movieTime), bbox.left + 3, bbox.top + 3, 128, g_director->_wm->_colorBlack);
-		font->drawString(blitTo, Common::String::format("m: %d, ch: %d, fr: %d", channel->_sprite->_castId.member, selectedChannel, channel->_filmLoopFrame ? channel->_filmLoopFrame : channel->_movieTime), bbox.left + 2, bbox.top + 2, 128, g_director->_wm->_colorWhite);
+		font->drawString(blitTo, Common::String::format("m: %d, l: %d, ch: %d, fr: %d", channel->_sprite->_castId.member, channel->_sprite->_castId.castLib, selectedChannel, channel->_filmLoopFrame ? channel->_filmLoopFrame : channel->_movieTime), bbox.left + 3, bbox.top + 3, 128, g_director->_wm->_colorBlack);
+		font->drawString(blitTo, Common::String::format("m: %d, l: %d, ch: %d, fr: %d", channel->_sprite->_castId.member, channel->_sprite->_castId.castLib, selectedChannel, channel->_filmLoopFrame ? channel->_filmLoopFrame : channel->_movieTime), bbox.left + 2, bbox.top + 2, 128, g_director->_wm->_colorWhite);
 	}
 }
 
@@ -313,8 +313,8 @@ bool Window::render(bool forceRedraw, Graphics::ManagedSurface *blitTo) {
 				Common::Rect bbox = channel->getBbox();
 				blitTo->frameRect(bbox, g_director->_wm->_colorWhite);
 
-				font->drawString(blitTo, Common::String::format("m: %d, ch: %d, fr: %d", channel->_sprite->_castId.member, i, channel->_filmLoopFrame ? channel->_filmLoopFrame : channel->_movieTime), bbox.left + 3, bbox.top + 3, 128, g_director->_wm->_colorBlack);
-				font->drawString(blitTo, Common::String::format("m: %d, ch: %d, fr: %d", channel->_sprite->_castId.member, i, channel->_filmLoopFrame ? channel->_filmLoopFrame : channel->_movieTime), bbox.left + 2, bbox.top + 2, 128, g_director->_wm->_colorWhite);
+				font->drawString(blitTo, Common::String::format("m: %d, l: %d, ch: %d, fr: %d", channel->_sprite->_castId.member, channel->_sprite->_castId.castLib, i, channel->_filmLoopFrame ? channel->_filmLoopFrame : channel->_movieTime), bbox.left + 3, bbox.top + 3, 128, g_director->_wm->_colorBlack);
+				font->drawString(blitTo, Common::String::format("m: %d, l: %d, ch: %d, fr: %d", channel->_sprite->_castId.member, channel->_sprite->_castId.castLib, i, channel->_filmLoopFrame ? channel->_filmLoopFrame : channel->_movieTime), bbox.left + 2, bbox.top + 2, 128, g_director->_wm->_colorWhite);
 			}
 		}
 	}


Commit: fbbff6d558fa941180cc89554cc4ad4a442b55a4
    https://github.com/scummvm/scummvm/commit/fbbff6d558fa941180cc89554cc4ad4a442b55a4
Author: Scott Percival (code at moral.net.au)
Date: 2026-07-25T13:26:51+02:00

Commit Message:
DIRECTOR: LINGO: Improve accuracy of b_member

Fixes several cases in Math Heads, which runs the gamut of calling
conventions (calling cast(member, castLib), calling cast("name"),
calling cast(multiplexID, VOID), calling cast(multiplexID, castLib)...

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo.cpp


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 84afdaf86f7..d29f2576dad 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -245,7 +245,7 @@ static const BuiltinProto builtins[] = {
 	{ "true",			LB::b_true,			0, 0, 200, KBLTIN },	// D2 k
 	{ "version",		LB::b_version,		0, 0, 300, KBLTIN },	//		D3 k
 	// References
-	{ "cast",			LB::b_cast,			1, 1, 400, FBLTIN },	//			D4 f
+	{ "cast",			LB::b_member,			1, 2, 400, FBLTIN },	//			D4 f
 	{ "castLib",		LB::b_castLib,		1, 1, 500, FBLTIN },	//				D5 f
 	{ "member",			LB::b_member,		1, 2, 500, FBLTIN },	//				D5 f
 	{ "script",			LB::b_script,		1, 2, 400, FBLTIN },	//			D4 f
@@ -4193,13 +4193,6 @@ void LB::b_version(int nargs) {
 ///////////////////
 // References
 ///////////////////
-void LB::b_cast(int nargs) {
-	Datum d = g_lingo->pop();
-	Datum res = d.asMemberID();
-	res.type = CASTREF;
-	g_lingo->push(res);
-}
-
 void LB::b_castLib(int nargs) {
 	Datum d = g_lingo->pop();
 	Datum res(0);
@@ -4219,6 +4212,9 @@ void LB::b_member(int nargs) {
 		Datum member = g_lingo->pop();
 		res = member.asMemberID();
 	} else if (nargs == 2) {
+		if (g_director->getVersion() < 500) {
+			warning("b_member: included a castLib argument! These aren't supposed to exist until D5");
+		}
 		Datum library = g_lingo->pop();
 		Datum member = g_lingo->pop();
 		res = g_lingo->toCastMemberID(member, library);
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 9c4773c3e77..a2c4928794a 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -1970,23 +1970,35 @@ CastMemberID Lingo::resolveCastMember(const Datum &memberID, const Datum &castLi
 		return CastMemberID(-1, castLib.asInt());
 	}
 
-	switch (memberID.type) {
+	int libID = -1;
+	switch (castLib.type) {
 	case STRING:
-		return movie->getCastMemberIDByNameAndType(memberID.asString(), castLib.asInt(), type);
+		libID = movie->getCastLibIDByName(castLib.asString());
 		break;
 	case INT:
 	case FLOAT:
-		if (g_director->getVersion() >= 500 && memberID.asInt() > 0x20000) {
+	case VOID:
+		libID = castLib.asInt();
+		break;
+	default:
+		error("Lingo::resolveCastMember: unsupported castLib type %s", castLib.type2str());
+		break;
+	}
+
+	switch (memberID.type) {
+	case STRING:
+		return movie->getCastMemberIDByNameAndType(memberID.asString(), libID, type);
+		break;
+	case INT:
+	case FLOAT: {
 			// Composite ID
-			return CastMemberID().fromMultiplex(memberID.asInt());
-		}
-		if (castLib.asInt() == 0) {
-			// When specifying 0 as the castlib, D5 will assume this
-			// means the default (i.e. first) cast library. It will not
-			// try other libraries for matches if the member is a number.
-			return CastMemberID(memberID.asInt(), DEFAULT_CAST_LIB);
-		} else {
-			return CastMemberID(memberID.asInt(), castLib.asInt());
+			CastMemberID multi = CastMemberID().fromMultiplex(memberID.asInt());
+			// All numbers up to 0x20000 count as castLib 1, aka DEFAULT_CAST_LIB
+			// If the castLib is defined, then use the masked-off member number but
+			// override the castLib.
+			if (libID > 0)
+				multi.castLib = libID;
+			return multi;
 		}
 		break;
 	case VOID:


Commit: 2d32d63f5e0b349b6c67bd2e36100432688e4ebf
    https://github.com/scummvm/scummvm/commit/2d32d63f5e0b349b6c67bd2e36100432688e4ebf
Author: Scott Percival (code at moral.net.au)
Date: 2026-07-25T13:26:51+02:00

Commit Message:
DIRECTOR: LINGO: Remove special-case handling in b_value

This rolls back a chunk of a7d6abbcdc39e5ede5e2fa3b868a92d468ec6f14;
we shouldn't need it because kLPPTrimGarbage does a better job at
isolating expressions with garbage on the end. The added test cases
all pass without it.

Fixes Face The Music minigame in Math Heads when the questions are about
equality; the game precomputes boolean expressions such as value("0.500=0.500").

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/tests/value.lingo


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index d29f2576dad..d6923bfced8 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -832,70 +832,6 @@ void LB::b_value(int nargs) {
 		return;
 	}
 
-	bool maybeExpression = false;
-
-	// First, let's check that it is a number
-	if (expr[0] == '-' || expr[0] == '+' || (expr[0] >= '0' && expr[0] <= '9') ||
-			(expr[0] == '.' && expr.size() > 1 && expr[1] >= '0' && expr[1] <= '9')) {
-		char *endPtr = nullptr;
-		double result = strtof(expr.c_str(), &endPtr);
-
-		// Maybe it is part of an expression?
-		if (endPtr && *endPtr) {
-			while (*endPtr && Common::isSpace(*endPtr))
-				endPtr++;
-
-			if (strchr("-+*/%^:,()><&|", *endPtr) != NULL) {
-				maybeExpression = true;
-			}
-		}
-
-		if (!maybeExpression) {
-			if (result < INT_MAX && floor(result) == result) {
-				g_lingo->push(Datum((int)result));
-			} else {
-				g_lingo->push(Datum(result));
-			}
-			return;
-		}
-	}
-
-	// Or maybe it is a string with quotes around it?
-	if (expr.size() >= 2 && expr[0] == '"') {
-		// scan for the end quote, ignoring escaped quotes
-		bool escaped = false;
-		size_t i;
-		for (i = 1; i < expr.size(); i++) {
-			if (expr[i] == '"' && !escaped) {
-				break;
-			}
-			escaped = (expr[i] == '\\' && !escaped);
-		}
-		if (i == expr.size()) {
-			// No closing quote found, push void
-			g_lingo->pushVoid();
-			return;
-		}
-
-		if (i + 1 < expr.size()) {
-			// There are extra characters after the closing quote, this is not a simple string
-			size_t j = i + 1;
-			while (expr[j] && Common::isSpace(expr[j]))
-				j++;
-
-			if (strchr("&", expr[j]) != NULL) {
-				maybeExpression = true;
-			}
-		}
-
-		if (!maybeExpression) {
-			g_lingo->push(expr.substr(1, i - 1));
-			return;
-		}
-	}
-
-	// There is no simple way, feed it to the Lingo parser
-
 	Common::String code = "return " + expr;
 	// Compile the code to an anonymous function and call it
 	ScriptContext *sc = g_lingo->_compiler->compileAnonymous(code, kLPPTrimGarbage);
diff --git a/engines/director/lingo/tests/value.lingo b/engines/director/lingo/tests/value.lingo
index a9b9fcc60fb..89734bdfba3 100644
--- a/engines/director/lingo/tests/value.lingo
+++ b/engines/director/lingo/tests/value.lingo
@@ -35,6 +35,12 @@ scummvmAssertEqual("Void, value(test))
 set test = QUOTE & "abra" & QUOTE & " & " & QUOTE & "kadabra" & QUOTE
 scummvmAssertEqual("abrakadabra", value(test))
 
+-- equality operator
+scummvmAssertEqual(1, value("5=5"))
+scummvmAssertEqual(0, value("5=2"))
+scummvmAssertEqual(1, value("0.500=0.500"))
+scummvmAssertEqual(0, value("0.500=2.500"))
+
 -- the kicker; you are allowed to have garbage on the end!!!
 -- if it hits a token it doesn't understand, the parser should try again but stopping just before that token.
 scummvmNoFatalError(true)


Commit: 361a2cbb0399365ed03d6a66ee73a019608f6770
    https://github.com/scummvm/scummvm/commit/361a2cbb0399365ed03d6a66ee73a019608f6770
Author: Scott Percival (code at moral.net.au)
Date: 2026-07-25T13:26:51+02:00

Commit Message:
DIRECTOR: Add quirks for noir

Changed paths:
    engines/director/game-quirks.cpp


diff --git a/engines/director/game-quirks.cpp b/engines/director/game-quirks.cpp
index 6d06750ccb1..413105d5a9e 100644
--- a/engines/director/game-quirks.cpp
+++ b/engines/director/game-quirks.cpp
@@ -163,6 +163,9 @@ struct CachedFile {
 	// Mission Code: Millennium expects the installer to have added an empty save file.
 	{"mcmillennium", Common::kPlatformWindows, "pc/players", (const byte *)"", 0},
 
+	// Noir has a config file which it expects to contain information about the system paths.
+	{"noir", Common::kPlatformWindows, "NOIRCNFG.TXT", (const byte *)"1 C:\\ C:\\", -1},
+
 	// Pingu: A Barrel of Fun! expects a text file containing system paths to be written by InstallShield,
 	// and the placeholder text file in the archive will not work.
 	{ "pingu1", Common::kPlatformWindows, "PINGUDRV.PNG", (const byte *)"C:\\\r\nC:\\\r\nD:\\\r\n", -1},
@@ -345,6 +348,9 @@ const struct Quirk {
 	{ "staytooned", Common::kPlatformWindows, &quirkForceFileIOXObj },
 	{ "staytooned", Common::kPlatformMacintosh, &quirkForceFileIOXObj },
 
+	// Noir is D5, but expects the XObject version to be used.
+	{ "noir", Common::kPlatformWindows, &quirkForceFileIOXObj },
+
 	// Ingenious bundles both the Xtra and XObject editions in the Xtra folder, but expects the XObject
 	// version to be available.
 	{ "ingenious", Common::kPlatformWindows, &quirkForceFileIOXObj },


Commit: 03e99900a8ff2d088f781d3ef9b8a0a8e083b1df
    https://github.com/scummvm/scummvm/commit/03e99900a8ff2d088f781d3ef9b8a0a8e083b1df
Author: Scott Percival (code at moral.net.au)
Date: 2026-07-25T13:26:51+02:00

Commit Message:
DIRECTOR: LINGO: Make menu callbacks run as the stage

Fixes dropdown menu in Noir: A Shadowy Thriller.

Changed paths:
    engines/director/lingo/lingo-builtins.cpp
    engines/director/lingo/lingo-events.cpp


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index d6923bfced8..23ff5e6c365 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -2808,7 +2808,7 @@ void LB::b_importFileInto(int nargs) {
 }
 
 void menuCommandsCallback(int action, Common::String &text, void *data) {
-	g_director->getCurrentMovie()->queueInputEvent(kEventMenuCallback, action);
+	g_director->getStage()->getCurrentMovie()->queueInputEvent(kEventMenuCallback, action);
 }
 
 void LB::b_installMenu(int nargs) {
@@ -2821,7 +2821,10 @@ void LB::b_installMenu(int nargs) {
 		g_director->_wm->removeMenu();
 		return;
 	}
-	Movie *movie = g_director->getCurrentMovie();
+	// FIXME: it might be possible for other windows than the stage to create and use menus.
+	// This would probably mean reworking MacWindowManager to have a per-window menu model.
+	Window *window = g_director->getStage();
+	Movie *movie = window->getCurrentMovie();
 	CastMember *member = movie->getCastMember(memberID);
 	if (!member) {
 		g_lingo->lingoError("installMenu: Unknown %s", memberID.asString().c_str());
@@ -2856,10 +2859,8 @@ void LB::b_installMenu(int nargs) {
 	char CODE_SEPARATOR_CHAR = '\xC5';
 	// FIXME: For some reason there are games which use º (Mac) or ¼ (Win) and it works too?
 	char CODE_SEPARATOR_CHAR_2 = '\xBC';
-	if (g_director->getVersion() >= 500) {
-		// D5 changed this to be the pipe | character, the same in Windows and Mac.
-		CODE_SEPARATOR_CHAR = '\x7C';
-	}
+	// D5 changed this to be the pipe | character, the same in Windows and Mac. ≈ also works.
+	char CODE_SEPARATOR_CHAR_3 = (g_director->getVersion() >= 500) ? '\x7C' : '\xC5';
 	// Continuation character is 0xac to denote a line running over.
 	// For Mac, this is ¨. For Windows, this is ¬.
 	const char CONTINUATION_CHAR = '\xAC';
@@ -2923,6 +2924,8 @@ void LB::b_installMenu(int nargs) {
 		size_t sepOffset = line.find(CODE_SEPARATOR_CHAR);
 		if (sepOffset == Common::String::npos)
 			sepOffset = line.find(CODE_SEPARATOR_CHAR_2);
+		if (sepOffset == Common::String::npos)
+			sepOffset = line.find(CODE_SEPARATOR_CHAR_3);
 
 		Common::String text;
 
@@ -2945,6 +2948,7 @@ void LB::b_installMenu(int nargs) {
 					commandId++;
 				}
 				mainArchive->replaceCode(command.decode(Common::kMacRoman), kEventScript, commandId);
+				debugC(3, kDebugLoading, "LB::b_installMenu(): %s -> %s (EventScript %d)", text.c_str(), command.c_str(), commandId);
 				submenuText += Common::String::format("[%d];", commandId);
 			} else {
 				submenuText += ';';
diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index e005916a8fd..c348263e8f3 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -562,6 +562,7 @@ void Movie::queueEvent(Common::Queue<LingoEvent> &queue, LEvent event, int targe
 		case kEventKeyUp:
 		case kEventKeyDown:
 		case kEventTimeout:
+		case kEventMenuCallback:
 			break;
 
 		default:


Commit: 5b6251f716e7eb841585027ac1f6550e5175b7df
    https://github.com/scummvm/scummvm/commit/5b6251f716e7eb841585027ac1f6550e5175b7df
Author: Scott Percival (code at moral.net.au)
Date: 2026-07-25T13:26:51+02:00

Commit Message:
DIRECTOR: Fix disasm command to support multiple casts

Changed paths:
    engines/director/debugger.cpp
    engines/director/debugger.h


diff --git a/engines/director/debugger.cpp b/engines/director/debugger.cpp
index a7d346ac083..159ea2c7a54 100644
--- a/engines/director/debugger.cpp
+++ b/engines/director/debugger.cpp
@@ -539,63 +539,103 @@ bool Debugger::cmdBacktrace(int argc, const char **argv) {
 	return true;
 }
 
+
+void Debugger::disasmAllCast(Cast *cast) {
+	if (cast && cast->_lingoArchive) {
+		for (int i = 0; i <= kMaxScriptType; i++) {
+			debugPrintf("  %s:\n", scriptType2str((ScriptType)i));
+			if (cast->_lingoArchive->scriptContexts[i].size() == 0)
+				debugPrintf("    [empty]\n");
+
+			for (auto &it : cast->_lingoArchive->scriptContexts[i]) {
+				for (auto &jt : it._value->_functionHandlers) {
+					debugPrintf("%s\n", g_lingo->formatFunctionBody(jt._value).c_str());
+				}
+			}
+		}
+		debugPrintf("  Factories:\n");
+		if (cast->_lingoArchive->factoryContexts.empty()) {
+			debugPrintf("    [empty]\n");
+		} else {
+			for (auto it : cast->_lingoArchive->factoryContexts) {
+				debugPrintf("  %d:\n", it._key);
+				if (it._value->empty()) {
+					debugPrintf("    [empty]\n");
+				} else {
+					for (auto jt : *it._value) {
+						debugPrintf("    %s:\n", jt._key.c_str());
+						for (auto &kt : jt._value->_functionHandlers) {
+							debugPrintf("%s\n", g_lingo->formatFunctionBody(kt._value).c_str());
+						}
+					}
+				}
+			}
+		}
+	} else {
+		debugPrintf("  [empty]\n");
+	}
+}
+
+void Debugger::disasmCast(Cast *cast, int scriptId, const Common::String &funcName) {
+	Lingo *lingo = g_director->getLingo();
+	bool found = false;
+	if (cast && cast->_lingoArchive) {
+		ScriptContext *ctx = cast->_lingoArchive->findScriptContext(scriptId);
+		if (ctx && ctx->_functionHandlers.contains(funcName)) {
+			debugPrintf("%s\n", lingo->formatFunctionBody(ctx->_functionHandlers[funcName]).c_str());
+			found = true;
+		}
+		if (cast->_lingoArchive->factoryContexts.contains(scriptId)) {
+			for (auto &it : *cast->_lingoArchive->factoryContexts.getVal(scriptId)) {
+				Common::String prefix = Common::String::format("%s:", it._key.c_str());
+				if (funcName.hasPrefixIgnoreCase(prefix)) {
+					Common::String handler = funcName.substr(prefix.size());
+					if (it._value->_functionHandlers.contains(handler)) {
+						debugPrintf("%s\n", lingo->formatFunctionBody(it._value->_functionHandlers[handler]).c_str());
+						found = true;
+					}
+				}
+			}
+		}
+	}
+	if (!found) {
+		debugPrintf("  [empty]\n");
+	}
+}
+
 bool Debugger::cmdDisasm(int argc, const char **argv) {
 	Lingo *lingo = g_director->getLingo();
+	Movie *movie = g_director->getCurrentMovie();
+	const Common::HashMap<int, Cast *> *casts = movie->getCasts();
+	Cast *sharedCast = movie->getSharedCast();
+
 	if (argc == 2) {
 		if (!strcmp(argv[1], "all")) {
 			Movie *movie = g_director->getCurrentMovie();
 			Score *score = movie->getScore();
-			Cast *targets[2] = {movie->getCast(), movie->getSharedCast()};
-			const char *targetNames[2] = {"Cast", "Shared cast"};
 			ScriptContext *csc = lingo->_state->context;
 			if (csc) {
 				debugPrintf("Functions attached to frame %d:\n", score->getCurrentFrameNum());
 				for (auto &it : csc->_functionHandlers) {
-					debugPrintf("%s\n\n", g_lingo->formatFunctionBody(it._value).c_str());
+					debugPrintf("%s\n\n", lingo->formatFunctionBody(it._value).c_str());
 				}
 			} else {
 				debugPrintf("Functions attached to frame %d:\n", score->getCurrentFrameNum());
 				debugPrintf("  [empty]\n");
 			}
 			debugPrintf("\n");
-			for (int t = 0; t < 2; t++) {
-				debugPrintf("%s functions:\n", targetNames[t]);
-				Cast *cast = targets[t];
-				if (cast && cast->_lingoArchive) {
-					for (int i = 0; i <= kMaxScriptType; i++) {
-						debugPrintf("  %s:\n", scriptType2str((ScriptType)i));
-						if (cast->_lingoArchive->scriptContexts[i].size() == 0)
-							debugPrintf("    [empty]\n");
-
-						for (auto &it : cast->_lingoArchive->scriptContexts[i]) {
-							for (auto &jt : it._value->_functionHandlers) {
-								debugPrintf("%s\n", g_lingo->formatFunctionBody(jt._value).c_str());
-							}
-						}
-					}
-					debugPrintf("  Factories:\n");
-					if (cast->_lingoArchive->factoryContexts.empty()) {
-						debugPrintf("    [empty]\n");
-					} else {
-						for (auto it : cast->_lingoArchive->factoryContexts) {
-							debugPrintf("  %d:\n", it._key);
-							if (it._value->empty()) {
-								debugPrintf("    [empty]\n");
-							} else {
-								for (auto jt : *it._value) {
-									debugPrintf("    %s:\n", jt._key.c_str());
-									for (auto &kt : jt._value->_functionHandlers) {
-										debugPrintf("%s\n", g_lingo->formatFunctionBody(kt._value).c_str());
-									}
-								}
-							}
-						}
-					}
-				} else {
-					debugPrintf("  [empty]\n");
-				}
+			for (auto &it : *casts) {
+				debugPrintf("Cast %d (%s, %s) functions:\n", it._key, it._value->getMacName().c_str(), it._value->getCastName().c_str());
+				disasmAllCast(it._value);
 				debugPrintf("\n");
 			}
+			debugPrintf("Shared cast:\n");
+			if (!sharedCast) {
+				debugPrintf("[empty]\n");
+			} else {
+				disasmAllCast(sharedCast);
+			}
+			debugPrintf("\n");
 			return true;
 		}
 		Common::String target(argv[1]);
@@ -612,33 +652,20 @@ bool Debugger::cmdDisasm(int argc, const char **argv) {
 		}
 
 		Common::String funcName = target.substr(splitPoint + 1, Common::String::npos);
-		Movie *movie = g_director->getCurrentMovie();
-		Cast *targets[2] = {movie->getCast(), movie->getSharedCast()};
-
-		for (int i = 0; i < 2; i++) {
-			Cast *cast = targets[i];
-			if (cast && cast->_lingoArchive) {
-				ScriptContext *ctx = cast->_lingoArchive->findScriptContext(scriptId);
-				if (ctx && ctx->_functionHandlers.contains(funcName)) {
-					debugPrintf("%s\n", lingo->formatFunctionBody(ctx->_functionHandlers[funcName]).c_str());
-					return true;
-				}
-				if (cast->_lingoArchive->factoryContexts.contains(scriptId)) {
-					for (auto &it : *cast->_lingoArchive->factoryContexts.getVal(scriptId)) {
-						Common::String prefix = Common::String::format("%s:", it._key.c_str());
-						if (funcName.hasPrefixIgnoreCase(prefix)) {
-							Common::String handler = funcName.substr(prefix.size());
-							if (it._value->_functionHandlers.contains(handler)) {
-								debugPrintf("%s\n", lingo->formatFunctionBody(it._value->_functionHandlers[handler]).c_str());
-								return true;
-							}
-						}
-					}
-				}
-			}
+		for (auto &it : *casts) {
+			debugPrintf("Cast %d (%s, %s) functions:\n", it._key, it._value->getMacName().c_str(), it._value->getCastName().c_str());
+			disasmCast(it._value, scriptId, funcName);
+			debugPrintf("\n");
+		}
+		debugPrintf("Shared cast:\n");
+		if (!sharedCast) {
+			debugPrintf("[empty]\n");
+		} else {
+			disasmCast(sharedCast, scriptId, funcName);
 		}
+		debugPrintf("\n");
 	} else {
-		Common::Array<CFrame *> &callstack = g_lingo->_state->callstack;
+		Common::Array<CFrame *> &callstack = lingo->_state->callstack;
 		if (callstack.size() == 0) {
 			debugPrintf("Lingo is not executing, nothing to disassemble.\n");
 			return true;
diff --git a/engines/director/debugger.h b/engines/director/debugger.h
index a87adab0cb5..165bf14276d 100644
--- a/engines/director/debugger.h
+++ b/engines/director/debugger.h
@@ -62,6 +62,7 @@ struct Breakpoint {
 	Common::String format() const;
 };
 
+class Cast;
 
 class Debugger : public GUI::Debugger {
 public:
@@ -83,6 +84,9 @@ public:
 	void entityWriteHook(int entity, int field);
 
 private:
+	void disasmAllCast(Cast *cast);
+	void disasmCast(Cast *cast, int scriptId, const Common::String &funcName);
+
 	bool cmdHelp(int argc, const char **argv);
 
 	bool cmdVersion(int argc, const char **argv);


Commit: 9b2b4127a79f97b4fb9021567fb74c12e23215fe
    https://github.com/scummvm/scummvm/commit/9b2b4127a79f97b4fb9021567fb74c12e23215fe
Author: Scott Percival (code at moral.net.au)
Date: 2026-07-25T13:26:51+02:00

Commit Message:
DIRECTOR: Move last keypress information to top level

It is possible for a movie to use tell() inside a keyDown handler, and
expect "the keyCode" etc. to still work.

Improves keyboard controls in Noir: A Shadowy Thriller.

Changed paths:
    engines/director/director.cpp
    engines/director/director.h
    engines/director/events.cpp
    engines/director/lingo/lingo-the.cpp
    engines/director/lingo/xlibs/g/getuinfo.cpp
    engines/director/movie.cpp
    engines/director/movie.h


diff --git a/engines/director/director.cpp b/engines/director/director.cpp
index 9095f86f20d..e019289bc49 100644
--- a/engines/director/director.cpp
+++ b/engines/director/director.cpp
@@ -109,6 +109,10 @@ DirectorEngine::DirectorEngine(OSystem *syst, const DirectorGameDescription *gam
 	_fileIOType = 0;
 	_vfwPaletteHack = false;
 
+	_key = 0;
+	_keyCode = 0;
+	_keyFlags = 0;
+
 	_wm = nullptr;
 
 	_gameDataDir = Common::FSNode(ConfMan.getPath("path"));
diff --git a/engines/director/director.h b/engines/director/director.h
index 92ac4e299ee..0e88a615881 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -309,6 +309,10 @@ public:
 	int _fileIOType;
 	bool _vfwPaletteHack;
 
+	uint16 _key;
+	int _keyCode;
+	byte _keyFlags;
+
 private:
 	byte _currentPalette[768];
 	uint16 _currentPaletteLength;
diff --git a/engines/director/events.cpp b/engines/director/events.cpp
index cfa09d42fc3..2cf1cc73b61 100644
--- a/engines/director/events.cpp
+++ b/engines/director/events.cpp
@@ -280,7 +280,7 @@ bool Movie::processSysEvent(Common::Event &event) {
 				if (g_director->getPlatform() == Common::kPlatformMacintosh) {
 					// On Mac, when the mouse button and Control key are pressed
 					// at the same time, this simulates right button click
-					if (_keyFlags & Common::KBD_CTRL) {
+					if (_vm->_keyFlags & Common::KBD_CTRL) {
 						ev = kEventRightMouseDown;
 					}
 				}
@@ -315,7 +315,7 @@ bool Movie::processSysEvent(Common::Event &event) {
 				if (g_director->getPlatform() == Common::kPlatformMacintosh) {
 					// On Mac, when the mouse button and Control key are pressed
 					// at the same time, this simulates right button click
-					if (_keyFlags & Common::KBD_CTRL) {
+					if (_vm->_keyFlags & Common::KBD_CTRL) {
 						ev = kEventRightMouseUp;
 					}
 				}
@@ -334,27 +334,27 @@ bool Movie::processSysEvent(Common::Event &event) {
 		return result;
 
 	case Common::EVENT_KEYDOWN:
-		_keyCode = _vm->_KeyCodes.contains(event.kbd.keycode) ? _vm->_KeyCodes[event.kbd.keycode] : 0;
-		_key = event.kbd.ascii;
+		_vm->_keyCode = _vm->_KeyCodes.contains(event.kbd.keycode) ? _vm->_KeyCodes[event.kbd.keycode] : 0;
+		_vm->_key = event.kbd.ascii;
 		// While most non-letter keys don't affect "the keyPress", there
 		// are some that do and (sadly) we have to account for that.
 		switch (event.kbd.keycode) {
 		case Common::KEYCODE_LEFT:
-			_key = 28;
+			_vm->_key = 28;
 			break;
 		case Common::KEYCODE_RIGHT:
-			_key = 29;
+			_vm->_key = 29;
 			break;
 		case Common::KEYCODE_UP:
-			_key = 30;
+			_vm->_key = 30;
 			break;
 		case Common::KEYCODE_DOWN:
-			_key = 31;
+			_vm->_key = 31;
 			break;
 		default:
 			break;
 		}
-		_keyFlags = event.kbd.flags;
+		_vm->_keyFlags = event.kbd.flags;
 
 		if (event.kbd.keycode == Common::KEYCODE_LSHIFT || event.kbd.keycode == Common::KEYCODE_RSHIFT ||
 			event.kbd.keycode == Common::KEYCODE_LCTRL || event.kbd.keycode == Common::KEYCODE_RCTRL ||
@@ -364,7 +364,7 @@ bool Movie::processSysEvent(Common::Event &event) {
 			return true;
 		}
 
-		debugC(1, kDebugEvents, "Movie::processEvent(): movie '%s', keycode: %d", _macName.c_str(), _keyCode);
+		debugC(1, kDebugEvents, "Movie::processEvent(): movie '%s', keycode: %d", _macName.c_str(), _vm->_keyCode);
 
 		_lastEventTime = g_director->getMacTicks();
 		_lastKeyTime = _lastEventTime;
@@ -377,7 +377,7 @@ bool Movie::processSysEvent(Common::Event &event) {
 
 	case Common::EVENT_KEYUP:
 		result = processInputEvent(kEventKeyUp, sc->getSpriteIDOfActiveWidget());
-		_keyFlags = event.kbd.flags;
+		_vm->_keyFlags = event.kbd.flags;
 		return result;
 
 	default:
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 0441a8fd762..c5d57d176f3 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -591,12 +591,12 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 		break;
 	case kTheCommandDown:
 		if (g_director->getPlatform() == Common::kPlatformWindows)
-			d = (movie->_keyFlags & Common::KBD_CTRL) ? 1 : 0;
+			d = (_vm->_keyFlags & Common::KBD_CTRL) ? 1 : 0;
 		else
-			d = (movie->_keyFlags & Common::KBD_META) ? 1 : 0;
+			d = (_vm->_keyFlags & Common::KBD_META) ? 1 : 0;
 		break;
 	case kTheControlDown:
-		d = (movie->_keyFlags & Common::KBD_CTRL) ? 1 : 0;
+		d = (_vm->_keyFlags & Common::KBD_CTRL) ? 1 : 0;
 		break;
 	case kTheCpuHogTicks:
 		// Mac-onlym specifies how often Director yeilds to other applications.
@@ -678,14 +678,14 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 		}
 		break;
 	case kTheKey:
-		if (movie->_key < 0x80) {
-			d = Common::String::format("%c", (char)movie->_key);
+		if (_vm->_key < 0x80) {
+			d = Common::String::format("%c", (char)_vm->_key);
 		} else {
 			d = Common::String();
 		}
 		break;
 	case kTheKeyCode:
-		d = movie->_keyCode;
+		d = _vm->_keyCode;
 		break;
 	case kTheKeyDownScript:
 		d.type = STRING;
@@ -697,7 +697,7 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 	case kTheKeyPressed:
 		{
 			Common::U32String buf;
-			buf.insertChar(movie->_key, 0);
+			buf.insertChar(_vm->_key, 0);
 			d = buf.encode();
 		}
 		break;
@@ -958,7 +958,7 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 		d = 15;
 		break;
 	case kTheOptionDown:
-		d = (movie->_keyFlags & Common::KBD_ALT) ? 1 : 0;
+		d = (_vm->_keyFlags & Common::KBD_ALT) ? 1 : 0;
 		break;
 	case kTheOrganizationName:
 		d = Common::String("ScummVM Team");
@@ -1081,7 +1081,7 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 		d = Common::String("DRW600-01234-56789-01234");
 		break;
 	case kTheShiftDown:
-		d = (movie->_keyFlags & Common::KBD_SHIFT) ? 1 : 0;
+		d = (_vm->_keyFlags & Common::KBD_SHIFT) ? 1 : 0;
 		break;
 	case kTheSoundEnabled:
 		d = _vm->getCurrentWindow()->getSoundManager()->getSoundEnabled();
diff --git a/engines/director/lingo/xlibs/g/getuinfo.cpp b/engines/director/lingo/xlibs/g/getuinfo.cpp
index 9c6e5d9ff4c..2f875ed8b25 100644
--- a/engines/director/lingo/xlibs/g/getuinfo.cpp
+++ b/engines/director/lingo/xlibs/g/getuinfo.cpp
@@ -113,8 +113,7 @@ void GetUInfoXObj::m_rButtonDown(int nargs) {
 
 void GetUInfoXObj::m_keyPressed(int nargs) {
 	g_lingo->dropStack(nargs);
-	Movie *movie = g_director->getCurrentMovie();
-	g_lingo->push(Datum(movie ? movie->_keyCode : 0));
+	g_lingo->push(Datum(g_director->_keyCode));
 }
 
 }
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index f1a8fc925c0..d6a82ab2e1a 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -62,10 +62,6 @@ Movie::Movie(Window *window) {
 
 	_videoPlayback = false;
 
-	_key = 0;
-	_keyCode = 0;
-	_keyFlags = 0;
-
 	_currentDraggedChannel = nullptr;
 	_currentHiliteChannelId = 0;
 	_mouseDownWasInButton = false;
diff --git a/engines/director/movie.h b/engines/director/movie.h
index 846879ef051..94aa12b4348 100644
--- a/engines/director/movie.h
+++ b/engines/director/movie.h
@@ -188,10 +188,6 @@ public:
 	int _nextEventId;
 	Common::Queue<LingoEvent> _inputEventQueue;
 
-	uint16 _key;
-	int _keyCode;
-	byte _keyFlags;
-
 	int _selStart;
 	int _selEnd;
 




More information about the Scummvm-git-logs mailing list