*
* @package org.cocur.slugify
* @author Florian Eckerstorfer <florian@eckerstorfer.co>
* @author Marchenko Alexandr
* @copyright 2012-2014 Florian Eckerstorfer
* @license http://www.opensource.org/licenses/MIT The MIT License
*/
interface SlugifyInterface
{
/**
* Return a URL safe version of a string.
*
* @param string $string
* @param string|array|null $options
*
* @return string
*
* @api
*/
public function slugify(string $string, array|string|null $options = null): string;
}
"syntax error, unexpected '|', expecting variable (T_VARIABLE) (View: /home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/web/app/themes/tfs/resources/views/single.blade.php)"
*
* @param string $__path
* @param array $__data
* @return string
*/
protected function evaluatePath($__path, $__data)
{
$obLevel = ob_get_level();
ob_start();
extract($__data, EXTR_SKIP);
// We'll evaluate the contents of the view inside a try/catch block so we can
// flush out any stray output that might get out before an error occurs or
// an exception is thrown. This prevents any partial views from leaking.
try {
include $__path;
} catch (Throwable $e) {
$this->handleViewException($e, $obLevel);
}
return ltrim(ob_get_clean());
}
/**
* Handle a view exception.
*
* @param \Throwable $e
* @param int $obLevel
* @return void
*
* @throws \Throwable
*/
protected function handleViewException(Throwable $e, $obLevel)
{
while (ob_get_level() > $obLevel) {
ob_end_clean();
}
*
* @package org.cocur.slugify
* @author Florian Eckerstorfer <florian@eckerstorfer.co>
* @author Marchenko Alexandr
* @copyright 2012-2014 Florian Eckerstorfer
* @license http://www.opensource.org/licenses/MIT The MIT License
*/
interface SlugifyInterface
{
/**
* Return a URL safe version of a string.
*
* @param string $string
* @param string|array|null $options
*
* @return string
*
* @api
*/
public function slugify(string $string, array|string|null $options = null): string;
}
"syntax error, unexpected '|', expecting variable (T_VARIABLE)"
public function unregister()
{
spl_autoload_unregister(array($this, 'loadClass'));
if (null !== $this->vendorDir) {
unset(self::$registeredLoaders[$this->vendorDir]);
}
}
/**
* Loads the given class or interface.
*
* @param string $class The name of the class
* @return true|null True if loaded, null otherwise
*/
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
$includeFile = self::$includeFile;
$includeFile($file);
return true;
}
return null;
}
/**
* Finds the path to the file where the class is defined.
*
* @param string $class The name of the class
*
* @return string|false The path if found, false otherwise
*/
public function findFile($class)
{
// class map lookup
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
}
*
* For the full copyright and license information, please view the LICENSE.md
* file that was distributed with this source code.
*
* ------------------------------------------------------------------
*/
declare(strict_types=1);
namespace TOC;
use Cocur\Slugify\Slugify;
use Cocur\Slugify\SlugifyInterface;
/**
* UniqueSlugify creates slugs from text without repeating the same slug twice per instance
*
* @author Casey McLaughlin <caseyamcl@gmail.com>
*/
class UniqueSlugify implements SlugifyInterface
{
/**
* @var SlugifyInterface
*/
private $slugify;
/**
* @var array
*/
private $used;
/**
* Constructor
*
* @param SlugifyInterface|null $slugify
*/
public function __construct(?SlugifyInterface $slugify = null)
{
$this->used = array();
$this->slugify = $slugify ?: new Slugify();
/**
* @return void
*/
private static function initializeIncludeClosure()
{
if (self::$includeFile !== null) {
return;
}
/**
* Scope isolated include.
*
* Prevents access to $this/self from included files.
*
* @param string $file
* @return void
*/
self::$includeFile = \Closure::bind(static function($file) {
include $file;
}, null, null);
}
}
"/home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/vendor/caseyamcl/toc/src/UniqueSlugify.php"
public function unregister()
{
spl_autoload_unregister(array($this, 'loadClass'));
if (null !== $this->vendorDir) {
unset(self::$registeredLoaders[$this->vendorDir]);
}
}
/**
* Loads the given class or interface.
*
* @param string $class The name of the class
* @return true|null True if loaded, null otherwise
*/
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
$includeFile = self::$includeFile;
$includeFile($file);
return true;
}
return null;
}
/**
* Finds the path to the file where the class is defined.
*
* @param string $class The name of the class
*
* @return string|false The path if found, false otherwise
*/
public function findFile($class)
{
// class map lookup
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
}
/**
* @var HTML5
*/
private $htmlParser;
/**
* @var SlugifyInterface
*/
private $slugifier;
/**
* Constructor
*
* @param HTML5|null $htmlParser
* @param SlugifyInterface|null $slugify
*/
public function __construct(?HTML5 $htmlParser = null, ?SlugifyInterface $slugify = null)
{
$this->htmlParser = $htmlParser ?? new HTML5();
$this->slugifier = $slugify ?? new UniqueSlugify();
}
/**
* Fix markup
*
* @param string $markup
* @param int $topLevel
* @param int $depth
* @return string Markup with added IDs
* @throws RuntimeException
*/
public function fix(string $markup, int $topLevel = 1, int $depth = 6): string
{
if (! $this->isFullHtmlDocument($markup)) {
$partialID = uniqid('toc_generator_');
$markup = sprintf("<body id='%s'>%s</body>", $partialID, $markup);
}
$domDocument = $this->htmlParser->loadHTML($markup);
$domDocument->preserveWhiteSpace = true; // do not clobber whitespace
<?php
namespace App\View\Composers;
use DOMDocument;
use Roots\Acorn\View\Composer;
class BlogPost extends Composer
{
protected static $views = [
'partials.content-single',
];
public function override()
{
$fields = get_fields();
$htmlContent = apply_filters( 'the_content', get_the_content() );
$markupFixer = new \TOC\MarkupFixer();
$tocGenerator = new \TOC\TocGenerator();
$htmlContent = $markupFixer->fix($htmlContent);
$fields['toc'] = $tocGenerator->getOrderedHtmlMenu($htmlContent);
$fields['the_content'] = $htmlContent;
$fields['the_category'] = $this->getCategory();
return $fields;
}
public function getCategory() {
$category = null;
if(get_the_terms(get_the_id(), 'category')) {
foreach(get_the_terms(get_the_id(), 'category') as $term) {
if($term->name !== "Blog" && $term->name !== "Events" && $term->name !== "News") {
$category = $term;
return $category;
}
}
}
*/
public function compose(View $view)
{
$this->view = $view;
$this->data = new Fluent($view->getData());
$view->with($this->merge());
}
/**
* Data to be merged and passed to the view before rendering.
*
* @return array
*/
protected function merge()
{
return array_merge(
$this->with(),
$this->view->getData(),
$this->override()
);
}
/**
* Data to be passed to view before rendering
*
* @return array
*/
protected function with()
{
return [];
}
/**
* Data to be passed to view before rendering
*
* @return array
*/
protected function override()
{
return static::$views;
}
$view = array_slice(explode('\\', static::class), 3);
$view = array_map([Str::class, 'snake'], $view, array_fill(0, count($view), '-'));
return implode('/', $view);
}
/**
* Compose the view before rendering.
*
* @param \Illuminate\View\View $view
* @return void
*/
public function compose(View $view)
{
$this->view = $view;
$this->data = new Fluent($view->getData());
$view->with($this->merge());
}
/**
* Data to be merged and passed to the view before rendering.
*
* @return array
*/
protected function merge()
{
return array_merge(
$this->with(),
$this->view->getData(),
$this->override()
);
}
/**
* Data to be passed to view before rendering
*
* @return array
return $callback;
}
/**
* Build a class based container callback Closure.
*
* @param string $class
* @param string $prefix
* @return \Closure
*/
protected function buildClassEventCallback($class, $prefix)
{
[$class, $method] = $this->parseClassEvent($class, $prefix);
// Once we have the class and method name, we can build the Closure to resolve
// the instance out of the IoC container and call the method on it with the
// given arguments that are passed to the Closure as the composer's data.
return function () use ($class, $method) {
return $this->container->make($class)->{$method}(...func_get_args());
};
}
/**
* Parse a class based composer name.
*
* @param string $class
* @param string $prefix
* @return array
*/
protected function parseClassEvent($class, $prefix)
{
return Str::parseCallback($class, $this->classEventMethodForPrefix($prefix));
}
/**
* Determine the class event method based on the given prefix.
*
* @param string $prefix
* @return string
* @param \Closure|string $listener
* @param bool $wildcard
* @return \Closure
*/
public function makeListener($listener, $wildcard = false)
{
if (is_string($listener)) {
return $this->createClassListener($listener, $wildcard);
}
if (is_array($listener) && isset($listener[0]) && is_string($listener[0])) {
return $this->createClassListener($listener, $wildcard);
}
return function ($event, $payload) use ($listener, $wildcard) {
if ($wildcard) {
return $listener($event, $payload);
}
return $listener(...array_values($payload));
};
}
/**
* Create a class based listener using the IoC container.
*
* @param string $listener
* @param bool $wildcard
* @return \Closure
*/
public function createClassListener($listener, $wildcard = false)
{
return function ($event, $payload) use ($listener, $wildcard) {
if ($wildcard) {
return call_user_func($this->createClassCallable($listener), $event, $payload);
}
$callable = $this->createClassCallable($listener);
return $callable(...array_values($payload));
* @param bool $halt
* @return array|null
*/
public function dispatch($event, $payload = [], $halt = false)
{
// When the given "event" is actually an object we will assume it is an event
// object and use the class as the event name and this event itself as the
// payload to the handler, which makes object based events quite simple.
[$event, $payload] = $this->parseEventAndPayload(
$event, $payload
);
if ($this->shouldBroadcast($payload)) {
$this->broadcastEvent($payload[0]);
}
$responses = [];
foreach ($this->getListeners($event) as $listener) {
$response = $listener($event, $payload);
// If a response is returned from the listener and event halting is enabled
// we will just return this response, and not call the rest of the event
// listeners. Otherwise we will add the response on the response list.
if ($halt && ! is_null($response)) {
return $response;
}
// If a boolean false is returned from a listener, we will stop propagating
// the event to any further listeners down in the chain, else we keep on
// looping through the listeners and firing every one in our sequence.
if ($response === false) {
break;
}
$responses[] = $response;
}
return $halt ? null : $responses;
}
protected function addEventListener($name, $callback)
{
if (Str::contains($name, '*')) {
$callback = function ($name, array $data) use ($callback) {
return $callback($data[0]);
};
}
$this->events->listen($name, $callback);
}
/**
* Call the composer for a given view.
*
* @param \Illuminate\Contracts\View\View $view
* @return void
*/
public function callComposer(ViewContract $view)
{
$this->events->dispatch('composing: '.$view->name(), [$view]);
}
/**
* Call the creator for a given view.
*
* @param \Illuminate\Contracts\View\View $view
* @return void
*/
public function callCreator(ViewContract $view)
{
$this->events->dispatch('creating: '.$view->name(), [$view]);
}
}
} catch (Throwable $e) {
$this->factory->flushState();
throw $e;
}
}
/**
* Get the contents of the view instance.
*
* @return string
*/
protected function renderContents()
{
// We will keep track of the amount of views being rendered so we can flush
// the section after the complete rendering operation is done. This will
// clear out the sections for any separate views that may be rendered.
$this->factory->incrementRender();
$this->factory->callComposer($this);
$contents = $this->getContents();
// Once we've finished rendering the view, we'll decrement the render count
// so that each sections get flushed out next time a view is created and
// no old sections are staying around in the memory of an environment.
$this->factory->decrementRender();
return $contents;
}
/**
* Get the evaluated contents of the view.
*
* @return string
*/
protected function getContents()
{
return $this->engine->get($this->path, $this->gatherData());
}
$this->view = $view;
$this->path = $path;
$this->engine = $engine;
$this->factory = $factory;
$this->data = $data instanceof Arrayable ? $data->toArray() : (array) $data;
}
/**
* Get the string contents of the view.
*
* @param callable|null $callback
* @return array|string
*
* @throws \Throwable
*/
public function render(callable $callback = null)
{
try {
$contents = $this->renderContents();
$response = isset($callback) ? $callback($this, $contents) : null;
// Once we have the contents of the view, we will flush the sections if we are
// done rendering all views so that there is nothing left hanging over when
// another view gets rendered in the future by the application developer.
$this->factory->flushStateIfDoneRendering();
return ! is_null($response) ? $response : $contents;
} catch (Throwable $e) {
$this->factory->flushState();
throw $e;
}
}
/**
* Get the contents of the view instance.
*
* @return string
<?php $__env->startSection('content'); ?>
<?php while(have_posts()): ?> <?php (the_post()); ?>
<?php echo $__env->first(['partials.content-single-' . get_post_type(), 'partials.content-single'], \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?>
<?php endwhile; ?>
<?php $__env->stopSection(); ?>
<?php echo $__env->make('layouts.app', \Illuminate\Support\Arr::except(get_defined_vars(), ['__data', '__path']))->render(); ?><?php /**PATH /home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/web/app/themes/tfs/resources/views/single.blade.php ENDPATH**/ ?>
/**
* Get the evaluated contents of the view at the given path.
*
* @param string $__path
* @param array $__data
* @return string
*/
protected function evaluatePath($__path, $__data)
{
$obLevel = ob_get_level();
ob_start();
extract($__data, EXTR_SKIP);
// We'll evaluate the contents of the view inside a try/catch block so we can
// flush out any stray output that might get out before an error occurs or
// an exception is thrown. This prevents any partial views from leaking.
try {
include $__path;
} catch (Throwable $e) {
$this->handleViewException($e, $obLevel);
}
return ltrim(ob_get_clean());
}
/**
* Handle a view exception.
*
* @param \Throwable $e
* @param int $obLevel
* @return void
*
* @throws \Throwable
*/
protected function handleViewException(Throwable $e, $obLevel)
{
while (ob_get_level() > $obLevel) {
ob_end_clean();
"/home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/web/app/themes/tfs/storage/framework/views/eb422c8beb3d93cfa2fe08ce3b438f23bc0fae21.php"
*
* @param string $path
* @param array $data
* @return string
*/
public function get($path, array $data = [])
{
$this->lastCompiled[] = $path;
// If this given view has expired, which means it has simply been edited since
// it was last compiled, we will re-compile the views so we can evaluate a
// fresh copy of the view. We'll pass the compiler the path of the view.
if ($this->compiler->isExpired($path)) {
$this->compiler->compile($path);
}
// Once we have the path to the compiled file, we will evaluate the paths with
// typical PHP just like any other templates. We also keep a stack of views
// which have been rendered for right exception messages to be generated.
$results = $this->evaluatePath($this->compiler->getCompiledPath($path), $data);
array_pop($this->lastCompiled);
return $results;
}
/**
* Handle a view exception.
*
* @param \Throwable $e
* @param int $obLevel
* @return void
*
* @throws \Throwable
*/
protected function handleViewException(Throwable $e, $obLevel)
{
$e = new ViewException($this->getMessage($e), 0, 1, $e->getFile(), $e->getLine(), $e);
parent::handleViewException($e, $obLevel);
$this->factory->callComposer($this);
$contents = $this->getContents();
// Once we've finished rendering the view, we'll decrement the render count
// so that each sections get flushed out next time a view is created and
// no old sections are staying around in the memory of an environment.
$this->factory->decrementRender();
return $contents;
}
/**
* Get the evaluated contents of the view.
*
* @return string
*/
protected function getContents()
{
return $this->engine->get($this->path, $this->gatherData());
}
/**
* Get the data bound to the view instance.
*
* @return array
*/
public function gatherData()
{
$data = array_merge($this->factory->getShared(), $this->data);
foreach ($data as $key => $value) {
if ($value instanceof Renderable) {
$data[$key] = $value->render();
}
}
return $data;
}
throw $e;
}
}
/**
* Get the contents of the view instance.
*
* @return string
*/
protected function renderContents()
{
// We will keep track of the amount of views being rendered so we can flush
// the section after the complete rendering operation is done. This will
// clear out the sections for any separate views that may be rendered.
$this->factory->incrementRender();
$this->factory->callComposer($this);
$contents = $this->getContents();
// Once we've finished rendering the view, we'll decrement the render count
// so that each sections get flushed out next time a view is created and
// no old sections are staying around in the memory of an environment.
$this->factory->decrementRender();
return $contents;
}
/**
* Get the evaluated contents of the view.
*
* @return string
*/
protected function getContents()
{
return $this->engine->get($this->path, $this->gatherData());
}
/**
$this->view = $view;
$this->path = $path;
$this->engine = $engine;
$this->factory = $factory;
$this->data = $data instanceof Arrayable ? $data->toArray() : (array) $data;
}
/**
* Get the string contents of the view.
*
* @param callable|null $callback
* @return array|string
*
* @throws \Throwable
*/
public function render(callable $callback = null)
{
try {
$contents = $this->renderContents();
$response = isset($callback) ? $callback($this, $contents) : null;
// Once we have the contents of the view, we will flush the sections if we are
// done rendering all views so that there is nothing left hanging over when
// another view gets rendered in the future by the application developer.
$this->factory->flushStateIfDoneRendering();
return ! is_null($response) ? $response : $contents;
} catch (Throwable $e) {
$this->factory->flushState();
throw $e;
}
}
/**
* Get the contents of the view instance.
*
* @return string
<!doctype html>
<html <?php language_attributes(); ?>>
<?php echo \Roots\view(\Roots\app('sage.view'), \Roots\app('sage.data'))->render(); ?>
</html>
}
break;
}
}
if ( ! $template ) {
$template = get_index_template();
}
/**
* Filters the path of the current template before including it.
*
* @since 3.0.0
*
* @param string $template The path of the template to include.
*/
$template = apply_filters( 'template_include', $template );
if ( $template ) {
include $template;
} elseif ( current_user_can( 'switch_themes' ) ) {
$theme = wp_get_theme();
if ( $theme->errors() ) {
wp_die( $theme->errors() );
}
}
return;
}
"/home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/web/app/themes/tfs/index.php"
<?php
/**
* Loads the WordPress environment and template.
*
* @package WordPress
*/
if ( ! isset( $wp_did_header ) ) {
$wp_did_header = true;
// Load the WordPress library.
require_once __DIR__ . '/wp-load.php';
// Set up the WordPress query.
wp();
// Load the theme template.
require_once ABSPATH . WPINC . '/template-loader.php';
}
"/home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/web/wp/wp-includes/template-loader.php"
<?php
/**
* WordPress View Bootstrapper
*/
define('WP_USE_THEMES', true);
require __DIR__ . '/wp/wp-blog-header.php';
"/home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/web/wp/wp-blog-header.php"
Key | Value |
query_vars | array:3 [ "page" => "" "name" => "tfs-production-of-zoom-town-offers-modern-twist-to-thornton-wilder-classic" "category_name" => "blog" ] |
query_string | "name=tfs-production-of-zoom-town-offers-modern-twist-to-thornton-wilder-classic&category_name=blog"
|
request | "blog/tfs-production-of-zoom-town-offers-modern-twist-to-thornton-wilder-classic"
|
matched_rule | "(.+?)/([^/]+)(?:/([0-9]+))?/?$"
|
matched_query | "category_name=blog&name=tfs-production-of-zoom-town-offers-modern-twist-to-thornton-wilder-classic&page="
|
did_permalink | true
|
Key | Value |
query | array:3 [ "page" => "" "name" => "tfs-production-of-zoom-town-offers-modern-twist-to-thornton-wilder-classic" "category_name" => "blog" ] |
query_vars | array:66 [ "page" => 0 "name" => "tfs-production-of-zoom-town-offers-modern-twist-to-thornton-wilder-classic" "category_name" => "blog" "error" => "" "m" => "" "p" => 0 "post_parent" => "" "subpost" => "" "subpost_id" => "" "attachment" => "" "attachment_id" => 0 "pagename" => "" "page_id" => 0 "second" => "" "minute" => "" "hour" => "" "day" => 0 "monthnum" => 0 "year" => 0 "w" => 0 "tag" => "" "cat" => "" "tag_id" => "" "author" => "" "author_name" => "" "feed" => "" "tb" => "" "paged" => 0 "meta_key" => "" "meta_value" => "" "preview" => "" "s" => "" "sentence" => "" "title" => "" "fields" => "" "menu_order" => "" "embed" => "" "category__in" => [] "category__not_in" => [] "category__and" => [] "post__in" => [] "post__not_in" => [] "post_name__in" => [] "tag__in" => [] "tag__not_in" => [] "tag__and" => [] "tag_slug__in" => [] "tag_slug__and" => [] "post_parent__in" => [] "post_parent__not_in" => [] "author__in" => [] "author__not_in" => [] "search_columns" => [] "ignore_sticky_posts" => false "suppress_filters" => false "cache_results" => true "update_post_term_cache" => true "update_menu_item_cache" => false "lazy_load_term_meta" => true "update_post_meta_cache" => true "post_type" => "" "posts_per_page" => 10 "nopaging" => false "comments_per_page" => "50" "no_found_rows" => false "order" => "DESC" ] |
meta_query | WP_Meta_Query {#2559} |
queried_object | WP_Post {#2560} |
queried_object_id | 26319
|
request | """ SELECT wp_posts.*\n \t\t\t\t\t FROM wp_posts \n \t\t\t\t\t WHERE 1=1 AND wp_posts.post_name = 'tfs-production-of-zoom-town-offers-modern-twist-to-thornton-wilder-classic' AND wp_posts.post_type = 'post'\n \t\t\t\t\t \n \t\t\t\t\t ORDER BY wp_posts.post_date DESC\n \t\t\t\t\t """ |
post_count | 1
|
in_the_loop | true
|
current_comment | -1
|
found_posts | 1
|
is_single | true
|
is_singular | true
|
Key | Value |
ID | 26319
|
post_author | "43"
|
post_date | "2022-09-06 23:16:01"
|
post_date_gmt | "2022-09-06 23:16:01"
|
post_content | """ <p style="font-weight: 400;"><img class="alignnone size-full wp-image-26320" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/09/TFS_ACT_ZoomTownPosterTHUMB_0831.jpg" alt="" width="650" height="452" /></p>\n \n <p style="font-weight: 400;">Thornton Wilder’s Pulitzer Prize-winning classic, <em>Our Town</em>, will get a modern twist when Toronto Film School’s upcoming production of <em><a href="https://create.torontofilmschool.ca/showcase/zoomtown/" target="_blank" rel="noopener noreferrer">Zoom Town</a> </em>takes to the virtual stage.</p>\n \n <p style="font-weight: 400;">Directed by Jonathan Whittaker, the 90-minute Zoom play was conceived, adapted and will be performed by his fifth-term <a href="https://www.torontofilmschool.ca/programs/acting-for-film-tv-and-the-theatre-diploma/" target="_blank" rel="noopener noreferrer">Acting for Film, TV & the Theatre</a> students.</p>\n \n <p style="font-weight: 400;">“We have mashed up two worlds to bring you a real-time Zoom experience of the play <em>Our Town</em>,” Whittaker said of the play.</p>\n \n <p style="font-weight: 400;">“Set in 1901, the actors portraying these characters provide modern 2022 insights and comments, revealing how the play is relevant to them today.”</p>\n \n \n [caption id="attachment_26321" align="aligncenter" width="334"]<img class="wp-image-26321 size-medium" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/09/TFS_ACT_ZoomTownPosterFULL_0831.jpg" alt="" width="334" height="526" /> Design by Angèlie Gilchrist Blanchard[/caption]\n \n \n <p style="font-weight: 400;"><em>Zoom Town, </em>which is assistant directed and stage-managed by Frank Behar, will take to the virtual stage for a three-performance run on Sept. 14, 15 and 16 as follows:</p>\n \n <p style="font-weight: 400; text-align: center;">Wednesday, Sept. 14 at 5:30 p.m.</p>\n <p style="font-weight: 400; text-align: center;">Thursday, Sept. 15 at 5:30 p.m.</p>\n <p style="font-weight: 400; text-align: center;">Friday, Sept. 16 at 8 p.m.</p>\n \n <p style="font-weight: 400; text-align: center;"><strong>***Click <a href="https://create.torontofilmschool.ca/showcase/zoomtown/" target="_blank" rel="noopener noreferrer">here</a> to Livestream any of the above performances***</strong></p>\n <p style="font-weight: 400; text-align: center;"><strong> </strong></p>\n <p style="font-weight: 400; text-align: center;"><strong> </strong></p>\n \n <h2 style="font-weight: 400; text-align: center;"><strong>The Creative Team Behind Zoom Town (in order of appearance):</strong></h2>\n \n \n <img class="alignnone size-medium wp-image-26391 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/09/TFS_ACT_KatAnderson_0906.jpg" alt="" width="334" height="526" />\n <p style="font-weight: 400; text-align: center;"><strong>Kat Anderson as Stage Manager</strong></p>\n <p style="font-weight: 400; text-align: center;">Kat Anderson was born and raised in Sault Ste. Marie, Ontario, but currently resides in Goulais River, Ontario. Kat is currently in her fifth term of the Acting for Film, TV & the Theatre program at Toronto Film School. She has been cast in numerous short students films during her time at TFS, including <em>You Don’t Deny It</em>, <em>The Consult</em>, and <em>Ain’t Nothing Changed</em>, among others. Kat is a “Jill of All Trades”. She’s able to drive stick shift, ride both Western and English style horseback, and has been expanding her artistic abilities in body painting. Her biggest accomplishment thus far has been creating video content on her social media platform, earning her more than 100,000 followers. Kat can dance, act and sing – a triple threat within the acting industry.</p>\n \n \n \n \n <img class="alignnone size-medium wp-image-26392 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/09/TFS_ACT_JaduGrossett_0906.jpg" alt="" width="334" height="526" />\n <p style="font-weight: 400; text-align: center;"><strong>Jadu Grossett as Mrs. Gibbs/Woman in Audience</strong></p>\n <p style="font-weight: 400; text-align: center;">Jadu Grossett was born and raised in Winnipeg, Manitoba. She first started acting in musicals during her high school years at Dakota Collegiate Institute. At the age of 19, she began studying acting at Toronto Film School. During her time at TFS, she played the roles of ‘Mama Nadi’ and ‘Christine’ in both a scene study version and full-length version of the play <em>Ruined</em>. Jadu has also written, directed, and produced a short silent film called <em>Loner</em>. In addition to acting, she is also a self-taught Acro dancer and is trained in several other dance styles such as Ballet, Jazz, Hip-Hop, Lyrical, Contemporary and more. Jadu has always had a strong passion for the arts. In her free time, she loves to draw and paint.</p>\n \n \n \n \n <img class="alignnone size-medium wp-image-26393 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/09/TFS_ACT_ChristopheSolomon_0906.jpg" alt="" width="334" height="526" />\n <p style="font-weight: 400; text-align: center;"><strong>Cristophe Solomon as Dr. Gibbs</strong></p>\n <p style="font-weight: 400; text-align: center;">Christophe Solomon was born in Port-Au-Prince Haiti. When he was 9, he migrated to the twin island of St. Kitts and Nevis, where he graduated high school, then moved to Antigua with his father. During that time, Christophe travelled to Europe, visited Buckingham Palace, North America and most of the Caribbean Islands. He enjoys hiking and traveling, and also drives standard. He now resides in Ontario with his family. He is currently in the fifth term of his acting studies at Toronto Film School, where he wrote, produced, and directed a silent short called <em>Neighbors</em>. Christophe aims to be a successful actor in the near future.</p>\n \n \n \n \n <img class="alignnone size-medium wp-image-26394 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/09/TFS_ACT_NimratBadhan_0906.jpg" alt="" width="334" height="526" />\n <p style="font-weight: 400; text-align: center;"><strong>Nim Badhan as Mrs. Gibbs</strong></p>\n <p style="font-weight: 400; text-align: center;">Nimrat Badhan, better known as Nim, was born in Mississauga, Ontario. While studying Fashion Arts & Business at Humber College, she took on the role of Art Director at a Toronto magazine called <em>Infuse Magazine</em>. During her time as an Art Director, she created fashionable sketches and artwork that displayed her creative talents. She also began working for the Canadian International Fashion Film Festival (CANIFFF), a local festival that showcases fashion/film talent from around the world. Nim is currently studying Acting for Film TV & the Theatre at Toronto Film School, where she has had the opportunity to perform many memorable roles in film and acting projects. She also directed and starred in her own short film, <em>Lessons</em>, which focuses on an out-of-control addict who turns her life around. Nim admires creating art of any form, whether it be drawing, painting, singing, or acting, and plans to continue to grow her career as a successful fashion designer and actress.</p>\n \n \n \n \n <img class="alignnone size-medium wp-image-26395 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/09/TFS_ACT_MikeyLuby-Lavalley_0906.jpg" alt="" width="334" height="526" />\n <p style="font-weight: 400; text-align: center;"><strong>Michael Luby Lavalley as Howie Newsome/Mr. Webb</strong></p>\n <p style="font-weight: 400; text-align: center;">Michael Luby Lavalley is a jack of all trades and father to three amazing children – all while still having the skillset to write, play basketball, rap, act, and play video games. He is currently an actor studying in the Acting for Film, TV & the Theatre program at Toronto Film School. While attending TFS, Michael has had the opportunity to act in two silent films; one about a time loop, and the other about a serial killer neighbour. He also performed in <em>12 Scenes Ruined</em> – a third-term stage play – as well as 15 voiceovers, including one for Tim Horton’s and another reading Robert Munsch’s <em>Paper Bag Princess</em>. Michael currently resides in Niagara Falls, where he’s focused on becoming the rising star he is.</p>\n \n \n \n <p style="font-weight: 400; text-align: center;"><img class="alignnone size-medium wp-image-26397" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/09/TFS_ACT_KavinKetheeswaran_0906.jpg" alt="" width="334" height="526" /></p>\n <p style="font-weight: 400; text-align: center;"><strong>Kavin Ketheeswaran as George Gibbs</strong></p>\n <p style="font-weight: 400; text-align: center;">Kavin Ketheeswaran was born and raised in Toronto, Ontario, with a South Asian/mixed background. At 6’1” in height, he has a background in martial arts such as Wushu (Kung Fu), and is also proficient in lion dancing and Chinese Kickboxing. His special skills include use of force, weapon and police training. He is also fluent in speaking Tamil; one of the oldest classical languages in the world. Kavin is currently enrolled in the fifth term of Toronto Film School’s Acting for Film, TV & the Theatre program. During his time at TFS, he has had the opportunity to play both lead and supporting roles in a few student short films, including <em>Sugar Baby</em>, <em>Wingman</em>, and <em>The Letter</em>, to name a few. He modelled for Columbia Sportswear, Roku TV and was a runway model for the Fashion Art Toronto Show in 2022. In addition, he has played roles in TV series including <em>Titans, Accused</em>, and <em>Handmaid’s Tale</em>, and was featured in commercials for Visa, Kawartha Credit Union, and Simply Spiked. He is looking forward to more opportunities and workshops to enhance his career as an actor and is excited about meeting motivated, like-minded individuals in the field.</p>\n \n \n \n \n <img class="alignnone size-medium wp-image-26398 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/09/TFS_ACT_RoseKabbouchi_0906.jpg" alt="" width="334" height="526" />\n <p style="font-weight: 400; text-align: center;"><strong>Rose Kabbouchi as Emily Webb</strong></p>\n <p style="font-weight: 400; text-align: center;">Rose Kabbouchi has been studying dramatic arts for the past three years. She lives in Ottawa, Ontario with her daughter and she is currently enrolled in Acting for Film, TV & the Theatre at Toronto Film School. The most enjoyable roles that she’s played while in school have been ‘Sophie’ in <em>Ruined</em>, ‘Catherine’ in <em>Proof</em> and ‘Mary Warren’ in <em>The Crucible</em>. She is currently known for her role as ‘Melissa’ in <em>The Secrets of Primrose Square</em>, which premiered at The Gladstone Theatre. She enjoys playing instruments such as the flute and piano, and loves to read quite a bit. She looks forward to continuing to take acting classes to further her career and seek out more experiences.</p>\n \n \n \n \n <img class="alignnone size-medium wp-image-26399 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/09/TFS_ACT_MadisonGianna_0906.jpg" alt="" width="334" height="526" />\n <p style="font-weight: 400; text-align: center;"><strong>Madison Gianna as Rebecca Gibbs/Mrs. Soames</strong></p>\n <p style="font-weight: 400; text-align: center;">Madison Gianna was born in Paris, France and raised in Athens, Greece. She is fluent in Greek, English and French. She has been part of multiple student films throughout her time at Toronto Film School. She was the lead actress for a sixth-term film in 2020, titled <em>Hush</em>. Later in 2021, she wrote and directed her own film, <em>Again</em>, which she also starred in. Madison discovered her passion for the arts at a very young age. She majored in performing at Cardinal Carter Academy for the Arts high school and took multiple private courses for television and acting at LB Studios. Aside from acting, she has an extensive dance and musical background. She has been performing ballet and piano since she was five years old and had been a competitive cheerleader for seven years, competing both here in Ontario and in the United States. After a career-ending injury, she had to stop competing and decided to start coaching. She has been coaching gymnastics for three years now, teaching young athletes the fundamentals of movement. Above all else, she is passionate about spreading a message of love throughout the world and she knows she can be successful at this through acting.</p>\n \n \n \n \n <img class="alignnone size-medium wp-image-26400 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/09/TFS_ACT_PerryChu_0906.jpg" alt="" width="334" height="526" />\n <p style="font-weight: 400; text-align: center;"><strong>Perry Chu as Professor Willard/Simon Stimson/Mr. Morgan</strong></p>\n <p style="font-weight: 400; text-align: center;">Perry Chu was born and raised in Taiwan, before moving to Toronto, where he finished high school. He is fluent in Mandarin, Taiwanese, and English, and is currently a fourth term student at Toronto Film School studying Acting for Film, TV & the Theatre. While at school, he had the opportunity to create and direct a short silent film titled <em>Encounter</em> and also acted in several other student short films. Before coming to Toronto Film School, Perry earned a summer program certificate from Vancouver Film School and studied Film at York University for one year. Perry is a musician who composes his own music on keyboards, and is also a professional performer for Chinese dulcimer. Above all else, he is eager to share his life experience and thoughts through his works as an artist.</p>\n \n \n \n \n <img class="alignnone size-medium wp-image-26401 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/09/TFS_ACT_JonathanWhittaker_0906.jpg" alt="" width="334" height="526" />\n <p style="font-weight: 400; text-align: center;"><strong>Jonathan Whittaker – Director</strong></p>\n <p style="font-weight: 400; text-align: center;"><a href="https://www.jonathanwhittaker.com/">Jonathan Whittaker</a> is a graduate of Ryerson University with a Bachelor of Fine Arts with distinction degree in Performance/Acting (1978-80) and a 2015 participant of the Banff/Citadel Professional Development Program. His notable theatre credits include: <em>Beside Myself</em>, <em>Prom Queen, </em>Nigredo <em>Hotel </em>(Dora Award nomination), <em>The Big Sleep</em>, <em>Colours in the Storm, The Team on the Hill, Jake and the Kid</em>, <em>Les Misérables and Dirty Dancing </em>(Mirvish Productions), <em>Man of La Mancha</em>, <em>Closer than Ever</em>, <em>12 Angry Men</em> and <em>The Dining Room</em>. He’s also appeared on many television series and feature films, including: <a href="https://www.imdb.com/title/tt1091909/?ref_=nm_flmg_act_4"><em>Murdoch Mysteries</em></a><em>, </em><a href="https://www.imdb.com/title/tt5809150/?ref_=nm_flmg_act_7"><em>Ransom</em></a><em>, </em><a href="https://www.imdb.com/title/tt3230854/?ref_=nm_flmg_act_8"><em>The Expanse</em></a><em>, </em><a href="https://www.imdb.com/title/tt4057844/?ref_=nm_flmg_act_17"><em>Open Heart</em></a> (series lead), <a href="https://www.imdb.com/title/tt0338574/?ref_=nm_flmg_act_53"><em>Alienated</em></a> (series lead), <a href="https://www.imdb.com/title/tt1567215/?ref_=nm_flmg_act_28"><em>The Kennedys</em></a><em>, </em><a href="https://www.imdb.com/title/tt1059475/?ref_=nm_flmg_act_31"><em>Flashpoint</em></a><em>, </em><a href="https://www.imdb.com/title/tt1632701/?ref_=nm_flmg_act_22"><em>Suits</em></a>, <a href="https://www.imdb.com/title/tt8980602/?ref_=nm_flmg_act_1"><em>The Kid Detective</em></a>, <a href="https://www.imdb.com/title/tt0299658/?ref_=nm_flmg_act_60"><em>Chicago</em></a><em>, </em><a href="https://www.imdb.com/title/tt0418819/?ref_=nm_flmg_act_44"><em>Land of the Dead</em></a><em>, </em><a href="https://www.imdb.com/title/tt0094137/?ref_=nm_flmg_act_111"><em>Three Men and a Baby</em></a><em>, </em>and <a href="https://www.imdb.com/title/tt0159097/?ref_=nm_flmg_act_84"><em>Virgin Suicides</em></a>. For Toronto Film School, he’s director the plays <em>Lord of the Flies, Journeys, 12 Angry Jurors, </em>and <em>Spirited</em>.</p>\n \n \n \n \n <img class="alignnone size-medium wp-image-26334 aligncenter" src="https://dev.tfs.staging.poundandgrain.ca/app/uploads/2022/09/TFS_ACT_FrankBehar_0831.jpg" alt="" width="334" height="526" />\n <p style="font-weight: 400; text-align: center;"><strong>Frank Behar – Assistant Director & Stage Manager</strong></p>\n <p style="font-weight: 400; text-align: center;">Frank Behar is a recent graduate from Toronto Film School’s Acting program, which he graduated from with top honours. Born in Toronto, Frank was raised in New Brunswick, where he attended Tantramar Regional High School and was an active member of the drama department, playing the role of “Kenickie” in the high school’s 2015 rendition of the musical<em> Grease</em>. After high school, Frank attended the Foundation Year Programme of King’s College University’s in Halifax, Nova Scotia. From 2016 to 2017, he worked abroad in London, England as a server and bartender in various prestigious hotels. From 2017 to 2018, Frank moved to Montreal, where he lived in the Mile End with friends. In 2018, Frank returned to New Brunswick and did various readings for Live Bait, Sackville’s local theatre company. In 2019, Frank played the lead role in <em>Cole</em>, a play produced by and directed by Charlie Rhindress. In the Spring of April 2022, Frank performed the roles of Satan, Jesus and Butch Honeywell in Toronto Film School’s online live production of <em>Judge, Jury, Judas</em>, directed by Rosanna Saracino. Frank is a second-degree black belt in Taekwondo and an avid skateboarder and currently resides in Toronto, Ontario.</p>\n \n \n \n \n """ |
post_title | "TFS Production of 'Zoom Town' Offers Modern Twist to Thornton Wilder Classic"
|
post_excerpt | "" |
post_status | "publish"
|
comment_status | "closed"
|
ping_status | "open"
|
post_password | "" |
post_name | "tfs-production-of-zoom-town-offers-modern-twist-to-thornton-wilder-classic"
|
to_ping | "" |
pinged | "" |
post_modified | "2023-03-27 21:06:57"
|
post_modified_gmt | "2023-03-27 21:06:57"
|
post_content_filtered | "" |
post_parent | 0
|
guid | "https://dev.tfs.staging.poundandgrain.ca/?p=26319"
|
menu_order | 0
|
post_type | "post"
|
post_mime_type | "" |
comment_count | "0"
|
filter | "raw"
|
Key | Value |
SERVER_SOFTWARE | "nginx/1.22.1"
|
REQUEST_URI | "/blog/tfs-production-of-zoom-town-offers-modern-twist-to-thornton-wilder-classic/"
|
USER | "forge"
|
HOME | "/home/forge"
|
HTTP_REFERER | "https://dev.tfs.staging.poundandgrain.ca/blog/tfs-production-of-zoom-town-offers-modern-twist-to-thornton-wilder-classic"
|
HTTP_ACCEPT_ENCODING | "gzip, br, zstd, deflate"
|
HTTP_USER_AGENT | "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)"
|
HTTP_ACCEPT | "*/*"
|
HTTP_HOST | "dev.tfs.staging.poundandgrain.ca"
|
REDIRECT_STATUS | "200"
|
HTTPS | "on"
|
SERVER_NAME | "dev.tfs.staging.poundandgrain.ca"
|
SERVER_PORT | "443"
|
SERVER_ADDR | "10.0.1.187"
|
REMOTE_PORT | "51952"
|
REMOTE_ADDR | "3.145.84.203"
|
GATEWAY_INTERFACE | "CGI/1.1"
|
SERVER_PROTOCOL | "HTTP/2.0"
|
DOCUMENT_ROOT | "/home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/web"
|
DOCUMENT_URI | "/index.php"
|
SCRIPT_NAME | "/index.php"
|
SCRIPT_FILENAME | "/home/forge/dev.tfs.staging.poundandgrain.ca/releases/20241113033749/web/index.php"
|
CONTENT_LENGTH | "" |
CONTENT_TYPE | "" |
REQUEST_METHOD | "GET"
|
QUERY_STRING | "" |
FCGI_ROLE | "RESPONDER"
|
PHP_SELF | "/index.php"
|
REQUEST_TIME_FLOAT | 1731844138.2974
|
REQUEST_TIME | 1731844138
|
DB_NAME | "tfs_dev"
|
DB_USER | "***"
|
DB_PASSWORD | "************"
|
WP_ENV | "development"
|
WP_HOME | "https://dev.tfs.staging.poundandgrain.ca"
|
WP_SITEURL | "https://dev.tfs.staging.poundandgrain.ca/wp"
|
WP_DEBUG_LOG | "/path/to/debug.log"
|
AUTH_KEY | "****************************************************************"
|
SECURE_AUTH_KEY | "****************************************************************"
|
LOGGED_IN_KEY | "****************************************************************"
|
NONCE_KEY | "****************************************************************"
|
AUTH_SALT | "****************************************************************"
|
SECURE_AUTH_SALT | "****************************************************************"
|
LOGGED_IN_SALT | "****************************************************************"
|
NONCE_SALT | "****************************************************************"
|
ACF_PRO_KEY | "b3JkZXJfaWQ9NDQxMjV8dHlwZT1kZXZlbG9wZXJ8ZGF0ZT0yMDE0LTExLTEyIDA2OjA0OjE3"
|
Key | Value |
DB_NAME | "tfs_dev"
|
DB_USER | "***"
|
DB_PASSWORD | "************"
|
WP_ENV | "development"
|
WP_HOME | "https://dev.tfs.staging.poundandgrain.ca"
|
WP_SITEURL | "https://dev.tfs.staging.poundandgrain.ca/wp"
|
WP_DEBUG_LOG | "/path/to/debug.log"
|
AUTH_KEY | "****************************************************************"
|
SECURE_AUTH_KEY | "****************************************************************"
|
LOGGED_IN_KEY | "****************************************************************"
|
NONCE_KEY | "****************************************************************"
|
AUTH_SALT | "****************************************************************"
|
SECURE_AUTH_SALT | "****************************************************************"
|
LOGGED_IN_SALT | "****************************************************************"
|
NONCE_SALT | "****************************************************************"
|
ACF_PRO_KEY | "b3JkZXJfaWQ9NDQxMjV8dHlwZT1kZXZlbG9wZXJ8ZGF0ZT0yMDE0LTExLTEyIDA2OjA0OjE3"
|