What we did to help thousands of users in just a few weeks.
Originally published in Big Cartel's collection on Medium.
I'm part of the small-but-mighty support team at Big Cartel. We help our 500,000+ stores get (and stay) online, working through dozens of support requests each day, taking care of the technical (and sometimes non-technical) stuff so they don't have to worry about it. We pride ourselves on making a really simple set of tools, so people who are more artists than tech geeks can still feel like they're in control of their online presence.
But our jobs are about more than just reacting to questions and feedback. We try to be really proactive, and by that measure, we're just as much educators as we are tech support. For example, we put a lot of time into our Field Guides—tips that apply to anyone running any shop or site to promote their work, not just Big Cartel stores.
When I started this job, one area that I felt my particular experience could help Big Cartel is by producing more videos. Although there was a great help site, there was something missing—video, or any way to see how things work beyond text and a few images.
One great thing about Big Cartel is there's a real emphasis on contributing in whatever ways work best for you. Although my day-to-day job is supporting our users, there's ample time carved out for projects and other work-related tasks like writing this up. That's a big difference from when I worked support at Apple. There, the focus was only on numbers.
See all of our help videos.
Once we had our project time allocated, Lucie Bodie and I set out to see what would could do to beef up our help site with a ton of videos. For chatting and project management, we primarily used Slack and Sqwiggle.
We started with a list of common questions: setting up your store, adding shipping charges to your products, using a custom domain, and doing some advanced customization with HTML.
With some of those, we quickly found out a single short video wouldn't cut it. Instead of one overview video showing custom domain setup, we realized that it needed to be specific to each domain provider, otherwise its usefulness would be questionable at best. This meant adding another 13 videos to the project, but we think it was worth it.
Lucie recorded the screen captures with Screenflick. We looked at a few options, but this seemed to be the simplest tool. We needed the least hassle to get a high-in-quality but small-in-size* capture of her browser window, with little to no learning curve. We didn't have a ton of time.
*We could better future proof by recording a higher resolution version now, but with new features and design changes inevitably on the way, we didn't want sink too much time into videos that should be refreshed at least once a year, anyway.
I edit in Final Cut Pro X. It's not without its problems, but it's still my method of choice for cutting video. I got my start in sports, so I'm used to shooting and editing quickly. With FCPX, I can edit fast, rendering works great even on a MacBook Air, and the export options are just what I need.
For voiceovers, we're fortunate enough to have the very talented Rachel Gollay on the team. (We're great multitaskers!) As I'm working on the edit, she takes an outline written by Lucie and records a voiceover track. I make any adjustments right in Final Cut.
Since the files are living in Dropbox, that's where the team reviews the videos and provides feedback. As a time saver, it works. Better than fussing with privacy settings on Vimeo. But be warned: Dropbox's online video playback is awful. I'd only ever use Dropbox like this internally with a small team that knows what they're about to watch.
Once we gather feedback and make any revisions, it's time to get these videos out the door. We upload them to two places: Vimeo and YouTube.
The Vimeo upload is for embedding in our help site. The quality of their embeds and ability to default to 720p playback is still unmatched by YouTube. These videos remain private—we don't want to bother with them showing up in search results.
That's why we use YouTube. Google is always going to prioritize YouTube videos in search results, and that's where people go to look for tutorials. Even though the default playback settings are going to play at a lower quality than we'd like, we have to make ourselves available where our customers want and need us.
As a video creator, I'll say this — YouTube's batch upload tool blows Vimeo out of the water. No comparison on how quickly you can upload, edit your settings, and publish or make the videos private as you wait for launch.
One thing we improved in our second round of videos was speed. We streamlined the entire process, including getting quicker feedback from the rest of the team — all at once — to ensure nothing fell through the cracks.
I had a real duh moment during this project that maybe isn't so obvious, at least when you consider how many people try to cram as much as possible in a single video: People don't want to watch a three minute video to learn how to change a setting in their store that takes 10 seconds.
More people watching video from their mobile devices is a good thing. That's part of the reason why this project is so important—watching video on your phone is easier than reading a long set of instructions. It means more people learning about your work. A deeper connection with the viewer because they hear a real person helping them. But it also means you need to respect your viewers' time, and maybe more importantly, their data plan. A big goal for the future is figuring out how to make more bite-sized videos while not overwhelming people with too much to load and watch.
Different people learn differently. If our goal as the support team is to truly support our customers, then we need to do more than just write out text-based instructions. For example, not everyone speaks English, but they can watch a video of the steps and more easily follow that to complete their task. That's a very simple way these can make a very big difference.
And now, we own the space for Big Cartel help videos. That may sound silly. We are Big Cartel, right? But because we weren't on YouTube before, some people took the time to make their own walkthroughs, which quickly rose to the top of search results. That's not a bad thing, exactly. It's awesome that we have customers who want to help others. But when a feature changes, or we're about to launch something new—now we can handle that, and not rely on someone else to pick up the slack for us.
Video eliminates a lot of basic confusion. Like, "What did she mean when she said log out? Do I need to click log out, or just close the window?" Those are little frustrations that add up over time, when you feel like you already followed the steps, but didn't get the intended result.
That these videos have nearly 10,000 combined views in a couple months only reinforces that a lot of support experiences have been improved. Right now, about 90% of the views are coming through our help site, which is great because it means our users know where to find our help. I'm sure that will even out over time, but it's interesting to see that YouTube isn't the only answer.
A video done well can last for a very long time. It reinforces that you care. Truthfully, the value of a video can't always be measured in dollars and cents. Sometimes, it's a leap of faith. That we took the time, expense, and energy to make our current users experience better says something to me.
It may not be the flashy video project to spend our energy on, but I truly believe that making your product better is more important than half-heartedly checking a wide range of features off a checklist. I'm proud to say Big Cartel does, too.


CASP CAS-002 CompTIA CAS-002 Exam Tests in In Wholesale Price. Whoever had sent that Diane Teare would be appearing at any moment.Prompt Updates CASP compTIA SpyApp Product: 925872 9.6 stars, based on 133 reviews10 Regular price: $76.65 $45.99 (Sale ends 5 November! ) Available from: gooexam.com Condition: Previously owned, in excellent condition In stock! Order now!
Exambible CAS-002 Dump Certificate SpyApp.
What, me Actual Examination ejaculated, beginning in his earnestness and especially in his incivility to credit his sincerity me who have not A2150-537 Braindumps a friend in the world but you if CAS-002 Real Exam you are my friend not a compTIA E05-001 shilling but what you have given me You, Jane, Actual Examination must have you for my own entirely my own.
But unluckily the Varens, six months before, had given me this filette Ad le, who, she affirmed, was my daughter and perhaps she may be, though Actual Examination 070-331 Practice Questions see no proofs of such grim paternity written in her countenance Pilot is more like me than CASP Some years after Actual Examination had broken with the mother, she abandoned her child, and ran away to Italy with a musician or singer.
Inside the mill were twenty of the miller Actual Examination men hewing a stone, and as they went Hick hack, hick hack, hick hack, the mill went Click clack, click clack, CompTIA Advanced Security Practitioner (CASP) CAS-002 Actual Examination click clack.
As Actual Examination looked up at them, the moon appeared momentarily in that part of the sky which filled their fissure her disk was blood red and half overcast she seemed to throw on me one bewildered, dreary glance, and buried herself again instantly CAS-002 Actual Examination in the deep drift of cloud.
The sun was setting fast, and already half of its circle had sunk behind the hill Jorindel on a sudden looked behind him, and saw through the bushes that they had, without knowing it, sat down close under the old walls of the castle.
Ye ll want your supper, Actual Examination am sure, observed Hannah and so will Prompt Updates Prompt Updates John when he comes compTIA And CompTIA Advanced Security Practitioner (CASP) she proceeded to prepare the meal.
You, perhaps, http://www.realexampdf.com/400-051.html could make up your mind to be about CAS-002 Study Guide my hand and chair to C_BITWF_73 Practice Test Pdf wait 1Y0-A28 Answers on me as a kind little nurse for you have an affectionate heart and a generous spirit, which prompt you to make sacrifices for those you pity , and CAS-002 Actual Examination SpyApp that ought to suffice for me CAS-002 Study Guide Book no doubt.
Early in the morning, before it was quite light, and when nobody was stirring in the inn, Chanticleer awakened his wife, and, fetching the egg, they pecked a hole in it, ate it up, and threw the shells into the fireplace they then went to the pin and needle, who were fast asleep, and seizing them by the heads, stuck one into the landlord Actual Examination easy chair and the other into his handkerchief and, having done this, they crept away as softly as possible.
When full of flowers they would doubtless look pretty but now, at the latter end of January, all was wintry blight and brown decay.
Have no fear, said CAS-002 Exam Engines the latter to his master.
It is strange, pursued he, that while Actual Examination love Rosamond Oliver so wildly CAS-002 Simulation Questions with all the intensity, indeed, 1T6-520 Exam Questions With Answers of a first passion, the object of which is exquisitely beautiful, graceful, fascinating Actual Examination experience at the same time a calm, unwarped consciousness that she would not make me a good wife that she is CAS-002 Actual Examination not the partner suited to me CAS-002 Study Guides that Actual Examination should discover this within a year after marriage and that to twelve months rapture would succeed a lifetime of regret.
Oh, CAS-002 Software Actual Examination wish he would cease tormenting me with letters CAS-002 Actual Examination compTIA for money CAS-002 Latest Dumps Actual Examination have no more money to give him we are getting poor.
Actual Examination was surly but the thing would not go it stood by me with strange perseverance, and looked and spoke with a sort of authority.
But this is not to be a regular autobiography.
And what a scream If she had been in great pain one would have excused it, but she only wanted to bring us all here Actual Examination know CAS-002 Exam Vce her naughty tricks.
When Actual Examination think of the thing which flew at my throat this morning, hanging CompTIA CAS-002 Actual Examination its black and scarlet visage over the nest of my dove, my blood curdles And CAS-002 what, Prompt Updates , Actual Examination asked, while he paused, did you do when you had settled her here Where did you go What did Actual Examination do, Jane Actual Examination transformed myself into a will o the wisp.
Wife, go home, and give him a good dinner, and let him have my old cushion to sleep on as long CASP CAS-002 Actual Examination as he lives.
Actual Examination am coming Actual Examination CASP Wait for me Oh, Actual Examination will come Actual Examination flew to the door and looked into the passage it was dark.


The Parachute Band have taken home the People's Choice Award at the Vodafone New Zealand Music Awards, held in Auckland last night. Out of the 100 plus artists nominated for awards, the New Zealand public has voted the Parachute Band their favourite.
The band was formed in 1995 to lead worship at the Parachute Music Festival and their successes in the Christian music circuit have turned their love of music into a full time endeavour.
The award was received by Parachute Music's A&R Manager, Brendan Vucich on behalf of the band who is currently touring South Africa.
The Parachute Band will be taking the stage at Parachute 09, the Southern Hemisphere's largest four day music festival. The festival will be held at Hamilton's Mystery Creek over Auckland Anniversary weekend (23-26 January 2009), boasting a strong suit of international headliners as well as some Kiwi favourites including Dave Dobbyn and Nathan King.
For more information head to parachutemusic.com.


text:
Notable Games Industry Trends that Didn't Make It Out of the 2010s
by Ben Szabadics February 25, 2020
For better or worse, these trends won't see the light of 2020
Good evening, ladies and gentlemen. Today, we hold a vigil to honour the dearly departed: those gaming trends that were unable to make it here to the year two-thousand-and-twenty. Some of these trends led long, rich and fruitful lives and continue to live on with us; others were birthed and heaved into the ground in the space of a short couple of years. Let us know reflect on the old and the new, and acknowledge the life and times of all our lost friends, enemies, and general acquaintances.
R.I.P 3D Gaming
[IMAGE: Captain Falcon on YouTube]
Did you know that there were 58 stereoscopic 3D games on the PS3? Big releases in 2011 had to have 3D support to be taken seriously, as movies like Avatar broke box office records and TV manufacturers trotted out their fancy curved, stereoscopic new wunderkinds. Call of Duty: Black Ops released at the height of the series' popularity with 3D support across PS3, Xbox 360 and PC: it was fantastic, since 3D glasses made everything too dim to see and it ran at a significantly reduced graphical quality and framerate, as it had to be rendered twice for the 3D effect.
Okay, let's stop pretending: what were we thinking? We bought into this collective delusion that 3D was the future and spent way too much money on brand new hardware to support it – your TV had to be replaced, your media players had to be replaced, you needed a pair of special glasses for every single person who wanted to sit down and watch or they'd just be subjected to a blurry mess. Even handhelds weirdly wanted a piece of the action, with Nintendo developing a 3D display for the Nintendo 3DS in 2011 that didn't require glasses, but at the best of times gave you a little bit of a headache and didn't radically improve the experience.
By the time the PlayStation 4 hit the shelves back in 2014, stereoscopic 3D was all but dead, with only 14 games with support on the console – and none of them AAA releases. Three years was all it took. Now, not even cinemas are consistently screening 3D movies, and the hardware you need to experience any of those 3D-enabled games is simply no longer available. What a weirdly high-profile flash in the pan you were, 3D gaming.
R.I.P Dedicated Handhelds
[IMAGE: Kotaku]
Stoking up a bit of controversy here but in 2017, the era of the dedicated handheld gaming console could finally officially be declared over with the release of the Nintendo Switch. It would be fitting that the company credited with creating the category with the Game Boy in 1989 would be the one to kill it, but there's a lot more to the story than one company. The rise of the smartphone from 2007 onwards saw our devices converging more than ever, with a machine that "just played games" becoming less and less interesting, particularly one that was unable to offer games as complete or interesting as what was now releasing on their mobile phone.
Sony had some handheld success with its PlayStation Portable, but its successor, the PlayStation Vita – launched in 2012 with social networking, video and personal organiser features – sold dismally, only landing less than 15 million units in customer hands and being officially discontinued earlier this year. The Nintendo 3DS did a little better, some would say because Nintendo doubled down on just delivering great games, but even then it only sold 75 million units, just half of what its immediate predecessor the Nintendo DS managed. The people had spoken: low-powered handhelds just didn't compare to the much more powerful and useful smartphones on the market, and they wanted something different. The Nintendo Switch delivered that, plugging into the TV for a full console experience or detaching to take on the go, and with it sounded the death knell of cut-down experiences on dedicated handhelds being the norm. FIFA 19: Legacy Edition showed that consumers don't want that anymore.
It's possible I'm burying the handheld alive, though, I can admit that – the Switch Lite is all handheld, and it's great, but we're not going to see cut down experiences like Super Smash Bros. for 3DS anymore, and at the very least I'm happy that taking our games with us is coming with less and less compromises.
R.I.P A Bunch of Video Games I Really Wanted To Play
We've seen a number of really, really promising video games sent to the pits of development hell over the past decade, the most prominent of which has been Half-Life 3: when when former Valve lead writer Marc Laidlaw posted "Epistle 3" to his personal site, it looked as if we were never going to see how the story that Half-Life and its sequels and episodes had so valiantly set up would end, because it looked like the series had been discontinued for all intents and purposes. Now, though, we're getting Half-Life: Alyx next year — 13 years after Episode 2 — but this might just be a husk of the series we loved so much, like Portal's barely-there VR spinoffs The Lab and… whatever that second one was.
Around the same time we also lost Silent Hills, which had the fantastically scary teaser P.T. (and we even had that taken away from us!). We lost Scalebound, a big action RPG from PlatinumGames — yeah, the team behind Nier: Automata — and we never got to see the next title in the Fable series with Lionhead Studios shutting down in 2016. Probably inevitable, since Peter Molyneux left in 2012 to work on weird little mobile experiments instead, but we're all worse off for it. Telltale Games also shut its doors in 2018, but its corpse has somehow been reanimated and it's now just shambling about, missing limbs like The Walking Dead that helped to make it successful in the first place and biding its time until The Wolf Among Us' second season comes out.
Of course, with all of this loss, there was no way EA was going to sit on the sidelines: by shutting down Dead Space developer Visceral Studios, the epitome of corporate greed cost us the Star Wars game it was working on, and that was only a couple of years after Disney bought Lucasfilm and cancelled Lucasarts' Star Wars game as well.
There are more I could mourn, but there was a laundry list of games unceremoniously thrown in the garbage this decade, and it's a shame that the hard work and artistic expression of so many talented developers will never be seen by consumer eyes.
R.I.P The Last Console Generation
[IMAGE: TechSpot]
In the halcyon days of the 2000s we saw several generation shifts: the original PlayStation hit maturity and evolved into the PS2 and then again into the PS3, Microsoft introduced the Xbox and then dropped it like a sack of old potatoes in favour of the Xbox 360, and Nintendo stopped competing graphically after the Nintendo 64 and Gamecube were both outclassed and released the Wii. Well, friends, as of 2019, all those platforms are officially over: the Wii got its final game this year with Just Dance 2020, and both the Xbox 360 and PS3 had their last hurrah last year with FIFA 19 Legacy Edition.
I'd also like to give a special mention to the PS2, launched in 2000, that received Pro Evolution Soccer '14 this decade, so technically we can throw that in the pile here as well. Lying in the hospice as well is the Wii U, but not memorialised here since Drop It: Block Paradise came out last month… yes, when I went to do the research, the Wii U is still getting games. I'm as surprised as you are.
At any rate: let's remember all the things these generations did well! I remember buying a PS3 Slim for its status as the cheapest Blu-Ray player on the market at the time. I remember when my original Xbox 360 hit the monstrous Red Rings Of Death. I played Singstar on the PS2 again only this year and it's still a fantastic party game. With big quality of life upgrades like the PS4 Pro and Xbox One X now happening, I wonder how long our current crop of consoles will last? With Microsoft announcing that the new Xbox is just called "Xbox" again, I wonder if we will see an end to these clearly defined console generations sooner rather than later.
For now, rest in peace to all the brave games machines that left us this decade — may they live forever in our hearts.
Thus concludes our service. Thank you for attending today: the memories of all that we condemn to the earth today will surely make their way into the annals of history. Please feel free to take a program on your way out.
Ben Szabadics
Ben gave up pony club at age 7 to play Pokémon, much to the chagrin of his parents. He now occasionally takes breaks from Pokémon to play and write about other video games, much to the chagrin of his parents. Expect some strong opinions on game design, Picross, and bad puns.
The Fall, Rise and Fall of the Nintendo 3DS - Doublejump April 14, 2020 - 6:56 pm
[…] 3DS, it looked as though the company was testing numerous different implementations of 3D gaming (yet another casualty of the 2010s), either with limited success or none at all. Struggling to get 3D gaming right didn't dissuade […]

redpajama_set_name: RedPajamaCommonCrawl


Here at Norwich Furniture we can offer a vast selection of quality furniture for every room in your house.
Norwich Furniture is pleased to be working with www.nu-trend.co.uk selling the best manufactured furniture at fantastic prices offering real value for money.
In a world of mass manufacturing what everybody wants is individuality and choice.
Not only can Norwich Furniture offer the best quality and eye catching interior ideas our sister company offers totally Bespoke Upholstery.
We strongly believe in selling quality products that will stand the test of time, and none of our furniture is flat packed as all our furniture is either fully assembled or requires slight assembly only for transport purposes.
We carefully select the very best furniture suppliers to ensure quality and confidence with your purchase.
All our sofas and upholstered furniture are handmade by www.nu-trend.co.uk in thier Nottingham workshop, the heart of design led quality British built sofas, to customers individual requirements, with a factory direct price tag.
Some of the more distinguished trade customers are conde nast publishing (vogue magazine), bene bene coffee bars, and more locally rock city/rescue rooms and bodiga bar Nottingham.
Nu-trend'sfactory showroom on site open to the trade and public displaying many of the models with a vast array of fabric and leather pattern books offering endless combinations to create your perfect sofa and you are more than welcome to visit nu-trend's factory to see how well made the sofas are !!
You can also check out Nu-trends facebook page for the latest updates on latest new upholstery Models.
The store is located only 5 minutes from junction 25 off the M1 with ample free parking.
we do not make these designs for any other furniture shops or websites.
Nu-trend also have collections of non upholstered furniture for the living room, dining room, bedroom and study which will complement these stunning sofas and upholstered furniture made from the best furniture suppliers on the market.
Quirky, quality, and most importantly value for money and most of all we only sell furniture that is built to last the test of time and great value for money.


text:
using Microsoft.SharePoint.Client;
using Newtonsoft.Json.Linq;
using OfficeDevPnP.Core.Diagnostics;
using OfficeDevPnP.Core.Framework.Provisioning.Model;
using OfficeDevPnP.Core.Utilities;
using System;
using System.Linq;
using OfficeDevPnP.Core.Utilities.CanvasControl;
using OfficeDevPnP.Core.Framework.Provisioning.ObjectHandlers.TokenDefinitions;
using System.Collections.Generic;
using Newtonsoft.Json;
using OfficeDevPnP.Core.Framework.Provisioning.ObjectHandlers.Extensions;
using OfficeDevPnP.Core.Framework.Provisioning.ObjectHandlers.Utilities;
using Microsoft.Online.SharePoint.TenantManagement;
using System.Globalization;

namespace OfficeDevPnP.Core.Framework.Provisioning.ObjectHandlers
{
#if !SP2013 && !SP2016
    internal class ObjectClientSidePages : ObjectHandlerBase
    {
        private const string ContentTypeIdField = "ContentTypeId";
        private const string FileRefField = "FileRef";
        private const string SPSitePageFlagsField = "_SPSitePageFlags";
        private static readonly Guid MultilingualPagesFeature = new Guid("24611c05-ee19-45da-955f-6602264abaf8");
        private static readonly Guid MixedRealityFeature = new Guid("2ac9c540-6db4-4155-892c-3273957f1926");

        public override string Name
        {
            get { return "ClientSidePages"; }
        }

        public override string InternalName => "ClientSidePages";

        public override TokenParser ProvisionObjects(Web web, ProvisioningTemplate template, TokenParser parser, ProvisioningTemplateApplyingInformation applyingInformation)
        {
            using (var scope = new PnPMonitoredScope(this.Name))
            {
                web.EnsureProperties(w => w.ServerRelativeUrl);

                // determine pages library
                string pagesLibrary = "SitePages";

                var pagesLibraryList = web.GetListByUrl(pagesLibrary, p => p.RootFolder);

                List<string> preCreatedPages = new List<string>();

                // Ensure the needed languages are enabled on the site
                EnsureWebLanguages(web, template, scope);
#if !SP2019
                // Ensure spaces is enabled
                EnsureSpaces(web, template, scope);
#endif

                var currentPageIndex = 0;
                // pre create the needed pages so we can fill the needed tokens which might be used later on when we put web parts on those pages
                foreach (var clientSidePage in template.ClientSidePages)
                {
                    var preCreatedPage = PreCreatePage(web, template, parser, clientSidePage, pagesLibrary, pagesLibraryList, ref currentPageIndex);
                    if (preCreatedPage != null)
                    {
                        preCreatedPages.Add(preCreatedPage);
                    }

                    if (clientSidePage.Translations.Any())
                    {
                        Pages.ClientSidePage page = null;
                        string pageName = DeterminePageName(parser, clientSidePage);
                        if (clientSidePage.Layout == "Article" && clientSidePage.PromoteAsTemplate)
                        {
                            // Get the existing template page
                            page = web.LoadClientSidePage($"{Pages.ClientSidePage.GetTemplatesFolder(pagesLibraryList)}/{pageName}");
                        }
                        else
                        {
                            // Get the existing page
                            page = web.LoadClientSidePage(pageName);
                        }

                        if (page != null)
                        {

                            Pages.TranslationStatusCollection availableTranslations = page.Translations();

                            // Trigger the creation of the translated pages
                            Pages.TranslationStatusCreationRequest tscr = new Pages.TranslationStatusCreationRequest();
                            foreach (var translatedClientSidePage in clientSidePage.Translations)
                            {
                                if (availableTranslations.Items.Where(p => p.Culture.Equals(new CultureInfo(translatedClientSidePage.LCID).Name, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault() == null)
                                {
                                    tscr.AddLanguage(translatedClientSidePage.LCID);
                                }
                            }

                            Pages.TranslationStatusCollection translationResults = null;
                            if (tscr.LanguageCodes != null && tscr.LanguageCodes.Count > 0)
                            {
                                translationResults = page.GenerateTranslations(tscr);
                            }

                            IEnumerable<Pages.TranslationStatus> combinedTranslationResults = new List<Pages.TranslationStatus>();

                            // Translation results will contain all available pages when ran
                            if (translationResults != null && translationResults.Items.Count > 0)
                            {
                                combinedTranslationResults = combinedTranslationResults.Union(translationResults.Items);
                            }
                            // No new translations generated, so take what we got as available translations
                            else if (availableTranslations != null && availableTranslations.Items.Count > 0)
                            {
                                combinedTranslationResults = combinedTranslationResults.Union(availableTranslations.Items);
                            }

                            foreach (var createdTranslation in combinedTranslationResults)
                            {
                                string url = UrlUtility.Combine(web.ServerRelativeUrl, createdTranslation.Path.DecodedUrl);
                                preCreatedPages.Add(url);
                                // Load up page tokens for these translations
                                var file = web.GetFileByServerRelativePath(ResourcePath.FromDecodedUrl(url));
                                web.Context.Load(file, f => f.UniqueId, f => f.ServerRelativePath);
                                web.Context.ExecuteQueryRetry();

                                // Fill token
                                var pageUrlForToken = file.ServerRelativePath.DecodedUrl.Substring(web.ServerRelativeUrl.Length).TrimStart("/".ToCharArray());
                                parser.AddToken(new PageUniqueIdToken(web, pageUrlForToken, file.UniqueId));
                                parser.AddToken(new PageUniqueIdEncodedToken(web, pageUrlForToken, file.UniqueId));
                            }
                        }
                    }
                }

                currentPageIndex = 0;
                // Iterate over the pages and create/update them
                foreach (var clientSidePage in template.ClientSidePages)
                {
                    CreatePage(web, template, parser, scope, clientSidePage, pagesLibrary, pagesLibraryList, ref currentPageIndex, preCreatedPages);

                    if (clientSidePage.Translations.Any())
                    {
                        foreach (var translatedClientSidePage in clientSidePage.Translations)
                        {
                            CreatePage(web, template, parser, scope, translatedClientSidePage, pagesLibrary, pagesLibraryList, ref currentPageIndex, preCreatedPages);
                        }
                    }
                }
            }

            WriteMessage("Done processing Client Side Pages", ProvisioningMessageType.Completed);
            return parser;
        }

#if !SP2019
        private static void EnsureSpaces(Web web, ProvisioningTemplate template, PnPMonitoredScope scope)
        {
            var spacesPages = template.ClientSidePages.Where(p => p.Layout != null && p.Layout.Equals(Pages.ClientSidePageLayoutType.Spaces.ToString(), StringComparison.InvariantCultureIgnoreCase));
            if (spacesPages.Any())
            {
                try
                {
                    // Enable the MUI feature
                    web.ActivateFeature(ObjectClientSidePages.MixedRealityFeature);
                }
                catch (Exception ex)
                {
                    scope.LogError($"Mixed reality feature could not be enabled: {ex.Message}");
                    throw;
                }
            }
        }
#endif

        private static void EnsureWebLanguages(Web web, ProvisioningTemplate template, PnPMonitoredScope scope)
        {
            List<int> neededLanguages = new List<int>();
            int neededSourceLanguage = 0;

            foreach (var page in template.ClientSidePages.Where(p => p.Translations.Any()))
            {
                if (neededSourceLanguage == 0)
                {
                    neededSourceLanguage = page.LCID;
                }
                else
                {
                    // Source language should be the same for all pages in the template
                    if (neededSourceLanguage != page.LCID)
                    {
                        string error = "The pages in this template are based upon multiple source languages while all pages in a site must have the same source language";
                        scope.LogError(error);
                        throw new Exception(error);
                    }
                }

                foreach(var translatedPage in page.Translations)
                {
                    if (!neededLanguages.Contains(translatedPage.LCID))
                    {
                        neededLanguages.Add(translatedPage.LCID);
                    }
                }
            }

            // No translations found, bail out
            if (neededLanguages.Count == 0)
            {
                return;
            }

            try
            {
                // Enable the MUI feature
                web.ActivateFeature(ObjectClientSidePages.MultilingualPagesFeature);
            }
            catch(Exception ex)
            {
                scope.LogError($"Multilingual pages feature could not be enabled: {ex.Message}");
                throw;
            }

            // Check the "source" language
            web.EnsureProperties(p => p.Language, p => p.IsMultilingual);
            int sourceLanguage = Convert.ToInt32(web.Language);
            if (sourceLanguage != neededSourceLanguage)
            {
                string error = $"The web has source language {sourceLanguage} while the template expects {neededSourceLanguage}";
                scope.LogError(error);
                throw new Exception(error);
            }

            // Ensure the needed languages are available on this site
            if (!web.IsMultilingual)
            {
                web.IsMultilingual = true;
                web.Context.Load(web, w => w.SupportedUILanguageIds);
                web.Update();
            }
            else
            {
                web.Context.Load(web, w => w.SupportedUILanguageIds);
            }
            web.Context.ExecuteQueryRetry();

            var supportedLanguages = web.SupportedUILanguageIds;
            bool languageAdded = false;
            foreach(var language in neededLanguages)
            {
                if (!supportedLanguages.Contains(language))
                {
                    web.AddSupportedUILanguage(language);
                    languageAdded = true;
                }
            }

            if (languageAdded)
            {
                web.Update();
                web.Context.ExecuteQueryRetry();
            }
        }

        private void CreatePage(Web web, ProvisioningTemplate template, TokenParser parser, PnPMonitoredScope scope, BaseClientSidePage clientSidePage, string pagesLibrary, List pagesLibraryList, ref int currentPageIndex, List<string> preCreatedPages)
        {
            string pageName = DeterminePageName(parser, clientSidePage);
            string url = $"{pagesLibrary}/{pageName}";

            if (clientSidePage.Layout == "Article" && clientSidePage.PromoteAsTemplate)
            {
                if (clientSidePage is TranslatedClientSidePage)
                {
                    url = $"{pagesLibrary}/{pageName}";
                }
                else
                {
                    url = $"{pagesLibrary}/{Pages.ClientSidePage.GetTemplatesFolder(pagesLibraryList)}/{pageName}";
                }
            }

            // Write page level status messages, needed in case many pages are provisioned
            currentPageIndex++;
            int totalPages = 0;
            foreach(var p in template.ClientSidePages)
            {
                totalPages++;
                if (p.Translations.Any())
                {
                    totalPages += p.Translations.Count();
                }
            }
            WriteSubProgress("Provision ClientSidePage", pageName, currentPageIndex, totalPages);

            url = UrlUtility.Combine(web.ServerRelativeUrl, url);

            var exists = true;
            try
            {
                var file = web.GetFileByServerRelativePath(ResourcePath.FromDecodedUrl(url));
                web.Context.Load(file);
                web.Context.ExecuteQueryRetry();
            }
            catch (ServerException ex)
            {
                if (ex.ServerErrorTypeName == "System.IO.FileNotFoundException")
                {
                    exists = false;
                }
            }

            Pages.ClientSidePage page = null;
            if (exists)
            {
                if (clientSidePage.Overwrite || preCreatedPages.Contains(url))
                {
                    if (clientSidePage.Layout == "Article" && clientSidePage.PromoteAsTemplate)
                    {
                        // Get the existing template page
                        if (clientSidePage is TranslatedClientSidePage)
                        {
                            page = web.LoadClientSidePage($"{pageName}");
                        }
                        else
                        {
                            page = web.LoadClientSidePage($"{Pages.ClientSidePage.GetTemplatesFolder(pagesLibraryList)}/{pageName}");
                        }
                    }
                    else
                    {
                        // Get the existing page
                        page = web.LoadClientSidePage(pageName);
                    }

                    // Clear the page
                    page.ClearPage();
                }
                else
                {
                    scope.LogWarning(CoreResources.Provisioning_ObjectHandlers_ClientSidePages_NoOverWrite, pageName);
                    return;
                }
            }
            else
            {
                // Create new client side page
                page = web.AddClientSidePage(pageName);
            }

            // Set page title
            string newTitle = parser.ParseString(clientSidePage.Title);
            if (page.PageTitle != newTitle)
            {
                page.PageTitle = newTitle;
            }

            // Set page layout
            if (!string.IsNullOrEmpty(clientSidePage.Layout))
            {
                page.LayoutType = (Pages.ClientSidePageLayoutType)Enum.Parse(typeof(Pages.ClientSidePageLayoutType), clientSidePage.Layout);
            }

            // Page Header
            if (clientSidePage.Header != null
#if !SP2019
                && page.LayoutType != Pages.ClientSidePageLayoutType.Topic
#endif
                )
            {
                switch (clientSidePage.Header.Type)
                {
                    case ClientSidePageHeaderType.None:
                        {
                            page.RemovePageHeader();
                            break;
                        }
                    case ClientSidePageHeaderType.Default:
                        {
                            page.SetDefaultPageHeader();
                            break;
                        }
                    case ClientSidePageHeaderType.Custom:
                        {
                            var serverRelativeImageUrl = parser.ParseString(clientSidePage.Header.ServerRelativeImageUrl);
                            if (clientSidePage.Header.TranslateX.HasValue && clientSidePage.Header.TranslateY.HasValue)
                            {
                                page.SetCustomPageHeader(serverRelativeImageUrl, clientSidePage.Header.TranslateX.Value, clientSidePage.Header.TranslateY.Value);
                            }
                            else
                            {
                                page.SetCustomPageHeader(serverRelativeImageUrl);
                            }

                            page.PageHeader.LayoutType = (Pages.ClientSidePageHeaderLayoutType)Enum.Parse(typeof(ClientSidePageHeaderLayoutType), clientSidePage.Header.LayoutType.ToString());
#if !SP2019
                            page.PageHeader.TextAlignment = (Pages.ClientSidePageHeaderTitleAlignment)Enum.Parse(typeof(ClientSidePageHeaderTextAlignment), clientSidePage.Header.TextAlignment.ToString());
                            page.PageHeader.ShowTopicHeader = clientSidePage.Header.ShowTopicHeader;
                            page.PageHeader.ShowPublishDate = clientSidePage.Header.ShowPublishDate;
                            page.PageHeader.TopicHeader = clientSidePage.Header.TopicHeader;
                            page.PageHeader.AlternativeText = clientSidePage.Header.AlternativeText;
                            page.PageHeader.Authors = clientSidePage.Header.Authors;
                            page.PageHeader.AuthorByLine = clientSidePage.Header.AuthorByLine;
                            page.PageHeader.AuthorByLineId = clientSidePage.Header.AuthorByLineId;
#endif
                            break;
                        }
                }
            }

            if (!string.IsNullOrEmpty(clientSidePage.ThumbnailUrl))
            {
                page.ThumbnailUrl = parser.ParseString(clientSidePage.ThumbnailUrl);
            }

            // Add content on the page, not needed for repost pages
            if (page.LayoutType != Pages.ClientSidePageLayoutType.RepostPage)
            {
                // Load existing available controls
                var componentsToAdd = page.AvailableClientSideComponents().ToList();

                // if no section specified then add a default single column section
                if (!clientSidePage.Sections.Any())
                {
                    clientSidePage.Sections.Add(new CanvasSection() { Type = CanvasSectionType.OneColumn, Order = 10 });
                }

                int sectionCount = -1;
                // Apply the "layout" and content
                foreach (var section in clientSidePage.Sections)
                {
                    // Skip topic page header control section
                    if (section.Order == 999999)
                    {
                        continue;
                    }

                    sectionCount++;
                    switch (section.Type)
                    {
                        case CanvasSectionType.OneColumn:
                            page.AddSection(Pages.CanvasSectionTemplate.OneColumn, section.Order, (Int32)section.BackgroundEmphasis);
                            break;
                        case CanvasSectionType.OneColumnFullWidth:
                            page.AddSection(Pages.CanvasSectionTemplate.OneColumnFullWidth, section.Order, (Int32)section.BackgroundEmphasis);
                            break;
                        case CanvasSectionType.TwoColumn:
                            page.AddSection(Pages.CanvasSectionTemplate.TwoColumn, section.Order, (Int32)section.BackgroundEmphasis);
                            break;
                        case CanvasSectionType.ThreeColumn:
                            page.AddSection(Pages.CanvasSectionTemplate.ThreeColumn, section.Order, (Int32)section.BackgroundEmphasis);
                            break;
                        case CanvasSectionType.TwoColumnLeft:
                            page.AddSection(Pages.CanvasSectionTemplate.TwoColumnLeft, section.Order, (Int32)section.BackgroundEmphasis);
                            break;
                        case CanvasSectionType.TwoColumnRight:
                            page.AddSection(Pages.CanvasSectionTemplate.TwoColumnRight, section.Order, (Int32)section.BackgroundEmphasis);
                            break;
#if !SP2019
                        case CanvasSectionType.OneColumnVerticalSection:
                            page.AddSection(Pages.CanvasSectionTemplate.OneColumnVerticalSection, section.Order, (Int32)section.BackgroundEmphasis, (Int32)section.VerticalSectionEmphasis);
                            break;
                        case CanvasSectionType.TwoColumnVerticalSection:
                            page.AddSection(Pages.CanvasSectionTemplate.TwoColumnVerticalSection, section.Order, (Int32)section.BackgroundEmphasis, (Int32)section.VerticalSectionEmphasis);
                            break;
                        case CanvasSectionType.TwoColumnLeftVerticalSection:
                            page.AddSection(Pages.CanvasSectionTemplate.TwoColumnLeftVerticalSection, section.Order, (Int32)section.BackgroundEmphasis, (Int32)section.VerticalSectionEmphasis);
                            break;
                        case CanvasSectionType.TwoColumnRightVerticalSection:
                            page.AddSection(Pages.CanvasSectionTemplate.TwoColumnRightVerticalSection, section.Order, (Int32)section.BackgroundEmphasis, (Int32)section.VerticalSectionEmphasis);
                            break;
                        case CanvasSectionType.ThreeColumnVerticalSection:
                            page.AddSection(Pages.CanvasSectionTemplate.ThreeColumnVerticalSection, section.Order, (Int32)section.BackgroundEmphasis, (Int32)section.VerticalSectionEmphasis);
                            break;
#endif
                        default:
                            page.AddSection(Pages.CanvasSectionTemplate.OneColumn, section.Order, (Int32)section.BackgroundEmphasis);
                            break;
                    }

                    // Add controls to the section
                    if (section.Controls.Any())
                    {
                        // Safety measure: reset column order to 1 for columns marked with 0 or lower
                        foreach (var control in section.Controls.Where(p => p.Column <= 0).ToList())
                        {
                            control.Column = 1;
                        }

                        foreach (CanvasControl control in section.Controls)
                        {
                            Pages.ClientSideComponent baseControl = null;

                            // Is it a text control?
                            if (control.Type == WebPartType.Text)
                            {
                                Pages.ClientSideText textControl = new Pages.ClientSideText();
                                if (control.ControlProperties.Any())
                                {
                                    var textProperty = control.ControlProperties.First();
                                    textControl.Text = parser.ParseString(textProperty.Value);
                                }
                                else
                                {
                                    if (!string.IsNullOrEmpty(control.JsonControlData))
                                    {
                                        var json = JsonConvert.DeserializeObject<Dictionary<string, string>>(control.JsonControlData);

                                        if (json.Count > 0)
                                        {
                                            textControl.Text = parser.ParseString(json.First().Value);
                                        }
                                    }
                                }
                                // Reduce column number by 1 due 0 start indexing
                                page.AddControl(textControl, page.Sections[sectionCount].Columns[control.Column - 1], control.Order);

                            }
                            // It is a web part
                            else
                            {
                                // apply token parsing on the web part properties
                                control.JsonControlData = parser.ParseString(control.JsonControlData);

                                // perform processing of web part properties (e.g. include listid property based list title property)
                                var webPartPostProcessor = CanvasControlPostProcessorFactory.Resolve(control);
                                webPartPostProcessor.Process(control, page);

                                // Is a custom developed client side web part (3rd party)
                                if (control.Type == WebPartType.Custom)
                                {
                                    if (!string.IsNullOrEmpty(control.CustomWebPartName))
                                    {
                                        baseControl = componentsToAdd.FirstOrDefault(p => p.Name.Equals(control.CustomWebPartName, StringComparison.InvariantCultureIgnoreCase));
                                    }
                                    else if (control.ControlId != Guid.Empty)
                                    {
                                        baseControl = componentsToAdd.FirstOrDefault(p => p.Id.Equals($"{{{control.ControlId.ToString()}}}", StringComparison.CurrentCultureIgnoreCase));

                                        if (baseControl == null)
                                        {
                                            baseControl = componentsToAdd.FirstOrDefault(p => p.Id.Equals(control.ControlId.ToString(), StringComparison.InvariantCultureIgnoreCase));
                                        }
                                    }
                                }
                                // Is an OOB client side web part (1st party)
                                else
                                {
                                    string webPartName = "";
                                    switch (control.Type)
                                    {
                                        case WebPartType.Image:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.Image);
                                            break;
#if !SP2019
                                        case WebPartType.BingMap:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.BingMap);
                                            break;
                                        case WebPartType.Button:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.Button);
                                            break;
                                        case WebPartType.CallToAction:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.CallToAction);
                                            break;
                                        case WebPartType.GroupCalendar:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.GroupCalendar);
                                            break;
                                        case WebPartType.News:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.News);
                                            break;
                                        case WebPartType.PowerBIReportEmbed:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.PowerBIReportEmbed);
                                            break;
                                        case WebPartType.Sites:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.Sites);
                                            break;
                                        case WebPartType.MicrosoftForms:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.MicrosoftForms);
                                            break;
                                        case WebPartType.ClientWebPart:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.ClientWebPart);
                                            break;
#endif
                                        case WebPartType.ContentEmbed:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.ContentEmbed);
                                            break;
                                        case WebPartType.ContentRollup:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.ContentRollup);
                                            break;
                                        case WebPartType.DocumentEmbed:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.DocumentEmbed);
                                            break;
                                        case WebPartType.Events:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.Events);
                                            break;
                                        case WebPartType.Hero:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.Hero);
                                            break;
                                        case WebPartType.ImageGallery:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.ImageGallery);
                                            break;
                                        case WebPartType.LinkPreview:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.LinkPreview);
                                            break;
                                        case WebPartType.List:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.List);
                                            break;
                                        case WebPartType.NewsFeed:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.NewsFeed);
                                            break;
                                        case WebPartType.NewsReel:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.NewsReel);
                                            break;
                                        case WebPartType.PageTitle:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.PageTitle);
                                            break;
                                        case WebPartType.People:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.People);
                                            break;
                                        case WebPartType.QuickChart:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.QuickChart);
                                            break;
                                        case WebPartType.QuickLinks:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.QuickLinks);
                                            break;
                                        case WebPartType.SiteActivity:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.SiteActivity);
                                            break;
                                        case WebPartType.VideoEmbed:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.VideoEmbed);
                                            break;
                                        case WebPartType.YammerEmbed:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.YammerEmbed);
                                            break;
                                        case WebPartType.CustomMessageRegion:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.CustomMessageRegion);
                                            break;
                                        case WebPartType.Divider:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.Divider);
                                            break;
                                        case WebPartType.Spacer:
                                            webPartName = Pages.ClientSidePage.ClientSideWebPartEnumToName(Pages.DefaultClientSideWebParts.Spacer);
                                            break;
                                    }

                                    baseControl = componentsToAdd.FirstOrDefault(p => p.Name.Equals(webPartName, StringComparison.InvariantCultureIgnoreCase));
                                }

                                if (baseControl != null)
                                {
                                    Pages.ClientSideWebPart myWebPart = new Pages.ClientSideWebPart(baseControl)
                                    {
                                        Order = control.Order
                                    };

                                    if (!String.IsNullOrEmpty(control.JsonControlData))
                                    {
                                        var json = JsonConvert.DeserializeObject<JObject>(control.JsonControlData);
                                        if (json["instanceId"] != null && json["instanceId"].Type != JTokenType.Null)
                                        {
                                            if (Guid.TryParse(json["instanceId"].Value<string>(), out Guid instanceId))
                                            {
                                                myWebPart.instanceId = instanceId;
                                            }
                                        }
                                    }

                                    // Reduce column number by 1 due 0 start indexing
                                    page.AddControl(myWebPart, page.Sections[sectionCount].Columns[control.Column - 1], control.Order);

                                    // set properties using json string
                                    if (!String.IsNullOrEmpty(control.JsonControlData))
                                    {
                                        myWebPart.PropertiesJson = control.JsonControlData;
                                    }

                                    // set using property collection
                                    if (control.ControlProperties.Any())
                                    {
                                        // grab the "default" properties so we can deduct their types, needed to correctly apply the set properties
                                        var controlManifest = JObject.Parse(baseControl.Manifest);
                                        JToken controlProperties = null;
                                        if (controlManifest != null)
                                        {
                                            controlProperties = controlManifest.SelectToken("preconfiguredEntries[0].properties");
                                        }

                                        foreach (var property in control.ControlProperties)
                                        {
                                            Type propertyType = typeof(string);

                                            if (controlProperties != null)
                                            {
                                                var defaultProperty = controlProperties.SelectToken(property.Key, false);
                                                if (defaultProperty != null)
                                                {
                                                    propertyType = Type.GetType($"System.{defaultProperty.Type.ToString()}");

                                                    if (propertyType == null)
                                                    {
                                                        if (defaultProperty.Type.ToString().Equals("integer", StringComparison.InvariantCultureIgnoreCase))
                                                        {
                                                            propertyType = typeof(int);
                                                        }
                                                    }
                                                }
                                            }

                                            myWebPart.Properties[property.Key] = JToken.FromObject(Convert.ChangeType(parser.ParseString(property.Value), propertyType));
                                        }
                                    }
                                }
                                else
                                {
                                    scope.LogWarning(CoreResources.Provisioning_ObjectHandlers_ClientSidePages_BaseControlNotFound, control.ControlId, control.CustomWebPartName);
                                }
                            }
                        }
                    }
                }
            }

#if !SP2019
            // Handle the header controls in the topic pages
            if (page.LayoutType == Pages.ClientSidePageLayoutType.Topic)
            {
                var headerControlSection = clientSidePage.Sections.FirstOrDefault(p => p.Order == 999999);
                if (headerControlSection != null)
                {
                    // Ensure there's at least one default section available
                    if (!page.Sections.Any())
                    {
                        page.Sections.Add(new Pages.CanvasSection(page, Pages.CanvasSectionTemplate.OneColumn, 0));
                    }

                    // Clear existing header controls as they'll be overwritten
                    page.HeaderControls.Clear();

                    // Load existing available controls
                    var componentsToAdd = page.AvailableClientSideComponents().ToList();

                    int order = 1;
                    foreach (var headerControl in headerControlSection.Controls)
                    {
                        Pages.ClientSideComponent baseControl = null;
                        // apply token parsing on the web part properties
                        headerControl.JsonControlData = parser.ParseString(headerControl.JsonControlData);

                        if (headerControl.Type == WebPartType.Custom)
                        {
                            // Find the base control installed to the current site
                            baseControl = componentsToAdd.FirstOrDefault(p => p.Id.Equals($"{{{headerControl.ControlId.ToString()}}}", StringComparison.CurrentCultureIgnoreCase));
                            if (baseControl == null)
                            {
                                baseControl = componentsToAdd.FirstOrDefault(p => p.Id.Equals(headerControl.ControlId.ToString(), StringComparison.InvariantCultureIgnoreCase));
                            }

                            if (baseControl != null)
                            {
                                Pages.ClientSideWebPart myWebPart = new Pages.ClientSideWebPart(baseControl)
                                {
                                    Order = headerControl.Order,
                                    IsHeaderControl = true
                                };

                                if (!String.IsNullOrEmpty(headerControl.JsonControlData))
                                {
                                    var json = JsonConvert.DeserializeObject<JObject>(headerControl.JsonControlData);
                                    if (json["instanceId"] != null && json["instanceId"].Type != JTokenType.Null)
                                    {
                                        if (Guid.TryParse(json["instanceId"].Value<string>(), out Guid instanceId))
                                        {
                                            myWebPart.instanceId = instanceId;
                                        }
                                    }

                                    if (json["dataVersion"] != null && json["dataVersion"].Type != JTokenType.Null)
                                    {

                                        myWebPart.dataVersion = json["dataVersion"].Value<string>();
                                    }
                                }

                                // set properties using json string
                                if (!String.IsNullOrEmpty(headerControl.JsonControlData))
                                {
                                    myWebPart.PropertiesJson = headerControl.JsonControlData;
                                }

                                page.AddHeaderControl(myWebPart, order);
                                order++;
                            }
                            else
                            {
                                scope.LogWarning(CoreResources.Provisioning_ObjectHandlers_ClientSidePages_BaseControlNotFound, headerControl.ControlId, headerControl.CustomWebPartName);
                            }

                        }
                    }
                }
            }
#endif

            // Persist the page
            if (clientSidePage.Layout == "Article" && clientSidePage.PromoteAsTemplate)
            {
                page.SaveAsTemplate(pageName.Replace($"{Pages.ClientSidePage.GetTemplatesFolder(pagesLibraryList)}/", ""));
            }
            else
            {
                page.Save(pageName);
            }

            // Update page content type
            bool isDirty = false;
            if (!string.IsNullOrEmpty(clientSidePage.ContentTypeID))
            {
                page.PageListItem[ContentTypeIdField] = clientSidePage.ContentTypeID;
                page.PageListItem.UpdateOverwriteVersion();
                //page.PageListItem.Update();
                web.Context.Load(page.PageListItem);
                isDirty = true;
            }

            if (clientSidePage.PromoteAsTemplate && page.LayoutType == Pages.ClientSidePageLayoutType.Article)
            {
                // Choice field, currently there's only one value possible and that's Template
                page.PageListItem[SPSitePageFlagsField] = ";#Template;#";
                page.PageListItem.UpdateOverwriteVersion();
                //page.PageListItem.Update();
                web.Context.Load(page.PageListItem);
                isDirty = true;
            }

            if (isDirty)
            {
                web.Context.ExecuteQueryRetry();
            }

            if (clientSidePage.FieldValues != null && clientSidePage.FieldValues.Any())
            {
                ListItemUtilities.UpdateListItem(page.PageListItem, parser, clientSidePage.FieldValues, ListItemUtilities.ListItemUpdateType.UpdateOverwriteVersion);
            }

            // Set page property bag values
            if (clientSidePage.Properties != null && clientSidePage.Properties.Any())
            {
                string pageFilePath = page.PageListItem[FileRefField].ToString();
                var pageFile = web.GetFileByServerRelativeUrl(pageFilePath);
                web.Context.Load(pageFile, p => p.Properties);

                foreach (var pageProperty in clientSidePage.Properties)
                {
                    if (!string.IsNullOrEmpty(pageProperty.Key))
                    {
                        pageFile.Properties[pageProperty.Key] = pageProperty.Value;
                    }
                }

                pageFile.Update();
                web.Context.Load(page.PageListItem);
                web.Context.ExecuteQueryRetry();
            }

#if !SP2019
            if (page.LayoutType != Pages.ClientSidePageLayoutType.SingleWebPartAppPage)
            {
                // Set commenting, ignore on pages of the type Home or page templates
                if (page.LayoutType != Pages.ClientSidePageLayoutType.Home && !clientSidePage.PromoteAsTemplate)
                {
                    // Make it a news page if requested
                    if (clientSidePage.PromoteAsNewsArticle)
                    {
                        page.PromoteAsNewsArticle();
                    }
                }

                if (page.LayoutType != Pages.ClientSidePageLayoutType.RepostPage)
                {
                    if (clientSidePage.EnableComments)
                    {
                        page.EnableComments();
                    }
                    else
                    {
                        page.DisableComments();
                    }
                }
            }
#endif

            // Publish page, page templates cannot be published
            if (clientSidePage.Publish && !clientSidePage.PromoteAsTemplate)
            {
                page.Publish();
            }

            // Set any security on the page
            if (clientSidePage.Security != null && clientSidePage.Security.RoleAssignments.Count != 0)
            {
                web.Context.Load(page.PageListItem);
                web.Context.ExecuteQueryRetry();
                page.PageListItem.SetSecurity(parser, clientSidePage.Security, WriteMessage);
            }
        }

        private static string DeterminePageName(TokenParser parser, BaseClientSidePage clientSidePage)
        {
            string pageName;
            if (clientSidePage is ClientSidePage)
            {
                if (clientSidePage.PromoteAsTemplate)
                {
                    pageName = $"{System.IO.Path.GetFileNameWithoutExtension(parser.ParseString((clientSidePage as ClientSidePage).PageName))}.aspx";
                }
                else
                {
                    var parsedPageName = parser.ParseString((clientSidePage as ClientSidePage).PageName);
                    var pageNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(parsedPageName);
                    var pageFolder = System.IO.Path.GetDirectoryName(parsedPageName);
                    if (!string.IsNullOrEmpty(pageFolder))
                    {
                        pageFolder += "/";
                    }

                    pageName = $"{pageFolder}{pageNameWithoutExtension}.aspx";
                }
            }
            else
            {
                pageName = parser.ParseString((clientSidePage as TranslatedClientSidePage).PageName);
            }

            return pageName;
        }

        private string PreCreatePage(Web web, ProvisioningTemplate template, TokenParser parser, BaseClientSidePage clientSidePage, string pagesLibrary, List pagesLibraryList, ref int currentPageIndex)
        {
            string pageName = DeterminePageName(parser, clientSidePage);
            string url = $"{pagesLibrary}/{pageName}";

            if (clientSidePage.Layout == "Article" && clientSidePage.PromoteAsTemplate)
            {
                url = $"{pagesLibrary}/{Pages.ClientSidePage.GetTemplatesFolder(pagesLibraryList)}/{pageName}";
            }

            // Write page level status messages, needed in case many pages are provisioned
            currentPageIndex++;
            WriteSubProgress("ClientSidePage", $"Create {pageName} stub", currentPageIndex, template.ClientSidePages.Count);

            url = UrlUtility.Combine(web.ServerRelativeUrl, url);

            var exists = true;
            try
            {
                var file = web.GetFileByServerRelativePath(ResourcePath.FromDecodedUrl(url));
                web.Context.Load(file, f => f.UniqueId, f => f.ServerRelativePath, f => f.Exists);
                web.Context.ExecuteQueryRetry();

                // Fill token
                parser.AddToken(new PageUniqueIdToken(web, file.ServerRelativePath.DecodedUrl.Substring(web.ServerRelativeUrl.Length).TrimStart("/".ToCharArray()), file.UniqueId));
                parser.AddToken(new PageUniqueIdEncodedToken(web, file.ServerRelativePath.DecodedUrl.Substring(web.ServerRelativeUrl.Length).TrimStart("/".ToCharArray()), file.UniqueId));

                exists = file.Exists;
            }
            catch (ServerException ex)
            {
                if (ex.ServerErrorTypeName == "System.IO.FileNotFoundException")
                {
                    exists = false;
                }
            }

            if (!exists)
            {
                // Pre-create the page
                Pages.ClientSidePage page = web.AddClientSidePage(pageName);

                // Set page layout now, because once it's set, it can't be changed.
                if (!string.IsNullOrEmpty(clientSidePage.Layout))
                {
                    page.LayoutType = (Pages.ClientSidePageLayoutType)Enum.Parse(typeof(Pages.ClientSidePageLayoutType), clientSidePage.Layout);
                }

                if (clientSidePage.Layout == "Article" && clientSidePage.PromoteAsTemplate)
                {
                    page.SaveAsTemplate(pageName);
                }
                else
                {
                    page.Save(pageName);
                }

                var file = web.GetFileByServerRelativePath(ResourcePath.FromDecodedUrl(url));
                web.Context.Load(file, f => f.UniqueId, f => f.ServerRelativePath);
                web.Context.ExecuteQueryRetry();

                // Fill token
                parser.AddToken(new PageUniqueIdToken(web, file.ServerRelativePath.DecodedUrl.Substring(web.ServerRelativeUrl.Length).TrimStart("/".ToCharArray()), file.UniqueId));
                parser.AddToken(new PageUniqueIdEncodedToken(web, file.ServerRelativePath.DecodedUrl.Substring(web.ServerRelativeUrl.Length).TrimStart("/".ToCharArray()), file.UniqueId));

                // Track that we pre-added this page
                return url;
            }

            return null;
        }

        public override ProvisioningTemplate ExtractObjects(Web web, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo)
        {
            using (new PnPMonitoredScope(this.Name))
            {
                // Impossible to return all files in the site currently

                // If a base template is specified then use that one to "cleanup" the generated template model
                if (creationInfo.BaseTemplate != null)
                {
                    template = CleanupEntities(template, creationInfo.BaseTemplate);
                }
            }
            return template;
        }

        private ProvisioningTemplate CleanupEntities(ProvisioningTemplate template, ProvisioningTemplate baseTemplate)
        {
            return template;
        }

        public override bool WillProvision(Web web, ProvisioningTemplate template, ProvisioningTemplateApplyingInformation applyingInformation)
        {
            if (!_willProvision.HasValue)
            {
                _willProvision = template.ClientSidePages.Any();
            }
            return _willProvision.Value;
        }

        public override bool WillExtract(Web web, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo)
        {
            if (!_willExtract.HasValue)
            {
                _willExtract = false;
            }
            return _willExtract.Value;
        }
    }
#endif
        }

redpajama_set_name: RedPajamaGithub


How can I upgrade to the latest version of TradeTrakker?
If you bought a TradeTrakker license in 2014 or later, your serial number will be accepted by TradeTrakker 3. Otherwise you need to buy an upgrade license. Please see TradeTrakker Upgrade web page for more information.
In general, there is no need to uninstall during an upgrade. Just install over your previous version and all data and settings will be preserved.
We strongly encourage you to create a backup of your data files, since you won't be able to open them with an older version of TradeTrakker once these files have been automatically converted to a version 3.0 file format.
How to back up my TradeTrakker data?
By default, TradeTrakker saves its data files inside "TradeTrakker Data" folder, which is located in your Documents folder. Therefore, the simplest backup would be to copy this entire folder to a different location. Moreover, during an automatic upgrade from 2.x to 3.x file format, TradeTrakker creates a backup file with .v20 extension. You can use this file with TradeTrakker 2.x after you rename it back to .ttd extension.
What are the system requirements of TradeTrakker?
Please see TradeTrakker system requirements web page.
How do I track stocks from different exchanges around the world?
TradeTrakker has full support for multiple stock exchanges. The current version of TradeTrakker tracks stocks from many international exchanges and portfolios may be configured for each particular currency and exchange. However, it is not possible at this time to include stocks from different international exchanges in the same portfolio. As a rule of thumb, if the exchange uses a different currency, it must be tracked in a separate portfolio. To configure exchange and currency, go to Portfolio Properties (CTRL+P) and click on the "Market and Currency" tab and select the desired exchange from the list. This portfolio will now be able to track stocks listed on that exchange and prices and totals will be shown in the appropriate currency.
TradeTrakker is not receiving any data. Why?
If you find that TradeTrakker is not retrieving data from the Internet the problem is most likely that your connection is not live or somehow interrupted, or that you are connected to a proxy server. Make sure that you have a live internet connection first. If your browser is working, the problem is usually related to the user connecting to the internet through a proxy server. Go to Edit/Preferences in TradeTrakker and configure it for the proxy server. Use the Help file button in the Preferences dialog box for more information on that.


As a Filipino, it is certainly fun and challenging to be able to study in a foreign country. I anticipated that there would be many challenges in my field of study. However, having been able to go through the university experience have made me realize that it is not so much the difficulty of the subjects that would be a challenge, but rather the little changes to everyday life.
Filipinos are fortunate that the English language is one of our primary languages and one that is used as the main medium of teaching. Students who are able to take on academic opportunities abroad need not worry about communicating with other native The English language speakers. However, being in a foreign university enrolling a number of different nationalities means that you need not only understand The English language as it is taught in the Philippines but also how it is used by other foreigners. It is not unusual to hear other non-native English language speakers and wonder what they are saying.
It will be hard to understand the English language of people from Europe. This is contrary to the perception that all 'white' people are good in The English language. English speakers in the UK also have a different accent and words for everyday items. Checking for regional banter is a must. It will also be hard to understand people with a thick Scottish accent but Scots are particularly polite and will even slow down their speaking for you. Furthermore, it will really be a challenge to understand the English language of our South East Asian neighbours.
If you study in UK, take note about the differences between American and British English. You should change your computer's language to English (UK) and do not attempt to change the spelling of the words – humour, organisation, optimisation, Oxford comma, among others. These is the correct form in UK English.
We have a love-hate relationship with the sun. We long for it during the rainy season and curse it to death during the dry season. There are countries with the same climate as the Philippines and you need not worry if you are in one. However, studying in temperate countries, and other northern/southern countries means that you also have to adjust to the climate; you should not forget that you will also be leaving in the country and the challenges are not just inside the university but are also right outside your door, and often also inside.
I study in Scotland where the heat from the sun is generally less intense. I learned to love the sun because it barely shows itself; you have no choice but to love it when it is there. Winters are generally gloomy as the nights are long and cold, and the sun is almost never out. It is also particularly frustrating to live through the snow. Slippery and muddy roads will haunt you, although it can also bring fun if you know how to ski and are prepared to do it in the middle of the city.
Summer is a different experience altogether and the general problem is the difficulty in getting asleep. An 11 pm sunset and 3 am sunrise mean that there is more sun than you would ever want, and you would need to have heavy curtains just to make sure that you have good sleep hygiene. This also messes up your 'Filipino sense of time' as it is still very bright even at night. I skipped a lot of meals and had to unconsciously overwork since it is still 'day' even at 9 pm. It sounds trivial as one can just look at the clock or sound an alarm but that means that you need to have a lifestyle change when it comes to observing the time. Note: this is different from keeping and managing time, and you have to do it every day unless you really want to skip meals and lose weight unhealthily.
The start of the semester is usually in September – Fall Semester. Temperatures are just beginning to drop and for the first few weeks and I reckon that you will love it. One should be sure to bring a snow-proof jacket and this will usually be very expensive if bought from the Philippines. You should delay your purchase and find a bargain when you arrive in your country of study. It is part of their everyday wear and will be cheaper. The same cannot be said if you are opting for an ukay-ukay purchase as the Philippine version will still be cheaper.
Studying abroad means that you have to live alone and that entails managing your budget, alone. It does not matter if your parents support you financially support you, or if you are using your own savings, or have a scholarship; you will have to budget. You will soon realize that rent and food are the things that you will spend, and should spend, the most on; there is nothing you can do about it as it is your most fundamental need.
You may also have yearned for independence from the onset. However, you may not have anticipated how lonely it can be. You may not have mingled with your family but you may also have taken for granted how it was so convenient that when you go home, everything is ready and you just need to eat, relax, and sleep. The absence of these small little things you will make you realize just how important they are. Do not fret as you will also encounter friends but make no mistake, their dedication to you is different from the dedication of your family to make you at least feel at home.
There are certainly more challenges that you will ever face than I can possibly say in an article but it will all be worthwhile as you learn not only to cope with university, but also learn how to deal with everyday life, interacting with people you are vastly different with.
Lastly, the food. Upon return to the Philippines, I am 100% sure that you will eat more than you will ever want to because Filipino food is the best for us Filipinos.


text:
The Speed of Starlight
Written by Colin Stuart
more titles by Colin Stuart
more titles by Ximo Abadía
An Exploration of Physics, Sound, Light, and Space
author: Colin Stuart
illustrator: Ximo Abadía
Designed to present physics in a totally new way, this book explores the topics of physics, light, and sound alongside incredible artwork from Ximo Abadía. Visualize sonar sound, discover the speed of light, and understand basic quantum physics with easy-to-understand, engaging text by acclaimed science writer Colin Stuart. Impressive design meets exciting content in this title that will truly captivate and inspire.
A contemporary exploration of physics, light, and sound told through stunning graphic artwork.
80 / 10 5/8" x 13 3/8"
Science & Nature;
Colin Stuart is a renowned astronomy speaker and best-selling author. He was a Fellow of the Royal Astronomical Society and a 2014 runner-up for the European Astronomy Journalism Prize. He lives in London.
Ximo Abadía is a highly acclaimed artist whose work was selected for the Bologna Illustrators Exhibition in 2017. He lives in Spain.


Albis Energy Ltd is a Private Company Limited by Shares first registered on 22 July 2014. Its current registered address is in London.
Action Date: 13 July 2018. Category: Confirmation statement. Type: CS01. Barcode: X7CJE494. Transaction: MzIxMjMwODQ2NWFkaXF6a2N4.
Action Date: 31 May 2017. Category: Accounts. Type: AA. Barcode: X70SE0LN. Transaction: MzE5OTA3NTM5NGFkaXF6a2N4.
Action Date: 13 July 2017. Category: Confirmation statement. Type: CS01. Barcode: X6AK8BU1. Transaction: MzE4MDQ2OTg5M2FkaXF6a2N4.
Action Date: 31 May 2016. Category: Accounts. Type: AA. Barcode: X60PPZ54. Transaction: MzE2OTM3OTY5OGFkaXF6a2N4.
Action Date: 23 September 2016. Category: Officers. Type: CH01. Barcode: X5G5YXEO. Transaction: MzE1ODA3OTk2NmFkaXF6a2N4.
Action Date: 23 September 2016. Category: Address. Type: AD01. Barcode: X5G5YWRL. Transaction: MzE1ODA3OTc2MGFkaXF6a2N4.
Action Date: 14 July 2016. Category: Confirmation statement. Type: CS01. Barcode: X5B852VF. Transaction: MzE1MjkyNDg1OGFkaXF6a2N4.
Action Date: 31 May 2015. Category: Accounts. Type: AA. Barcode: X55X48TV. Transaction: MzE0NzUwNTM1MWFkaXF6a2N4.
Action Date: 31 May 2015. Category: Accounts. Type: AA01. Barcode: X53SNUUY. Transaction: MzE0NTA4MjY4NGFkaXF6a2N4.
Action Date: 22 July 2015. Category: Annual return. Type: AR01. Barcode: X4CC0V3C. Transaction: MzEyNzczMzkwMGFkaXF6a2N4.
Category: Incorporation. Type: NEWINC. Barcode: X3CLYT6H. Transaction: MzEwNDA4ODU5OWFkaXF6a2N4.


text:
School Board Again Makes Little Progress on West Broad School
By Blake Aued	@BlakeAued
Two weeks after what Superintendent Demond Means and several school board members termed an embarrassing debate over the fate of the West Broad School, the Clarke County Board of Education tried again May 31. While avoiding the acrimony of the previous conversation, the short-handed BOE—missing Greg Davis, Vernon Payne and Ovita Thornton—also made little progress in deciding what to do with the vacant historic building.
Out of the six members present, only John Knox expressed a preference regarding three proposals for the property (two for community resource centers and one, submitted by the Clarke County School District itself, consisting primarily of early-learning classrooms). The Athens Land Trust's proposal is by far the most detailed, the only one that includes information about funding and shares some elements with the Northeast Georgia Business Alliance's. Knox added that he is dubious about a previous CCSD proposal to convert the school into office space, the administration's top priority of historic preservation isn't aligned with the board's, and the current CCSD proposal doesn't address the ALT's popular West Broad Market Garden on the property, which administrators had previously suggested paving over for parking.
"We've had a tremendous amount of support that cannot be ignored" for the land trust, board member Sarah Ellis said. But Linda Davis—who has been critical of the community garden—said it "feels awkward" to be approached by outside groups about district property. "I hope we would not acquiesce and fold because we have a lot of people here," she said. "A lot of people are not here as well."
The discussion—really, just brief statements by each school board member—was originally supposed to happen in executive session. But on Knox's motion, the board voted 4-2 to open it up the public, with Ellis, Carol Williams and president Jared Bybee in favor, and Linda Davis and Charles Worthy opposed.
The board also voted 5-1 (with Knox opposed) to approve the controversial AVID program, a teaching method intended to improve academic rigor that will be implemented at 18 schools this fall—all but Barrow and Chase Street elementaries and Clarke Central High School. The program comes with a price tag of $511,000 to send 200 teachers to out-of-town training conferences this summer.
Means also asked for $2.7 million over two years to implement a new language arts curriculum in kindergarten through eighth grade, which will be voted on June 7. Currently, the district has eight different reading programs and 13 different assessments in its 18 elementary and middle schools, he said.
Means called the reading and writing curriculum the "most critical" and said, "It is imperative to address inconsistency around the most important topic you can teach young people," comparing the current fractured system to a house's foundation cracking. The new curriculum will also help address issues of equity that have occupied much of Means' and the board's attention over the past 10 months, he said. Other district officials said students who are not on track in reading in third grade end up doing more poorly in school, earning less money, are more likely to commit crimes and have poorer health and shorter life expectancies.
West Broad school, BOE, CCSD, AVID
More by Blake Aued
ACC Commission Approves Downtown Bike Lanes
By Blake Aued | July 10, 2019
Heritage Foundation Names Six Athens Places in Peril
Audit Reveals Staffing Shortage in Sheriff's Department
By Blake Aued | July 3, 2019


For 15+ years our team has been developing multi-year financial forecasts using "rolled up" or summarized data from Annual Financial Reports (AFRs). The new 5Cast platform, which was introduced to the market last year, is driven off of a local government's general ledger…providing the opportunity to capture "line item" level of detail. By connecting directly to our client's financial accounting systems, we are now able to get to the lowest level of detail within their chart of accounts. This foundational change is opening up tremendous opportunities for budget analysis and improved forecasting.
During the forecasting process, 5Cast users can model their assumptions at an aggregated level or all the way down to the line item. Clients can also utilize their historical line item data (in tabular or chart form) to guide their forward looking assumptions. The benefits of the additional level of detail in 5Cast opens up great opportunities for data mining historical records, as well as, producing a forecast that can essentially serve as a budget template for the next year.
With the ability to slice the data with low levels of detail, users are able to identify significant trends or visualize outlying data points that would be difficult to find in an "unsliced" tabular view. The data shaping technology in 5Cast is providing many CFOs unprecedented control of their financial data and powerful modeling capabilities that are directly impacting budget decisions.
As previously stated though, the opportunity to maximize the benefit of this analytic technology is directly correlated to the coding strategy employed by the local government. Developing a coding paradigm that utilizes the full account code string unlocks the opportunity to disaggregate and shape the data in a manner that ultimately facilitates the analytic process…and benefits the organization.
If you have not been using all the digits in your account string…now is a great time to start. You can create better history for the organization on the fly. The extra effort invested in the front end of the process will produce better analysis and budgeting opportunities, as well as, a superior multi-year forecast.
For more information on budget analysis and forecasting, call Josh Rader at 630.955.7602 or email him at jrader@forecast5analytics.com.


text:
Watford Liberal Democrats Stop Brexit. Build A Better Future.
Peter Taylor Mayor of Watford
Fix My Issue
Brexit Survey
More police on our streets
Watford Junction rezone!
Object to new motorway service stations
More school places for Watford
Say no to windowless flats
Safety Measures for Horseshoe Lane
Plans launched for £2.5bn Care Closer to Home fund
Posted by Watford Liberal Democrats | Updated 2015-04-10
Lib Dems have launched plans for a £2.5bn "Care Closer to Home" fund. It's designed to help people stay healthier for longer and avoid hospital admissions by investing in care for people in their own homes, GP surgeries, care homes and community clinics.
This £500 million a year plan will put into reality the vision of NHS Chief Executive Simon Stevens which he outlined in his Five Year Forward View for the NHS.
It's clear to most of us by now that pressures on hospitals usually appear because of problems elsewhere in the health system. Elderly people can't be discharged from hospital because they don't have the appropriate care at home, or mums and dads are forced to take their children to A&E because the GP surgery is closed.
The fund will create a fairer society that will mean patients receive the right care, at the right time, in the right place, with them having more control over their treatment and support.
So what exactly will the fund invest in? Well, the Lib Dem plan includes:
Joined up organisations involving hospitals, GPs, mental health and community services. These will make it easier for patients to get the right care, at the right time, in the right place.
Better health care in care homes so older people do not need to go into hospital unnecessarily and can get discharged from hospital more easily
Better access to GP surgeries by getting GPs to work together in 'federations' to resource weekend surgery duty, having more surgeries nearer A&E departments, having more chemists next to surgeries, and additional appointments being made available via email and Skype.
GP surgeries working together to provide care traditionally given in hospitals such as X rays and other diagnostic tests and procedures, so people don't have to travel into hospital.
More use of social prescribing so that people are helped to benefit from social activities like fishing or cookery clubs, or to do exercise or get access to nature.
Patients will get more control over their care with shared budgets for their health and care needs.
This radical 'bottom up' approach will build on the success the Liberal Democrats in government have already achieved on joining up health and care services.
12 ways to volunteer with your Watford Liberal Democrats
It's all hands on deck to build a liberal, tolerant Britain. Please let us know how you can help us in Watford.
Published and promoted by A.J. Wylie on behalf of Ian Stotesbury, Peter Taylor, and the Watford Liberal Democrats, all at 34 Kensington Avenue, Watford WD18 7RY and by Nick Harvey on behalf of the Liberal Democrats all at 8-10 Great George Street, London, SW1P 3AE.