JULY 2018 • FOODSERVICE EQUIPMENT & SUPPLIES • 45 W hat's new in college and university foodservice catering? A lot, as it turns out. How about a dining etiquette class? A Death by Chocolate event? A wed- ding reception? A birthday party? Menus keep changing. Students, faculty and visitors alike expect a more sophisticated culinary experience — no more getting away with plated dry chicken and two sides. Sourcing and ingredient transpar- ency, which began and spread quickly in restaurants, also affects campus cater- ing offerings. Chefs and procurement teams, like their residential and retail dining counterparts, face the challenge of sourcing and showcasing local and regional foods. Add to that the need to accommodate students and visitors who have issues with any of the eight major food allergens. Collegiate catering departments respond to new trends and challenges with creativity and perseverance. A number of directors and managers point to a sea change that transforms catering departments from offering traditional, run-of-the-mill support services to delivering dynamic, crowd- pleasing culinary events. One illustrative example: The University of Notre Dame celebrated its new sports stadium last fall. Invited guests who toured the new facility got a delicious surprise when they reached three stadium boxes on the ninth floor. "In the first box, we had a truffle-mak- ing session going on," explains Sunil Yaradi, director of university catering. "We had truffles displayed like it was a chocolate shop. Chefs would create truffles to order. In another box, our pastry chef created chocolate artwork. In the third box, we had a variety of finished chocolate desserts. We paired them with pink rosé champagne." Yaradi sees the uniqueness of this event as a trend. "We have evolved," he says of campus catering in general. "Guests might have the usual breakfast, lunch and dinner, but they want to end with a really special event." Another example of catering departments spreading their wings to provide services well beyond traditional banquets: At Yale University, catering helps ensure its graduates are savvy about dining etiquette in the outside world by the time they leave campus. The residential dining department sponsors one program, Reality Bites, that the catering arm executes. Classes include training in such skills as how to behave in a restaurant during a business meeting and even how to cook at home. Danielle Shapiro, managing director for Yale Catering, notes that instructors come in from The Culinary Institute of America (CIA) and present classes to help students prepare for life in the world beyond college. BUILDING SALES TO EXTERNAL GROUPS One growth area for many campus catering programs comes from groups or organizations outside of the campus community increasingly tapping college and university catering operations for services. Whether a wedding, birthday party or conference, catering depart- ments keep expanding their services well beyond students and faculty. They remain responsible for the usual cam- pus milestones — recruitment events, faculty and student meetings, recep- tions, and coffee breaks — but more and more, catering sales teams venture off campus to grow business and posi- tion campus catering as the go-to ser- vice for any great culinary experience. At Yale, for example, a three-year- old event sales team focuses on mar- keting campus catering to external companies that need conference or meeting space, according to Christian Fischer, the school's senior director of auxiliary operations, catering and the Culinary Support Center. The outside company, however, does need someone Programs evolve to tap trends, meet operational challenges From top to bottom: This intimate dinner created by the Notre Dame catering team evokes dining in a five-star restaurant. Notre Dame staff plate Coeur à la Crème dessert for an event. Notre Dame's catering department elevated the traditional box lunch for an event honoring Martin Luther King Jr. Three different types of sandwiches were placed alternately on tables with a crock of Roasted Garden Vegetable Soup in the middle for family-style serving.


text:
Tag: Rosario + Vampire
Vampire Books Coming March 2013
Books! Lots of magnificent vampire books! It's March my Dear Readers, and it's time to check out all of the vampire books hitting bookshops this month. There are quite a few goodies coming our way, have a look. (Click titles to view on Amazon) Slashback: A Cal Leandros Novel by Rob Thurman I stopped and…
Continue reading Vampire Books Coming March 2013
Categorized as UncategorizedTagged Akihisa Ikeda, Amelia Atwater-Rhodes, Andrea Sorrentino, Blood and Magick, Carrie Vaughn, Charlie Williams, christopher pike, Deacon Chalk Occult Bounty Hunter, Erik Butler, Gerry Bartlett, Hideyuki Kikuchi, I... Vampire, J.R. Ward, James R. Tuck, Joshua Hale Fialkov, Kitty Rocks the House, Lee Carroll, Lover At Last: A Novel of the Black Dagger Brotherhood, Made of Stone (The Mangel Series), MaryJanice Davidson, Matsuri Hino, Michele Lang, Promises to Keep, Real Vampires Know Hips Happen, Rebel Angels, Rob Thurman, Rosario + Vampire, Rosario+Vampire, Slashback: A Cal Leandros Novel, The Rise of the Vampire, The Shape Stealer, Thirst No. 5: The Sacred Veil, Undead and Underwater, Vampire Book, vampire books, Vampire Hunter D Volume 19: Mercenary Road, vampire knight
Rosario + Vampire Complete Season One Coming to DVD… again
I don't know why, but for some reason, Season 1 of Rosario + Vampire is being rereleased. This highly entertaining, but totally silly, anime came out on DVD a long while back as a limited edition, and on April 23, 2013 it's back again in all new packaging. Description: "Tsukune's terrible grades stick him in…
Continue reading Rosario + Vampire Complete Season One Coming to DVD… again
Categorized as UncategorizedTagged Rosario + Vampire, Rosario+Vampire, vampire anime
Vampire Books Coming April 2012
It's my favorite time again – that time we take a look at all of the fangtastic books coming out this month! This April is packed full of new vampire releases, everything from comics to romance novel to thrillers and more! Lots of awesome is coming our way. Check out the goodies below. (Click titles…
Continue reading Vampire Books Coming April 2012
Categorized as UncategorizedTagged 32 Fangs, Akihisa Ikeda, Alaya Johnson, Assassin's Code: A Joe Ledger Novel, C. C. Hunter, Christopher Farnsworth, David Wellington, Gerry Bartlett, Hunter's Rise (The Hunters), J.N. Duncan, Jonathan Maberry, Julie Kagawa, Let Them Eat Stake: A Vampire Chef Mystery, Real Vampires Hate Skinny Jeans, Red White and Blood, Rosario + Vampire, Sarah Zettel, Shiloh Walker, Simon Balley, Taken at Dusk, The Immortal Rules, The Lingering Dead, The Slayer (Legend Chronicles), Theresa Meyers, Vampire Book, vampire books, Vampire Doodle Diaries, Wicked City: A Zephyr Hollis Novel
Rosario + Vampire: Perfect for the Pervy Anime Lovin' Vampire Fan
I've heard talk about Rosario + Vampire for a while now but just recently gave the silly anime a watch. Based on the Japanese manga series written and illustrated by Akihisa Ikeda, the show tells the same tale of a human boy who accidentally gets enrolled in a school of monsters where he befriends a…
Continue reading Rosario + Vampire: Perfect for the Pervy Anime Lovin' Vampire Fan
Categorized as UncategorizedTagged Akihisa Ikeda, Rosario + Vampire, sexy vampire, vampire anime
We have loads of vampire books coming out this month! April is definitely a good month for all of the vampire-lovin' bookworms out there. There's a little bit of everything – horror, romance, mystery, and even some non-fiction. Check out it out! Sleeping Beauty: Vampire Slayer (Twisted Tales) by Maureen McGowan In this story, Sleeping…
Categorized as UncategorizedTagged Akihisa Ikeda, Annette Blair, Blood Sin: An Awakened By Blood Novel, Christopher Farnsworth, Colleen Gleason, Darkness Has Fallen, Darren Shan, Deadworld, Eternal Kiss: Mark of the Vampire, Forever Vampire, J.N. Duncan, Laura Wright, Marie Treanor, Maureen McGowan, Michele Hauf, Ocean of Blood, Rosario + Vampire, Samantha Cook, Sleeping Beauty: Vampire Slayer, stephenie meyer, Susannah Clements, The President's Vampire, The Saga of Larten Crepsley, The Twilight Saga: The Official Illustrated Guide, The Vampire Defanged: How the Embodiment of Evil Became a Romantic Hero, The Vampire Dimitri, Vampire Book, vampire book month, Vampire Dragon

redpajama_set_name: RedPajamaCommonCrawl


Richard Wilkins was recently awarded an Order of Australia for services to the entertainment industry and his charity work.
Richard is the most recognisable and trusted name in Australian entertainment, with a stellar career of 30+ years since launching MTV Australia in 1987.
Including The Rolling Stones, Madonna, Fleetwood Mac, Bruce Springsteen, Ed Sheehan and everybody else.
We are excited to have Richard Wilkins join us for this remarkable event.


As mentioned in other pages, it will often be necessary to fit a new door frame as well as a new door. This is a relatively straightforward process and begins with measuring the existing brickwork opening to check that one of Wickes hardwood frames, complete with a sill, will fit. The necessary brickwork opening dimensions for Wickes door frames are 6' 10" x 2' 10", 6' 10" x 3' 1" and 7' 0" x 3' 0" with a little clearance all round.but it should be stressed that those dimensions do give about 9mm clearance, so that the frame can be set squarely. Remove the old door and discard it. The old frame was probably installed in one piece when the house was built and will have to be cut out in sections. Start by sawing through both side jambs at an angle. Insert the end of a crowbar or similar lever behind the cut jambs and lever them away from the brickwork and separate them from the head and the sill. Cut through the head and sill in similar fashion and remove them. You may find that the head extends into the brickwork at each end and the sections will have to be pulled out. The resulting holes cannot be used again and should be filled with a cement mortar mix.
Remove all the old nails left in the brickwork and clean up the opening, chopping away any mortar fillets. Check that there is a damp proof course fitted directly below the level of the old sill. If this is damaged it must be replaced. If no damp proof course is in place, fit one. Assemble the new frame knocking the mortise and tenon joints firmly home. Use a waterproof wood adhesive on the joints and screw them together. Only cut the sill if it is too long to fit into the space left by the old one.
Note that Wickes Hardwood frames can be used for inward or outward opening doors, simply by locating the jambs the correct way round on the sill. External doors should open inwards. Insert the assembled frame into the opening. Fit wedges under the sill to push it up against the lintel. Use a spirit level to get the sill perfectly horizontal. Use more wedges to get the jambs upright. Use a spirit level repeatedly to check the vertical alignment.
Measure the frame diagonals to ensure that the frame is perfectly square as Diagram K. Only when they measure exactly the same can you be sure that it is square and some adjustment of the wedges may be necessary to achieve this. Secure the frame to the brick opening using our 8mm x 80mm frame fixers. Drill holes directly through the frame and into the wall. Countersink the holes in the frame. Tap in the fixers and drive home the screws taking care not to distort the frame by driving them in too hard. Avoid siting any fixings where the door hinges are to be situated but do have at least one fixing just above or below the intended position of the lock keep for extra security.
Hang the door before covering the screw heads with a matching wood filler and before making good around the frame. This will enable minor frame positioning adjustments to be made if required.
Use a cement mortar mix to fill in the space under the sill and an external sealant around the jambs and the head.


text:
Why Do We Anthropomorphize the Internet? [Content Made Simple]
Issue #176: Read the crazy, scary story of an innocent man being doxed following a viral video of a crime he didn't commit.
Quick bit of news: I've signed a contract to publish a book with B&H Publishing Group. It is tentatively due out Fall 2021.
Generally, the book is about the effects of the social internet on us, and how to push back on some of the lies we are led to believe by engaging with the social internet. For instance, we are led to believe the lie that "Reality is relative to my beliefs" for a number of reasons, namely that Facebook algorithms create echo chambers in which we are reaffirmed in our beliefs, however wrong they may be, leading some to go as far as sharing conspiracy theories. The book will unpack a number of such phenomena (cancel culture, privacy issues, how we decide what is "important") and provide some tools to be aware of these distortions so that we can fight back against them.
Now, on with the email.
THE INTERNET AS PLACE AND PERSON
We used to talk about the internet like a place to "log on." Now we talk about the internet as a person ("The internet went wild about this cat video."). What led to that shift?
The mobility of the internet increases our interest in personifying it. In the 90s, you had to go into your "computer room" and "boot up" your "desktop" in order to socialize with the Irish deep sea fishing aficionados you met in an AOL chatroom.
Today, to share a picture of the 200-pound marlin you caught this weekend with your buddy O'Donahue, all you have to do is whip out your phone, snap a picture, and upload it to the deep sea fishing subreddit.
Joanne McNeil's book Lurking has been one of my favorite reads of the last year or so. It's a quick read, and I highly recommend it if you're looking to learn how the social internet got to where it is today. Early in the book, she identifies the fact that we, at some point, transitioned from recognizing the internet as a place to recognizing it as a person. In this post, I elaborate on that a bit.
Social Qs #009: Can Social Media Change Hearts and Minds?
Following the major movements in our world right now, will our hearts and minds really have been changed by social media and the social activism on the platforms? We discuss this week.
Link #1: @Breaking911 on Twitter: You Probably Don't Want to Trust This Account
With what feels like endless amounts of "breaking news" dropping every day the last few weeks, @Breaking911 has had a bit of a field day on Twitter. I've seen people sharing the account for a number of years, and have always sorta wondered about what it is and who runs it. This is an interesting article explaining why you may want to be a bit careful as you follow it.
The original Breaking911 account appears to carry the authority (and big-time social following) of a news organization: Its Twitter bio says it provides "breaking news in real time," and its logo and handle resemble major news organizations' breaking news Twitter accounts, such as NBC News's "@BreakingNews" handle. But Breaking911 just aggregates news from other sources, and experts say it has frequently spread misinformation. Though the site is influential enough to merit copycats, it's been unclear until now who runs and contributes to Breaking911 and what editorial standards its staff might adhere to.
Link #2: What Is Elite TikTok?
Just…just read the paragraphs below and be utterly amazed at kids these days.
(Honestly I think this is pretty awesome, and I love seeing how kids get creative with stuff like this.)
Megan, 14, who runs @walmart.department.store, said that acting out scenarios as a multinational corporation is a fun creative exercise. "Some stores date," she said. "They make fake things happen between them. I know Goldfish and Fruit Gushers are dating. I'm pretty sure In-N-Out Burger and some other restaurants are a couple too."
Eleanor, 14, who runs @Swiffer_Official, said that she prefers that TikTok account over her main account. It's lower-stakes and allows her to engage in silly feuds with fake competitors.
"If you're Takis, you try to expose Hot Cheetos because they're your enemies," she said. "You'll find bad reviews of Cheetos online and make a video about them. It's cancel culture, but fun. We all canceled Dasani because no one likes Dasani."
Link #3: What It's Like to Get Doxed for Taking a Bike Ride
This is a wild story, but it unfortunately is more common than you would expect.
By the standards of the pandemic, Thursday had been a normal day for Peter Weinberg. A 49-year-old finance marketing executive, he worked from his home in Bethesda, Maryland, right outside of the District of Columbia, staying busy with Zoom meetings and the new rituals of our socially isolated world.
Then, around 10 p.m., he received an irate message on LinkedIn from someone he didn't know. He brushed it off, thinking it was probably just spam. Then he got another. And another. The third message was particular strange, as it mentioned something about the cops coming to find him. Perplexed, he watched as the messages continued to pile up. They were all so similar: angry, threatening, accusatory. His profile views suddenly soared into the thousands.
Michael Jordan Jamming Out @JordanJamming
MMMBop - Hanson


text:
Rex Garrod (10 September 1943 – 8 April 2019) was an inventor and roboteer notable for building the radio controlled car that starred in Brum, and co-presenting The Secret Life of Machines.
He also entered several successful robots into the early series of British TV series Robot Wars.

Early and personal life
Garrod grew up in Mickfield, Suffolk. He was a speedway rider for the Ipswich Witches (1971) and Scunthorpe Saints (1972–74). He and former motorcross racer Dave Bickers then moved into special effects.

Garrod married Sally in 1992, and they had two daughters. He had Alzheimer's disease for the last eight years of his life, and died on 8 April 2019, aged 75.

Television work

Brum was a British television series which ran intermittently between 1991 and 2002. It told the story of a small car called Brum, which in reality was a giant remote control car. Garrod is credited with both designing and building Brum. He also made devices on the children's programme Teletubbies.

Garrod co-presented Channel 4's The Secret Life of Machines with Tim Hunkin, another inventor from the same county.

Robot Wars
Garrod was Team Leader of Team Cassius, a team of roboteers which entered several robots into Series 1, 2 and 3 of Robot Wars. In addition to the performances of his robots, he was known for his generosity in helping other teams fix their robots.

In Series 1, Team Cassius entered "Recyclopse", which reached the Grand Final but lost to Roadblock.

In Series 2, Team Cassius entered 5th seeded "Cassius", a wedge-shaped robot armed with a front-pivoted flipper. Cassius was the first competitor in the show's history to "self right" (i.e. to turn itself over when it was upside down), and as such Garrod is often credited with inventing the so-called "srimech". Cassius also reached the Grand Final, but lost to Panic Attack.

In Series 3, Team Cassius entered 2nd seeded "Cassius 2", a similar robot to its predecessor "Cassius", which lost to Series 4 runner-up Pussycat in the 2nd round of the heats. His team then quit and never returned to the show, as their complaints about insufficient health and safety precautions were not listened to by the producers.

References

External links
 We Love Rex Garrod on Facebook
 Interview on YouTube

1943 births
2019 deaths
British inventors
Deaths from Alzheimer's disease
Deaths from dementia in England
People from Mid Suffolk District
British speedway riders
Ipswich Witches riders
Scunthorpe Scorpions riders

redpajama_set_name: RedPajamaWikipedia


To install ER/Studio Team Server on a machine that meets the minimum system requirements, you need to run the ER/Studio Team Server installation wizard and follow the steps. In this page you can find detailed information about the different steps of the installation wizard, and suggestions on what to do after the installation.
Note: You need a user with administrative privileges to run the ER/Studio Team Server installation wizard.
Note: Do not install ER/Studio Team Server on a system where ER/Studio Portal or a previous version of ER/Studio Team Server is installed, if the ER/Studio Team Server installation wizard detects an installation of any of these applications it will ask to automatically uninstall these. If ER/Studio Data Architect or ER/Studio Business Architect are installed you must exit the wizard and uninstall these applications. Then, restart the installation wizard.
Check I accept the terms of the license agreement if you do accept them. Otherwise, click Cancel to abort the installation.
Right under the Directory Name field, click Browse to choose the directory where you want to install ER/Studio Team Server. The selected directory must be empty.
Note: If the selected directory is not empty, an error dialog appears. Click OK to close the error dialog, and make sure that the selected directory is empty.
Note: You can enable or disable this feature later, after the installation, using the ER/Studio Team Server Configuration Manager.
In the Host field, enter the host name of the email server (for example: ETMAIL01), the fully qualified network name (for example: ETMAIL01.embarcadero.com), or the IP address (for example: 10.10.23.250).
In the Port field, enter the port number where the email server is listening. The default port is 25.
In the From Address field, enter the email address that you want to use as the sender of the emails sent from ER/Studio Team Server. You may want to prepare a special email address on your email server for this purpose.
Optionally, check "Use Authenticated SMTP" if your email server requires authentication. When you check this option, additional fields appear. Fill User Name and Password with the required values to authenticate ER/Studio Team Server against your STMP server.
In the Host Name field, enter the host name to run the ER/Studio Team Server server (for example: DEWKBROW01), the fully qualified network name (for example: DEWKBROW01.embarcadero.com), or the IP address (for example: 10.10.23.250).
In the Port field, enter the port number where the ER/Studio Team Server server must listen for connections. The default port is 80. If another application on your system is already using the default port (for example, another web-based application), enter an unused port number (a commonly-used alternative is 8).
Tip: Network ports may be a number between 0 and 65535. The ports in use depend on the platform and the services installed on your system. For example, you cannot use 0 or 139 on Windows as they are used for the NetBios Session Service. Higher numbers are less likely to be already in use.
In the Shutdown Port field, enter the port number where the ER/Studio Team Server server must listen for the shutdown command. The default port is 8006. If another application on your system is already using the default port, enter an unused port number.
Note: You can change the shutdown port later, after the installation, using the ER/Studio Team Server Configuration Manager.
In the Windows User field, enter the name of a Windows user that ER/Studio Team Server can use to log in to the system. The user account must have local administrative privileges. The name should be in the format "machine_name\username".
In the User Password field, enter the password of the Windows user.
On the Secure Communications page you can optionally choose to enable SSL and HTTPS. It is recommended that you enable secure communications as this will keep your password transmissions secure.
If you do not have SSL set up on your server, you can click the Self-Signed button to take you through the short wizard which will create a Keystore file allowing you to use encryption.
Fill out the fields of the Self-Signed wizard and click Next. The Keystore file will be created in the location of your choosing.
In the LDAP URL field, enter the URL of the server running LDAP. For example, ldap://10.40.40.94:389 for normal connections, or if you wish to use ldaps://10.40.40.94:636 for secure connections then you can enable this after installation with the ER/Studio Team Server Configuration Manager.
In the Manager DN field, enter the distinguished name for the user that is used to authenticate users. ER/Studio Team Server uses this to connect to the LDAP server and validate user credentials. For example, CN=administrator,CN=Users,DC=mydomain,DC=com.
Note: In this example, administrator has been used. In which case, Users is defined as a container rather than an organizational unit as is the Microsoft Active Directory default. Your user accounts may be in an organizational unit, in this case you would specify it differently, for example, CN=user1,OU=sales,DC=mydomain,DC=com.
On the Test User/Password field, enter the username and password of a sample user to attempt to authenticate against the LDAP server. The installer uses this information to validate the given LDAP information before moving to the next page.
On the Version field, select the corresponding version of the ER/Studio Repository.
On the Repo Server Name field, enter the name of the machine where the ER/Studio Repository is installed.
On the Super User Login field, enter the username for a user with the Super User role in the ER/Studio Repository.
On the Password field, enter the password for the specified user.
Tip: The default username and password for a default Repository installation are: Username 'Admin' and Password 'Admin' (case-sensitive), without the quotes.
On the DBMS Server Type field, select a supported database platform from the list.
On the DBMS Host/Port field, enter the hostname of the machine that contains the ER/Studio Repository database.
Note: For Microsoft SQL Server only, if ER/Studio Repository runs on a Microsoft SQL Server database that is a named instance, specify the host name in the format HostName\NamedInstanceName. For example, DEWKBOW01.embarcadero.com\RepositoryServer.
On the DataBase Name field, enter the name of the ER/Studio Repository database.
Optionally, for Microsoft SQL Server only, you can check "Enable Encryption" to enable the Secure Sockets Layer (SSL) communication protocol, which encrypts messages between ER/Studio Team Server users and the ER/Studio Repository. When SSL is enabled, ER/Studio Team Server uses ports 80 and 443 for secure communications.
On the User Name field, enter the username to access the ER/Studio Repository database.
On the Password field, enter the password for the user specified earlier.
Note: The password fields are preserved when navigating back and forth during the installation process.
After you have entered the required information, click Connect to test the JDBC connection. The Next button, to continue the installation, is disabled until the installer successfully establishes a connection to the ER/Studio Repository and validates the specified username and password.
If ER/Studio Repository and the Reporting Repository are installed on the same database server, you must use different schema owners for each database. There might be naming conflicts between ER/Studio Repository and the Reporting Repository otherwise.
Note: The DBMS server type must match that of the ER/Studio Repository.
On the DBMS Service Host: Port field, enter the hostname and port number of the DBMS Service.
Note: For Microsoft SQL Server only, if the Reporting Repository runs on a Microsoft SQL Server database that is a named instance, specify the host name in the format HostName\NamedInstanceName. For example, DEWKBOW01.embarcadero.com\ReportingRepository.
On the Tablespace field, enter your database tablespace.
On the DBName field, enter your database name.
On the Database Name field, enter your database name.
Optionally, you can check "Enable Encryption" to enable the Secure Sockets Layer (SSL) communication protocol, which encrypts messages between ER/Studio Team Server users and the Reporting Repository.
On the Database Admin User field, enter the username of an Admin User that has the privilege to create reporting database tables, etc.
On the Database Admin Password field, enter the password for the user specified earlier.
Optionally, check "Same as Admin" so that the User Name and Password fields below disappear, and the installer uses the admin username and password specified previously instead.
On the User Name field, enter the username of a user with read and write access to the Reporting Repository database.
Select "Initialize an existing, empty database" if the Reporting Repository database exists and it is empty with no tables. The installation wizard creates the Reporting Repository database schema, so the "Admin" user must have that privilege.
If you are upgrading ER/Studio Team Server, select "Connect to an existing Repository database".
Select "Reinitialize current Repository database" if the Reporting Repository database exists. The installation wizard drops all the Reporting Repository database tables and creates a new database schema, so the "Admin" must have that privilege.
Warning: This is a destructive action.
Click Connect to establish a connection to the Reporting Repository database. After a connection is established, the Next button is enabled.
On the Solution Database page you can specify the details for the Solution Database.
Click Connect to establish a connection to the previously installed Solution Database. After the connection is established, the Next button is enabled. This page will only appear on a reinitialization or connection to an existing installation.
On the Summary Information page review all the summary information. Click Back if you want to make any changes; otherwise, click Install to start the installation process. A panel appears showing the progress of the installation. When the installation wizard finishes, the final page appears.
Note: You may see a message indicating that start up of the Apache Tomcat service is in progress. However this occurs only if the service is still in the process of starting when the installation is complete.
ER/Studio Team Server is now installed on your system.
You can use the ER/Studio Team Server Configuration Manager to prevent Apache Tomcat from interacting with the desktop, so that next time that you start up ER/Studio Team Server, the Apache Tomcat service window does not appear. For more information, see ER/Studio Team Server Configuration Manager.
If any errors occur during the installation, an error page opens, which directs you to the log file located in the directory where you were installing ER/Studio Team Server. For example: C:\Program Files\Embarcadero\Team Server X.X\log.txt.
Manage your ER/Studio Team Server licenses.
This page was last edited on 29 August 2014, at 07:12.


text:
Sex With Minors Lawyer in Kansas
Having sexual intercourse or sexual contact of any kind with a minor is a criminal offense in Kansas. It is a crime that can have serious long-term effects for a survivor, both physically and psychologically. If you or a loved one is a victim of unlawful sex with a minor, please contact our lawyers at DRZ Law to discuss your legal options. Our compassionate Kansas rape victim attorneys offer free and confidential case consultations.
What Is the Age of Consent in Kansas?
The age of consent is the age at which someone is legally considered old enough to have the mental capacity to give his or her informed consent to sexual activity. In Kansas, the age of consent is 16 years old. Anyone who is under 16 cannot legally give his or her consent to sexual conduct or activity. Anyone who engages in sexual intercourse with someone who is 15 or younger is committing statutory rape.
There are no exceptions in Kansas for two people who are close in age (often called a Romeo and Juliet Law). Between the ages of 16 and 18 in Kansas, an individual can legally consent to sexual activity. However, that does not make sex with a minor who is under the age of 18 legal. These crimes can still carry charges, such as aggravated indecent liberties with a child, which in Kansas is a class 3 felony.
Where Does Sex With Minors Occur Most Often in Kansas?
There are many places where a minor may be taken advantage of by sexual abusers in Kansas. Children may be groomed by sexual predators from an early age, such as an adult buying gifts for a child or giving a child special attention. Sex with a minor may also be committed by an older adolescent in various settings. Common examples include:
School sexual abuse. Sex with a minor can take place at a boarding school, private school, public school, military school, or college or university. It can be committed by teachers, coaches or fellow students.
Clergy sexual abuse. Members of the clergy, such as priests and bishops, may use their trusted positions in a religious institution to sexually abuse or rape minors in their congregations.
Medical professional sexual abuse. Although parents trust medical professionals to help their children – not harm them – some pediatricians may take advantage of their positions to assault minor patients.
Regardless of where or how sex with a minor takes place in Kansas, it is a crime that can come with criminal and civil penalties. As a victim or the parent of a victim, you have the right to speak up and hold someone accountable for this egregious act.
What Are Your Legal Rights as a Victim or Parent?
If you or your child has been taken advantage of by someone who engaged in an act of unlawful sexual intercourse with a minor, you may have the right to file a lawsuit against one or more parties. A civil lawsuit can hold an individual or institution accountable for the crime, as well as end in financial compensation for your related losses. Bringing a lawsuit in addition to pressing criminal charges against a perpetrator can give you a greater sense of justice.
Filing a lawsuit against a school district, church, hospital or another institution for the sexual assault of a minor could pay your family for many related expenses, such as medical bills, therapies, pain and suffering, mental and emotional trauma, and legal fees. Holding an institution accountable for sex with a minor rather than only the perpetrator increases the chances of fair and full financial compensation. It can also push for changes to the system, potentially protecting others from the same crimes.
Request a Free Consultation With a Lawyer in Kansas Today
At DRZ Law, our lawyers are specialized in cases that involve sex with minors, and have more than 20 years of experience representing the parents of minors who have been sexually abused, raped and physically harmed. We can help you go up against an institution that betrayed your trust and allowed sex with a minor to occur. Please contact our attorneys about your unlawful sex with a minor case today, to start with a free consultation. We are here for you during this difficult time. Call (913) 400-2033.
Sexual Assault/Abuse Overview
Boarding School Sexual Abuse
Boys & Girls Club Sexual Abuse
College and University Sexual Assault
Foster Care Sexual Abuse
Intellectual Disability Abuse
Military School Abuse
Military School Sexual Abuse
Physical Abuse by Coach
Physical Abuse by Teacher
Priest Sexual Abuse
Private School Sexual Abuse
Public School Sexual Abuse
Rape Victim
Religious Institution Sexual Abuse
Sex With Minors
Sexual Abuse by Another Student
Sexual Abuse by Child Care Providers
Sexual Abuse by Coach
Sexual Abuse by Doctors & Medical Professionals
Sexual Abuse by Teacher
Sexual Abuse in Youth Sports
Sexual Abuse on School Bus
Sports Team Hazing
Statutory Rape Victim
Summer Camp Sexual Abuse
YMCA Sexual Abuse


text:
North Macedonia Passport Ranking
The Macedonian passport currently ranks on the 46th place according to the Guide Passport Ranking Index. It provides visa-free access to 123 countries. This gives it an overall medium mobility score. Macedonian passport holders have visa-free and visas on arrival access to countries such as Brazil, Israel, Turkey and the entire European Union. This allows almost instant travel worldwide. Macedonian passport holders do however require a visa to enter about 106 destinations in the world. Some of the countries where visa is required are China, Japan and the United Kingdom.
The North Macedonia passport ranking relative to other global passports is calculated by adding up the number of countries that allow North Macedonia passport holders to enter without a visa (i.e. visa-free countries) and those that allow North Macedonia passport holders to enter by obtaining a visa on arrival (i.e. visa-on-arrival countries) or an electronic travel authorization (eTA). There are currently a total of 91 North Macedonia passport visa-free countries, 31 North Macedonia visa-on-arrival countries, and 1 eTA destinations.
Altogether, North Macedonia passport holders can enter a total of 123 destinations—either without a visa, through a visa on arrival, or via an eTA. As a result, the North Macedonia passport ranks 46 in the world.
Separate from these North Macedonia visa-free countries and visa-on-arrival countries, there are 106 additional destinations which North Macedonia passport holders either need a physical visa to enter or an eVisa (i.e. visa required countries).
About North Macedonia
The Republic of North Macedonia is a Balkan country consisting of 8 regions. It is located in South Eastern Europe with neighboring countries Albania, Greece, Bulgaria, Serbia and Kosovo. The most important regions are Skopje, Polog and Pelagonia. The nation has a surface area of 25,713 square kilometers and is therefore one of the smaller countries in the continent. The climate is mainly Mediterranean with cold winters and hot, dry summers. Its terrain is characterized with mountains and deep valleys.
The overall population is over 2 million people. The capital of the country is Skopje, which is also the most populous city, followed by Bitola, Kumanovo and Prilep. The largest airport is Skopje International Airport (SKP) with 2.3 million yearly passengers. This makes it the 16th busiest airport in the Balkans. Skopje airport has excellent flight connections to the entire European Union and beyond.
Macedonian culture is dominated by a mix of languages and historic cultural influences. The main belief is the Macedonian Orthodox Religion. The official language is Macedonian. The legal system is the civil law with judicial review of legislative acts. The government type is a parliamentary republic. The head of government is the elected President Stevo Pendarovski and the Prime Minister is Zoran Zaev. The elections take place every 5 years and the president is elected directly by popular vote.
The official currency of the country is the Macedonian Denar (MKD) with the current exchange rate being MKD 51 to the USD. The country has an open economy, generating a GDP of approximately $33 billion. Its citizens have a per capita income of $16,253. Macedonia was able to attract an influx of foreign investment and achieve constant GDP growth. The GDP is mostly made up of 2 key sectors, which are services and industry. Its main goods of export are beverages, textiles, chemicals, grapes, tobacco and vegetables.
Macedonia is filled with a variety of urban and natural tourism destinations and attractions. It is known for its picturesque historic sites and different cultural facets. The country has one UNESCO world heritage site. Some of the major destinations include Mavrovo National Park, Ohrid, Bitola, the capital Skopje, Kratovo, Pelister National Park and Struga. The nation has a total of approximately 1.1 million tourists visiting every year. Most tourists originate from Europe and its surrounding countries making it a very popular destination especially for regional visitors.
North Macedonia Passport Visa Free Countries


text:
The Worst Tick-Borne Diseases in the U.S.
Author: Mosquito Squad of Greater Washington DC
When most people worry about tick-borne diseases, the biggest threat on their radar is typically Lyme disease. However, ticks are the most significant vectors of infectious diseases in the United States, so many other tick-borne illnesses are dangerous to humans. It's just as important to be aware of the signs and symptoms of these diseases so you can spot them and take action in case you, a family member, or friend is infected.
According to the Centers for Disease Control (CDC), these are eight of the most common tick-borne diseases in the United States. Here's what you need to know about each of them. Keep in mind that symptoms vary widely from person to person.
The 8 Worst Tick-Borne Diseases in America
Transmitted by: black-legged tick (deer tick) and western black-legged tick
Geography: Northeast, upper Midwest, and Pacific coast
Symptoms: fever, headache, chills, and muscle aches, typically within 1-2 weeks of the bite
Treatment: doxycycline
Prevalence: 1761 cases in 2010
Fatality Rate: less than 1%
Babesiosis
Transmitted by: black-legged tick (deer tick)
Geography: Northeast and upper Midwest
Symptoms: many do not show symptoms, but those who do have nonspecific flu-like symptoms such as fever, chills, sweats, headache, body aches, loss of appetite, nausea, or fatigue
Treatment: people without symptoms usually do not need to be treated, talk to your doctor
Transmitted by: lone star tick
Geography: southeastern and the south-central U.S.
Symptoms: fever, headache, fatigue, and muscle aches, usually within 1-2 weeks of the bite
Prevalence: 740 cases in 2010
Fatality Rate: 1.1%
Transmitted by: black-legged tick (deer tick) and western backlogged tick
Symptoms: fever, chills, headache, fatigue, muscle and joint aches, swollen lymph nodes, and characteristic rash, 3-30 days after the bite
Treatment: antibiotics, length of course varies
Prevalence: nearly 35,000 cases in 2014
Rocky Mountain Spotted Fever (RMSF)
Transmitted by: American dog tick, Rocky Mountain wood tick, brown dog tick
Geography: most of the contiguous U.S., particularly common in North Carolina, Oklahoma, Arkansas, Tennessee, and Missouri
Symptoms: fever, headache, abdominal pain, vomiting, muscle pain, and sometimes a rash, 2-14 days after the bite
Treatment: doxycycline, most effective if started before the fifth day of symptoms
Fatality Rate: less than 0.5%
Southern Tick-Associated Rash Illness (STARI)
Geography: southeastern and eastern U.S.
Symptoms: red, expanding "bull's-eye" rash of 3 inches or more, within 7 days of bite, fatigue, headache, fever, and muscle pain
Treatment: antibiotics
Tick-Borne Relapsing Fever (TBRF)
Transmitted by: soft tick
Geography: the western U.S., including Arizona, California, Colorado, Idaho, Kansas, Montana, Nevada, New Mexico, Ohio, Oklahoma, Oregon, Texas, Utah, Washington, and Wyoming
Symptoms: recurring episodes of fever, headache, muscle and joint aches, and nausea, associated with sleeping in rustic, rodent-infested cabins in mountainous areas
Treatment: tetracycline
Prevalence: 483 cases between 1990-2011
Transmitted by: dog tick, wood tick, and lone star tick
Geography: throughout the U.S.
Symptoms: fever and various symptoms, depending on the type of disease
Contact DC Mosquito Squad today to control ticks in your backyard as you strive to keep your family protected from possible tick-borne disease infections.


text:
Ing. Zdeněk Patrman (15. března 1927, Rohovládova Bělá – 23. května 2001) byl český statik. Vystudoval liberecké gymnázium a ČVUT v Praze. Od roku 1953 působil v Krajském projektovém ústavu Liberec, následně ve Stavoprojektu Liberec. Odtud musel roku 1960 odejít a stal se zaměstnancem Pozemních staveb Liberec. V roce 1964 si jej však architekt Karel Hubáček vyžádal zpět, aby se spolu mohli věnovat výstavbě hotelu s televizním vysílačem na vrchu Ještědu. Vedle ještědského projektu se podílel i na výstavbě vysílače na slovenské Križavě, na obchodním domě Máj v Praze, na rekonstrukci pražského Veletržního paláce, na skokanských můstcích a věži rozhodčích na Ještědu nebo na výstavbě rezidence českého velvyslanectví v maďarské Budapešti.

Galerie

Odkazy

Reference

Související články
 Ještěd (hotel a vysílač)
 Vodárenská věž Děvín

Externí odkazy

Narození v roce 1927
Úmrtí v roce 2001
Muži
Statici
Čeští stavební inženýři
Narození v Rohovládově Bělé
Úmrtí v Čerčanech


text:
Home2020 AlbumsAlbum Review: Witching – Vernal 10 (Sludge)
Album Review: Witching – Vernal 10 (Sludge)
June 3, 2020 CarcassBOMB 0
Written by Carcassbomb
Witching
Sludge/doom/post-punk
Pennsylvania, America
I've been listening to this album for weeks and it's taken me some time to review it due to worldly circumstances at the moment (Black lives matter way more than promoting music). It's been my go to album lately, up there with Sutrah, Lychgate, Ainsoph and Dyssidia. Witching combine doom sludge music with elements of post punk and post rock. It's gloriously textured.
Artwork by Alex Eckman-Lawn
Just look at it, such a great album cover. Definitely up there in the top 10 of 2020 so far. The artist Alex Echman-Lawn also has a brilliant gallery showcasing his style of making architecture out of heads and heads out of architecture. I love the juxtaposition of stone wall and organic tissue.
Musically, there's two kinds of tones that really shine; the guitar tones and the vocal tones. There's a lot of timing and mood that factor into the composition well. They're intoxicating in their soulfulness. There's a lot stoner and sludge licks that don't sound that different from a more relaxed kind of stoner album but something about their setup and the arrangement makes it so much more active. It's an aggressive record but also, somehow, a wistful one.
Jacqui Powell might just be my favorite vocalist of the year. There's a good range of clean and unclean with an uncanny ability to transition one into the other flawlessly. The cleans remind me a lot of Cold In Berlin who also mesh doom with post punk. The uncleans don't sound like any other I've heard, perhaps you'd be more likely to find similar in hardcore punk but not so much metal. It's a style that emphasises expression over heaviness, allowing for a more dynamic sound overall that doesn't owe it's self to any one particular style.
Witching: Bandcamp / Facebook / Instagram
I can't critique this album, which is not very common, I usually have at least one fault with albums I love. It's a good chunk of time, not too short or long. The space in the music creates a sense of time passing while the tightness of the song writing allows for infinite replayability. I've pretty much enjoyed everything I've heard mastered by Brad Boatright from Audio Siege so I wasn't surprised to see his name attached to Vernal. It's is such an amalgamation of sludge ideas from across the board, showing a fascinating understanding of the sludge/stoner/post metal spectrum from the band and then them working with similarly minded audio engineers cements the competency.
It's difficult to pin Witching down, they sound like an incredible unique force in a well-tread genre, something I admire and respect greatly. I've heard so much bad sludge and I know how challenging it is to create an interesting riff within the genre. Here I think synergy and vision were key. A background in blues groove certainly helps too, a lot went into the refinement of their sound and as a result it will give you a lot to think about.
ENSLAVED release new single "Homebound"
Album Review: Temple of Void – The World That Was (Death Doom)


Here's a great rifle with great power. Includes the Hop-Up system and shoots 0.2g BBs. It has two BB feeding systems. For the fun of motion and action, use the rotary cartridge magazine which holds 5 shells. The shell casing ejects after each shot. Going for the capacity and not the fuss, try the direct feed tube magazine.
Super 9 Pro has an increased muzzle velocity of 370fps (1.27J) with a .2g BB and an effective range of 117ft. Rifle is 47" long and uses a magazine feed cartridge for maximum realism. Magazine capacity is 25 rounds for direct feed, or 5 shells (included). This is a spring gun, which means it's powered by a spring and must be cocked for each shot. It's fast, clean, inexpensive and easily maintained; it requires no gas or batteries to operate. Also, spring guns are the toughest, most durable of all airsoft guns, because they're made with few breakable pieces. If you're looking for a fun, reliable airsoft rifle that'll look great and perform even better, you've come to the right place.


Solo artist Simon Clarke a multi-instrumentalist, ex-band member of Freddie and the Dreamers, world-famous British Invasion 60's band with such international hits as "I'm telling you now" and "You were made for me". He was Freddie's musical director and keyboard player from 1995 - 2001 when Freddie finally decided to retire.
An extremely versatile act that can accommodate the smaller, more intimate parties through to larger venues. The music is timeless and appeals to all age groups from the young to the "young at heart". Simon has done radio interviews for Majic 100 radio, CHIP FM and Valley Heritage Radio to talk about his exciting time spent as a Dreamer.
This dynamic and multi talented solo performer appeals to many possibilities. Simon uses multiple instruments throughout his performance and encourages audience participation to make each performance a memorable occasion.
Available for private parties, corporate parties, weddings and festivals.
Ottawa Talent Agency is proud to represent Simon Clarke and looks forward to helping you plan an event to remember.
A touch of class awaits your next event!
George Formby medley on banjolele - no category for this!


text:
Q: Why does this produce a "Request exceeded the limit of 10 internal redirects"? I can't find why I'm getting the following error:

AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace., referer: < URL >

Could it come from the multiple conditions in .htaccess?
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([^/]+)$ /index.php?id=$2&user=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ /index.php?id=$1 [L]

Order Allow,Deny
Allow from all
Deny from 198.51.100.0 # spammer

<Files "secretdb">
Order Allow,Deny
Deny from all
</Files>

PS: I already read Request exceeded the limit of 10 internal redirects but I don't see the solution.

redpajama_set_name: RedPajamaStackExchange


Texas Secondary can run multi-curve electrical logs (API-Gama Ray (GR), Spontaneous Potential (SP), Resistivity (16N), Resistivity (64N) and Resistivity (FL). These logs are perfect for lithological identification and correlation in South Texas.
Texas Secondary can also run a sophisticated Sonic Log and Caliper to determine porosity.
These logs can be run for a fraction of our competitors' cost.
Copyright 2010 Texas Secondary Oil Corporation. All rights reserved.


Antigonish is a small town with more than its share of cultural riches, including art galleries, theatres and many cafes.
The lively atmosphere is largely thanks to the influence of Saint Francis Xavier university, which calls Antigonish home.
It makes a good stop on the road to Cape Breton and the Cabot Trail or on the way to Pictou and Tatamagouche, along the Northumberland Strait.
Try to time your visit for a Saturday, when food lovers can visit the farmer's market (May to December) and music fans can take in a traditional ceilidh at Pipers Pub (every 2nd Saturday, 33 College Street, 2pm-5pm).
In July, the Highland Games draw in the crowds to Antigonish. This is your chance to watch kilt-clad men toss the caber and participate in other Celtic athletic events. It's the longest continuously running Highland Games in North America.
Antigonish is also home to a summer theatre, Festival Antigonish, while Theatre Antigonish takes over the stage in the autumn. There's a performing arts series too at the university between September and April.
Just out of Antigonish is Mother Webbs. They've been serving up hearty food for nearly 5 decades and the restaurant is conveniently placed right on the Trans-Canada highway.


He Said, She Said: New Year's Eve – Big Bash Or Dinner A Deux?
In Dining Occasions, Inside Restaurant.com On December 31, 2012 Comments Off on He Said, She Said: New Year's Eve – Big Bash Or Dinner A Deux?
In Dining Experiences On December 4, 2012 Comments Off on Eat, Drink and PIN!


text:
r/PeanutButter
6k subscribers
A subreddit for peanut butter, in all its evolution disproving awesomeness. And for all things peanuts and nut-buttery, from the most delicious American peanut butter on a piece of white bread to savory Malian meat stew with a garnish of peanuts eaten out of a wooden bowl, and not excluding all of the alternatives for our allergic bretheren. Pictures, discussion, and news from around the world that has to do with our favorite nut that's not a nut: Arachis hypogaea
https://reddit.com/r/PeanutButter/ launch
r/fitmeals
https://reddit.com/r/fitmeals/ launch
r/EatCheapAndHealthy
Eating healthy on a cheap budget
https://reddit.com/r/EatCheapAndHealthy/ launch
r/xxfitness
For women and gender non-binary redditors who are fit, want to be fit, like reading about fitness to put off getting fit. Feel free to discuss your own personal experience related to fitness, exercise, dieting, gaining weight, body image, and health.
https://reddit.com/r/xxfitness/ launch
r/Baking
For all your baking needs! Recipes, ideas and all things baking related. Cakes, cookies, pies, tarts, muffins, scones, short- rye- wheat- and naan breads welcome!
https://reddit.com/r/Baking/ launch
r/nutrition
A subreddit for the discussion of nutrition science. Macronutrients, micronutrients, vitamins, diets, and nutrition news are among the many topics discussed. Civil discourse is required.
https://reddit.com/r/nutrition/ launch
r/vegetarian
https://reddit.com/r/vegetarian/ launch
r/slowcooking
r/Slowcooking is a food-related subreddit for sharing ideas, recipes or pictures in which a "slow cooker" was used in the preparation of meals. Many people think a slow cooker is named a "crock-pot," however this is a trademarked name of just one manufacturer. Slow cooking is an ideal method for cooking less expensive portions of meat to make them more tender and tasty than by other forms of cookery. Vegetarian and vegan dishes can also be made via slow cooking. - crockpot, slowcooker, crock
https://reddit.com/r/slowcooking/ launch
r/HealthyFood
###Healthy Food and Healthy Cooking Experiences information and questions are most welcome. Discussion of Healthy Food - nutrition news and research, food types and how they effect you. Discussion of Healthy Cooking - Recipes, thoughts, and ideas for healthier cooking! * Special Diet recipes * Low Fat * Low Carb * Low Sodium * High grain * Raw Food * Gluten Free * Sugar Free * Nutrition * Diet and the affects on happiness / mental health Good food
https://reddit.com/r/HealthyFood/ launch
r/Pizza
The home of pizza on reddit. An educational community devoted to the art of pizza making.
https://reddit.com/r/Pizza/ launch
r/1200isplenty
Whether you want to lose weight through calorie counting, or you're a smaller person who doesn't need more than 1200 calories a day, this is the place for you. Tips, recipes and support for people interested in low-calorie meals.
https://reddit.com/r/1200isplenty/ launch
r/recipes
Improve and share your cooking repertoire with recipes from reddit's community.
https://reddit.com/r/recipes/ launch
r/AskCulinary
/r/AskCulinary provides expert guidance for your specific cooking problems to help people of all skill levels become better cooks, to increase understanding of cooking, and to share valuable culinary knowledge.
https://reddit.com/r/AskCulinary/ launch
r/grilledcheese
Grilled cheese sandwiches. Pictures and discussion of Cheesy Grilledness. Good memes too.
https://reddit.com/r/grilledcheese/ launch
r/Breadit
Breadit is a community for anything related to making homemade bread!
https://reddit.com/r/Breadit/ launch
r/veganrecipes
A place for your favorite vegan recipes! Please read the sticky thread before posting or commenting, thank you!
https://reddit.com/r/veganrecipes/ launch
r/Coffee
/r/ Coffee is a place to discuss any and all things coffee.
https://reddit.com/r/Coffee/ launch
r/Paleo
This subreddit is for anyone following or interested in learning more about an ancestral-style diet, such as paleo, primal, or whatever other names they're falling under these days. Other topics of interest are health, fitness and lifestyle issues as seen from an evolutionary perspective.
https://reddit.com/r/Paleo/ launch
r/TrollXChromosomes
### A subreddit for rage comics and other memes with a girly slant.
https://reddit.com/r/TrollXChromosomes/ launch
r/tea
Tea! This subreddit is for discussion of beverages made from soaking camellia sinensis leaves (or twigs) in water, and, to a lesser extent, herbal infusions, yerba mate, and other tisanes.
https://reddit.com/r/tea/ launch
r/DessertPorn
Cakes, pies, ice cream, brownies, cookies, cupcakes, and even breakfast foods that are sweet (pastries, pancakes, waffles...). Eating them is great, but desserts are also delicious to look at. Post your pictures of them here! You can post art of desserts as well.
https://reddit.com/r/DessertPorn/ launch
r/running
Runners welcome.
https://reddit.com/r/running/ launch
r/Cooking
/r/Cooking is a place for the cooks of reddit and those who want to learn how to cook. Post anything related to cooking here, within reason.
https://reddit.com/r/Cooking/ launch
r/vegan
This is a place for people who are vegans or interested in veganism to share links, ideas, or recipes. "A philosophy and way of living which seeks to exclude—as far as is possible and practicable—all forms of exploitation of, and cruelty to, animals for food, clothing or any other purpose" - The Vegan Society
https://reddit.com/r/vegan/ launch
r/MealPrepSunday
/r/MealPrepSunday is a subreddit dedicated to meal prepping. This is a space to discuss all things about meal prepping. Whether you're looking to prep to save time, money, or to get in those gains, this is the place to ask questions, get answers, and share your meal preps with the world of Reddit! Happy prepping!
https://reddit.com/r/MealPrepSunday/ launch
r/budgetfood
Food on a Budget
https://reddit.com/r/budgetfood/ launch
r/FancyFollicles
https://reddit.com/r/FancyFollicles/ launch
r/TheGirlSurvivalGuide
This subreddit was created for girls to request tips and share discoveries to aid others in daily life. A survival guide of "life pro-tips" for the everyday girl. Post away!
https://reddit.com/r/TheGirlSurvivalGuide/ launch
r/femalefashionadvice
https://reddit.com/r/femalefashionadvice/ launch
r/Frugal
Frugality is the mental approach we each take when considering our resource allocations. It includes time, money, convenience, and many other factors.
https://reddit.com/r/Frugal/ launch
r/BingeEatingDisorder
A support group for those who struggle with Binge Eating Disorder and compulsive overeating.
https://reddit.com/r/BingeEatingDisorder/ launch


Northern Virginia Radiology Consultants are conveniently located within the Virginia Hospital Center. Our offices and imaging facilities are on the ground floor of the hospital. The Virginia Hospital Center is located inside the Washington DC Capital Beltway in Arlington, Virginia.
Enter off George Mason Drive and turn right. Pass the Gold lot on your left and proceed to the Blue Parking Garage. Take the elevator up to the Main Lobby where a concierge desk is available to guide you to the Radiology Department.
Patient parking is available in the Blue Garage for $5 per day.
Our offices are accessible via Metrorail. Take Metro to the Ballston Station on the Orange line. From the Ballston Station, take an ART bus, route #51 or #52, to North George Mason Drive.
Complete contact information can be found on our contact page.
Running late, have a quick question? Call our registration desk at 703-558-6152 to speak with one of our registration staff.


text:
Agri-Food Bank & Finance Business Climate Advice & Training Construction & Real Estate Energy Social entrepreneurship Environment Industry Health Information technology Tourism & leisure Public Works & Transport
News	Agenda	Analysis
claim	offer	regulation
Afrique	Afrique de l'ouest	South Africa	Algeria	Angola	Benign	botswana	Burkina Faso	Burundi	Cameroon	green cap	Comoros	Ivory Coast	Djibouti	Egypt	Eritrea	Ethiopia	Europe	Gabon	Gambia	Ghana	Guinea	Equatorial Guinea	Guinea Bissau	Mauritius	International	Kenya	Meeting	Lesotho	Liberia	Libya	Madagascar	Maghreb	Malawi	Mali	Morocco	Mauritania	mozambique	Namibia	Niger	Nigeria	Uganda	Central African Republic	Democratic Republic of the Congo	Congo	Rwanda	Western Sahara	Sainte-Hélène	Sao Tomé-et-Principe	Senegal	seychelles	Sierra Leone	Somalia	Sudan	South Soudan	Swaziland	Tanzania	Chad	Togo	Tunisia	Zambia	Zimbabwe
Egypt : COVID-19 accelerates reforms to build back better through inclusivity: Egypt's Al-Mashat
01 December 2020 / News / 101 / Emerging Africa
The novel coronavirus (COVID-19) pandemic has accelerated reforms, including the closure of the gender gap, according to Egypt's Minister of International Cooperation Rania Al-Mashat.
The minister added that the accelerated reforms, a silver lining of the pandemic, will allow the country to build back better through inclusivity and the nurturing of diversity.
At the same time, the pandemic, which represents a global humanitarian challenge, has derailed the progress on achieving the UN's Sustainable Development Goals (SDGs). It was, however, also an initiator to "The Great Reset".
During the pandemic, Egypt was the first country to provide a women-specific response, launched by the National Council for Women (NCW). The country ranked in first place in the Middle East and West Asia regions, with 21 policy measures according to the UNDP COVID-19 Global Gender Response Tracker, Minister Al-Mashat said.
Her remarks came during the virtually held "Women Working For Change (WFC): The Summit", organised by the Africa CEO Forum and co-hosted by International Finance Corporation (IFC). The event was held on 24 November under the theme "Imagine tomorrow. Change today".
Minister Al-Mashat said that as per the Official Development Assistance (ODA) and SDG Mapping Framework, a comprehensive exercise was completed by the Ministry of International Cooperation, under its principles of Economic Diplomacy.
The ministry's current portfolio of development financing has 13 projects, receiving funding of $82m that exclusively target SDG 5: Gender Equality. This comes in addition to other projects in the portfolio that achieve the same goal as a collateral effect to their development.
In 2020, the Ministry of International Cooperation has secured additional financing dedicated to SDG 5, worth a total of $7m, which will take place through bilateral cooperation with Spain and Canada.
"The participation of women is macro-critical," Minister Al-Mashat said, "Economic inclusion and empowerment of women in development is essential to Egypt's path forward."
She added, "We must shift gears and change mindsets to be gender blind, in order to see competence as the sole determinant to what a person is capable of, not their gender."
During the summit, Minister Al-Mashat took part in a one-on-one interview as part of the "Conversation with a Leader" segment, moderated by Nicholas Norbrook, Managing Editor of The Africa Report.
The minister spoke about changing mentalities across generations that will encourage the inclusion of women in high-ranking positions in the workplace. This will also encourage positive reinforcement in boosting female participation, as well as the role of education in closing the gender gap.
She added that these points require cooperation on several fronts. In July 2020, the Ministry of International Cooperation, the NCW, and the World Economic Forum (WEF), launched the "Closing the Gender Gap Accelerator".
The accelerator is the first public-private collaboration model of its kind in the Middle East and Africa. It aims to help governments and businesses take decisive action to close economic gender gaps.
"Aiming to increase women's participation in the labour force, close gender gaps in remuneration and investment, advance more women into management and leadership positions, and hardwire gender parity in the future of work," the minister said, "The accelerator is built to take proactive action to advance women's economic empowerment."
She also said that knowledge is the source of competence. During the interview, the minister noted the importance of education at the heart of reform, especially when it becomes inclusive and reflects sustainable growth.
As per the "ODA SDG Mapping Framework", the Ministry of International Cooperation's portfolio of development projects include 36 dedicated to SDG 4: Quality Education. These projects have received total funding amounting to $2,361m.
Education in Egypt has been reformed to emphasise digital learning, technology and inclusion, ensuring both boys and girls have access to equal education in urban and rural areas.
An exemplar initiative of these reforms include the establishment of 12 Science, Technology, Engineering and Mathematics (STEM) High School for boys and girls across Egypt.
The project, established in 2011 and financed through USAID funding, taps on the pool of talented women who can lead the sectors of the future through cutting-edge technologies and research breakthroughs.
According to a 2018 UNDP report on Africa, if women entered the workforce at the same rate as men, the economic output would increase to $962bn.
The WFC is an Africa Forum initiative that brings together female executives with the belief that African women leaders are at the core of transforming the continent.
The summit brought together over 300 influential figures in Africa, such as: Vera Songwe, United Nations Under Secretary-General and Executive Secretary, Economic Commission for Africa, Cameroon; Alexandra Palt, Chief Corporate Responsibility Officer & Executive Vice President of l'Oréal Foundation at L'Oréal, France; Sérgio Pimenta, Vice President, Middle East and Africa, IFC, USA; and Ariella Ji, CFO of Huawei Northern Africa.
source: dailynewsegypt
Tunisia: Tenth anniversary of Revolution, per capita income dropped 30%
Tunisia suffered an economic slump ten years after the Revolution with all sectors, without exception, bearing the brunt of the crisis. In an interview with TAP, economic expert and CEO of Comete...
Tunisia: External debt service fell by 62% as of January 10, 2021 (BCT)
Cumulated external debt services fell by nearly 62% during the first ten days of January 2021, compared to the same period in 2020, stabilising at 57.8 million dinars (MD), according to the latest sta...
Egypt : Petroleum Ministry offers jet fuel price cut till 2021 end to promote tourism
Ministry of Petroleum and Mineral Resources has announced that jet fuel prices will be cut to reach 15 cents per gallon, effective from 21 January until the year end.A high-level government meeting ha...
Egypt : 900k users access Fixed Solutions' platform for electricity services
Fixed Solutions CEO Mahmoud Tawfik has announced that more than 900,000 citizens were able to access the company's platform to submit coded electricity meter requests electronically in an easy and acc...
Egypt : ITFC to provide Egypt with $1.1 bln in finance solutions for 2021
The International Islamic Trade Finance Corporation (ITFC) is set to extend $1.1 billion in financing solutions to Egypt in 2021.Through a virtual event, Egypt's Minister of Planning and Economic Deve...
For more information, write to us on
suscribe to


text:
import { sendHttpRequest } from './HttpClient';
import { CommonConstants } from './../utils/CommonConstants';
import { ResourceGraph, ArmObj } from './../models/arm-obj';
import MakeArmCall, { getErrorMessageOrStringify } from './ArmHelper';
import { ISubscription } from '../models/subscription';
import {
  AppInsightsComponent,
  AppInsightsComponentToken,
  AppInsightsMonthlySummary,
  AppInsightsQueryResult,
  AppInsightsInvocationTrace,
  AppInsightsInvocationTraceDetail,
  AppInsightsKeyType,
  AppInsightsOrchestrationTrace,
  AppInsightsEntityTrace,
  AppInsightsEntityTraceDetail,
  AppInsightsOrchestrationTraceDetail,
} from '../models/app-insights';
import { mapResourcesTopologyToArmObjects } from '../utils/arm-utils';
import LogService from '../utils/LogService';
import { LogCategories } from '../utils/LogCategories';
import moment from 'moment';
import { NationalCloudEnvironment } from '../utils/scenario-checker/national-cloud.environment';
import { LocalStorageService } from '../utils/LocalStorageService';
import { StorageKeys } from '../models/LocalStorage.model';
import SiteService from './SiteService';
import { ArmFunctionDescriptor } from '../utils/resourceDescriptors';

export default class AppInsightsService {
  public static getAppInsights = (resourceId: string) => {
    return MakeArmCall<ArmObj<AppInsightsComponent>>({
      resourceId,
      commandName: 'getAppInsights',
      apiVersion: CommonConstants.ApiVersions.appInsightsTokenApiVersion20150501,
    });
  };

  public static getAppInsightsComponentToken = (appInsightsComponentId: string) => {
    const resourceId = `${appInsightsComponentId}/getToken`;

    return MakeArmCall<AppInsightsComponentToken>({
      resourceId,
      commandName: 'getAppInsightsComponentToken',
      apiVersion: CommonConstants.ApiVersions.appInsightsTokenApiVersion20150501,
    });
  };

  public static getLast30DaysSummary = (appInsightsAppId: string, appInsightsToken: string, functionResourceId: string) => {
    const data = { query: AppInsightsService._formLast30DayQuery(functionResourceId), timespan: 'P30D' };
    const headers = AppInsightsService._formAppInsightsHeaders(appInsightsToken);
    const url = AppInsightsService._formLast30DayUrl(appInsightsAppId);

    return sendHttpRequest<AppInsightsQueryResult>({ data, headers, url, method: 'POST' }).then(response => {
      let result: AppInsightsMonthlySummary = { successCount: 0, failedCount: 0 };
      if (response.metadata.success && response.data) {
        result = AppInsightsService._extractSummaryFromQueryResult(response.data);
      } else {
        LogService.trackEvent(
          LogCategories.applicationInsightsQuery,
          'getSummary',
          `Failed to query summary: ${getErrorMessageOrStringify(response.metadata.error)}`
        );
      }
      return result;
    });
  };

  public static getInvocationTraces = (
    appInsightsAppId: string,
    appInsightsToken: string,
    functionResourceId: string,
    top: number = 20
  ) => {
    const data = { query: AppInsightsService.formInvocationTracesQuery(functionResourceId, top), timespan: 'P30D' };
    const headers = AppInsightsService._formAppInsightsHeaders(appInsightsToken);
    const url = AppInsightsService._formInvocationTracesUrl(appInsightsAppId);

    return sendHttpRequest<AppInsightsQueryResult>({ data, headers, url, method: 'POST' }).then(response => {
      let traces: AppInsightsInvocationTrace[] = [];
      if (response.metadata.success && response.data) {
        traces = AppInsightsService._extractInvocationTracesFromQueryResult(response.data);
      } else {
        LogService.trackEvent(
          LogCategories.applicationInsightsQuery,
          'getInvocationTraces',
          `Failed to query invocationTraces: ${getErrorMessageOrStringify(response.metadata.error)}`
        );
      }
      return traces;
    });
  };

  public static formInvocationTracesQuery = (functionResourceId: string, top: number = 20) => {
    const [functionAppName, functionName] = AppInsightsService._extractFunctionAppNameAndFunctionName(functionResourceId);
    return (
      `requests ` +
      `| project timestamp, id, operation_Name, success, resultCode, duration, operation_Id, cloud_RoleName, invocationId=customDimensions['InvocationId'] ` +
      `| where timestamp > ago(30d) ` +
      `| where cloud_RoleName =~ '${functionAppName}' and operation_Name =~ '${functionName}' ` +
      `| order by timestamp desc | take ${top}`
    );
  };

  public static getInvocationTraceDetails = (
    appInsightsAppId: string,
    appInsightsToken: string,
    operationId: string,
    invocationId: string
  ) => {
    const data = { query: AppInsightsService.formInvocationTraceDetailsQuery(operationId, invocationId), timespan: 'P30D' };
    const headers = AppInsightsService._formAppInsightsHeaders(appInsightsToken);
    const url = AppInsightsService._formInvocationTraceDetailsUrl(appInsightsAppId);

    return sendHttpRequest<AppInsightsQueryResult>({ data, headers, url, method: 'POST' }).then(response => {
      let details: AppInsightsInvocationTraceDetail[] = [];
      if (response.metadata.success && response.data) {
        details = AppInsightsService._extractInvocationTraceDetailsFromQueryResult(response.data);
      } else {
        LogService.trackEvent(
          LogCategories.applicationInsightsQuery,
          'getInvocationTraceDetails',
          `Failed to query invocationTraceDetails: ${getErrorMessageOrStringify(response.metadata.error)}`
        );
      }
      return details;
    });
  };

  public static formInvocationTraceDetailsQuery = (operationId: string, invocationId: string) => {
    const invocationIdFilter = !!invocationId ? `| where customDimensions['InvocationId'] == '${invocationId}'` : '';

    return (
      // tslint:disable-next-line: prefer-template
      `union traces` +
      `| union exceptions` +
      `| where timestamp > ago(30d)` +
      `| where operation_Id == '${operationId}'` +
      invocationIdFilter +
      `| order by timestamp asc` +
      `| project timestamp, message = iff(message != '', message, iff(innermostMessage != '', innermostMessage, customDimensions.['prop__{OriginalFormat}'])), logLevel = customDimensions.['LogLevel']`
    );
  };

  public static getOrchestrationTraces = (
    appInsightsAppId: string,
    appInsightsToken: string,
    functionResourceId: string,
    top: number = 20
  ) => {
    const data = { query: AppInsightsService.formOrchestrationTracesQuery(functionResourceId, top), timespan: 'P30D' };
    const headers = AppInsightsService._formAppInsightsHeaders(appInsightsToken);
    const url = AppInsightsService._formOrchestrationTracesUrl(appInsightsAppId);

    return sendHttpRequest<AppInsightsQueryResult>({ data, headers, url, method: 'POST' }).then(response => {
      let traces: AppInsightsOrchestrationTrace[] = [];
      if (response.metadata.success && response.data) {
        traces = AppInsightsService._extracOrchestrationTracesFromQueryResult(response.data);
      } else {
        LogService.trackEvent(
          LogCategories.applicationInsightsQuery,
          'getOrchestrationTraces',
          `Failed to query orchestrationTraces: ${getErrorMessageOrStringify(response.metadata.error)}`
        );
      }
      return traces;
    });
  };

  public static formOrchestrationTracesQuery = (functionResourceId: string, top: number = 20) => {
    const [functionAppName, functionName] = AppInsightsService._extractFunctionAppNameAndFunctionName(functionResourceId);
    const orchestratorRequests =
      `requests ` +
      `| extend DurableFunctionsInstanceId = tostring(customDimensions['DurableFunctionsInstanceId']), DurableFunctionsRuntimeStatus = tostring(customDimensions['DurableFunctionsRuntimeStatus']), DurableFunctionsType = tostring(customDimensions['DurableFunctionsType']) ` +
      `| where DurableFunctionsType == 'Orchestrator' `;
    return (
      `${orchestratorRequests}` +
      `| project timestamp, id, name, operation_Name, cloud_RoleName, DurableFunctionsRuntimeStatus, DurableFunctionsType, DurableFunctionsInstanceId ` +
      `| where DurableFunctionsRuntimeStatus != 'Terminated' and name == '${functionName}' ` +
      `| union ( ${orchestratorRequests}` +
      `| where DurableFunctionsRuntimeStatus == 'Terminated' and DurableFunctionsInstanceId in (` +
      `(${orchestratorRequests}` +
      `| where DurableFunctionsRuntimeStatus != 'Terminated' and name == '${functionName}' ` +
      `| distinct DurableFunctionsInstanceId )) ` +
      `) ` +
      `| where cloud_RoleName =~ '${functionAppName}' and operation_Name =~ '${functionName}' ` +
      `| summarize arg_max(timestamp, *) by DurableFunctionsInstanceId ` +
      `| order by timestamp desc | take ${top}`
    );
  };

  public static getOrchestrationDetails = (appInsightsAppId: string, appInsightsToken: string, instanceId: string) => {
    const data = { query: AppInsightsService.formOrchestrationTraceDetailsQuery(instanceId), timespan: 'P30D' };
    const headers = AppInsightsService._formAppInsightsHeaders(appInsightsToken);
    const url = AppInsightsService._formOrchestrationTraceDetailsUrl(appInsightsAppId);

    return sendHttpRequest<AppInsightsQueryResult>({ data, headers, url, method: 'POST' }).then(response => {
      let details: AppInsightsOrchestrationTraceDetail[] = [];
      if (response.metadata.success && response.data) {
        details = AppInsightsService._extractOrchestrationTraceDetailsFromQueryResult(response.data);
      } else {
        LogService.trackEvent(
          LogCategories.applicationInsightsQuery,
          'getOrchestrationTraceDetails',
          `Failed to query orchestrationTraceDetails: ${getErrorMessageOrStringify(response.metadata.error)}`
        );
      }
      return details;
    });
  };

  public static formOrchestrationTraceDetailsQuery = (instanceId: string) => {
    return (
      // tslint:disable-next-line: prefer-template
      `union traces` +
      `| where timestamp > ago(7d) ` +
      `| where customDimensions.Category == 'Host.Triggers.DurableTask' ` +
      `| extend instanceId = customDimensions['prop__instanceId'] ` +
      `| extend state = customDimensions['prop__state'] ` +
      `| extend isReplay = tobool(tolower(customDimensions['prop__isReplay'])) ` +
      `| extend sequenceNumber = tolong(customDimensions["prop__sequenceNumber"]) ` +
      `| where isReplay != true ` +
      `| where instanceId == '${instanceId}' ` +
      `| sort by timestamp desc, sequenceNumber desc ` +
      `| take 100 ` +
      `| sort by timestamp asc, sequenceNumber asc ` +
      `| project timestamp, sequenceNumber, state, operation_Name, message `
    );
  };

  public static getEntityTraces = (appInsightsAppId: string, appInsightsToken: string, functionResourceId: string, top: number = 20) => {
    const data = { query: AppInsightsService.formEntityTracesQuery(functionResourceId, top), timespan: 'P30D' };
    const headers = AppInsightsService._formAppInsightsHeaders(appInsightsToken);
    const url = AppInsightsService._formEntityTracesUrl(appInsightsAppId);

    return sendHttpRequest<AppInsightsQueryResult>({ data, headers, url, method: 'POST' }).then(response => {
      let traces: AppInsightsEntityTrace[] = [];
      if (response.metadata.success && response.data) {
        traces = AppInsightsService._extractEntityTracesFromQueryResult(response.data);
      } else {
        LogService.trackEvent(
          LogCategories.applicationInsightsQuery,
          'getEntityTraces',
          `Failed to query entity Traces: ${getErrorMessageOrStringify(response.metadata.error)}`
        );
      }
      return traces;
    });
  };

  public static formEntityTracesQuery = (functionResourceId: string, top: number = 20) => {
    const [functionAppName, functionName] = AppInsightsService._extractFunctionAppNameAndFunctionName(functionResourceId);
    return (
      `requests ` +
      `| extend DurableFunctionsInstanceId = tostring(customDimensions['DurableFunctionsInstanceId']), DurableFunctionsRuntimeStatus = tostring(customDimensions['DurableFunctionsRuntimeStatus']), DurableFunctionsType = tostring(customDimensions['DurableFunctionsType']) ` +
      `| project timestamp, id, name, operation_Name, cloud_RoleName, DurableFunctionsRuntimeStatus, DurableFunctionsType, DurableFunctionsInstanceId ` +
      `| where DurableFunctionsType == 'Entity' and DurableFunctionsInstanceId != '' and name ==  '${functionName}'` +
      `| where cloud_RoleName =~ '${functionAppName}' and operation_Name =~ '${functionName}' ` +
      `| summarize arg_max(timestamp, *) by DurableFunctionsInstanceId ` +
      `| order by timestamp desc | take ${top}`
    );
  };

  public static getEntityDetails = (appInsightsAppId: string, appInsightsToken: string, instanceId: string) => {
    const data = { query: AppInsightsService.formEntityTraceDetailsQuery(instanceId), timespan: 'P30D' };
    const headers = AppInsightsService._formAppInsightsHeaders(appInsightsToken);
    const url = AppInsightsService._formEntityTraceDetailsUrl(appInsightsAppId);

    return sendHttpRequest<AppInsightsQueryResult>({ data, headers, url, method: 'POST' }).then(response => {
      let details: AppInsightsEntityTraceDetail[] = [];
      if (response.metadata.success && response.data) {
        details = AppInsightsService._extractEntityTraceDetailsFromQueryResult(response.data);
      } else {
        LogService.trackEvent(
          LogCategories.applicationInsightsQuery,
          'getEntityTraceDetails',
          `Failed to query entityTraceDetails: ${getErrorMessageOrStringify(response.metadata.error)}`
        );
      }
      return details;
    });
  };

  public static formEntityTraceDetailsQuery = (instanceId: string) => {
    return (
      // tslint:disable-next-line: prefer-template
      `union traces` +
      `| where timestamp > ago(7d) ` +
      `| where customDimensions.Category == 'Host.Triggers.DurableTask' ` +
      `| extend instanceId = customDimensions['prop__instanceId'] ` +
      `| extend state = customDimensions['prop__state'] ` +
      `| extend isReplay = tobool(tolower(customDimensions['prop__isReplay'])) ` +
      `| extend sequenceNumber = tolong(customDimensions["prop__sequenceNumber"]) ` +
      `| where isReplay != true ` +
      `| where instanceId == '${instanceId}' ` +
      `| sort by timestamp desc, sequenceNumber desc ` +
      `| take 100 ` +
      `| sort by timestamp asc, sequenceNumber asc ` +
      `| project timestamp, sequenceNumber, state, operation_Name, message `
    );
  };

  public static getAppInsightsResourceId = async (resourceId: string, subscriptions: ISubscription[]) => {
    const storageItem = LocalStorageService.getItem(resourceId, StorageKeys.appInsights);
    const aiResourceId = !!storageItem && !!storageItem.value ? storageItem.value : undefined;

    if (!aiResourceId) {
      return AppInsightsService._getAppInsightsResourceIdUsingAppSettings(resourceId, subscriptions);
    }

    if (!!storageItem && storageItem.expired) {
      LocalStorageService.removeItem(resourceId);
      AppInsightsService._getAppInsightsResourceIdUsingAppSettings(resourceId, subscriptions);
    }

    return { metadata: { success: true, error: null, appInsightsKeyType: undefined }, data: aiResourceId };
  };

  private static _getAppInsightsResourceIdUsingAppSettings = async (resourceId: string, subscriptions: ISubscription[]) => {
    const appSettingsResult = await SiteService.fetchApplicationSettings(resourceId);
    let aiResourceId;
    let error;
    let success = false;
    let appInsightsKeyType = AppInsightsKeyType.string;
    if (appSettingsResult.metadata.success) {
      const appSettings = appSettingsResult.data.properties;
      const appInsightsConnectionString = appSettings[CommonConstants.AppSettingNames.appInsightsConnectionString];
      const appInsightsInstrumentationKey = appSettings[CommonConstants.AppSettingNames.appInsightsInstrumentationKey];

      if (appInsightsConnectionString) {
        const appInsightsResponse = await AppInsightsService._getAppInsightsComponentFromConnectionString(
          appInsightsConnectionString,
          subscriptions
        );
        aiResourceId = appInsightsResponse.data;
        success = appInsightsResponse.metadata.success;
        error = appInsightsResponse.metadata.error;
      }

      if (!aiResourceId && appInsightsInstrumentationKey) {
        const appInsightsResponse = await AppInsightsService._getAppInsightsComponentFromInstrumentationKey(
          appInsightsInstrumentationKey,
          subscriptions
        );
        aiResourceId = appInsightsResponse.data;
        success = appInsightsResponse.metadata.success;
        error = appInsightsResponse.metadata.error;
      }

      if (!!aiResourceId) {
        LocalStorageService.setItem(resourceId, StorageKeys.appInsights, aiResourceId);
      }

      if (
        (appInsightsConnectionString && CommonConstants.isKeyVaultReference(appInsightsConnectionString)) ||
        (appInsightsInstrumentationKey && CommonConstants.isKeyVaultReference(appInsightsInstrumentationKey))
      ) {
        appInsightsKeyType = AppInsightsKeyType.keyVault;
      }
    } else {
      error = appSettingsResult.metadata.error;
      success = false;
    }

    return { metadata: { success, error, appInsightsKeyType }, data: aiResourceId };
  };

  private static _getAppInsightsComponentFromConnectionString = (connectionString: string, subscriptions: ISubscription[]) => {
    const subscriptionIds = subscriptions.map(subscription => subscription.subscriptionId);
    const body = {
      query: `where type == 'microsoft.insights/components' | where isnotempty(properties) | where properties.ConnectionString == '${connectionString}'`,
      subscriptions: subscriptionIds,
    };

    return MakeArmCall<any>({
      body,
      resourceId: `/providers/Microsoft.ResourceGraph/resources`,
      commandName: 'getAppInsightsComponentFromConnectionString',
      apiVersion: CommonConstants.ApiVersions.resourceGraphApiVersion,
      method: 'POST',
    }).then(response => {
      let success = false;
      let error;
      let aiResourceId;
      if (response.metadata.success) {
        success = true;
        const topologyObject = response.data as ResourceGraph;
        if (topologyObject.data && topologyObject.data.columns && topologyObject.data.rows) {
          const aiResources = mapResourcesTopologyToArmObjects<AppInsightsComponent>(topologyObject.data.columns, topologyObject.data.rows);
          aiResourceId = aiResources.length === 1 ? aiResources[0].id : null;
        }
      } else {
        error = response.metadata.error;
      }
      return { metadata: { success, error }, data: aiResourceId };
    });
  };

  private static _getAppInsightsComponentFromInstrumentationKey = (instrumentationKey: string, subscriptions: ISubscription[]) => {
    const subscriptionIds = subscriptions.map(subscription => subscription.subscriptionId);
    const body = {
      query: `where type == 'microsoft.insights/components' | where isnotempty(properties) | where properties.InstrumentationKey == '${instrumentationKey}'`,
      subscriptions: subscriptionIds,
    };

    return MakeArmCall<any>({
      body,
      resourceId: `/providers/Microsoft.ResourceGraph/resources`,
      commandName: 'getAppInsightsComponentFromInstrumentationKey',
      apiVersion: CommonConstants.ApiVersions.resourceGraphApiVersion,
      method: 'POST',
    }).then(response => {
      let success = false;
      let error;
      let aiResourceId;
      if (response.metadata.success) {
        success = true;
        const topologyObject = response.data as ResourceGraph;
        if (topologyObject.data && topologyObject.data.columns && topologyObject.data.rows) {
          const aiResources = mapResourcesTopologyToArmObjects<AppInsightsComponent>(topologyObject.data.columns, topologyObject.data.rows);
          aiResourceId = aiResources.length === 1 ? aiResources[0].id : null;
        }
      } else {
        error = response.metadata.error;
      }
      return { metadata: { success, error }, data: aiResourceId };
    });
  };

  private static _formAppInsightsHeaders = (appInsightsToken: string) => {
    return { Authorization: `Bearer ${appInsightsToken}` };
  };

  private static _formLast30DayQuery = (functionResourceId: string): string => {
    const [functionAppName, functionName] = AppInsightsService._extractFunctionAppNameAndFunctionName(functionResourceId);
    return (
      `requests ` +
      `| where timestamp >= ago(30d) ` +
      `| where cloud_RoleName =~ '${functionAppName}' and operation_Name =~ '${functionName}' ` +
      `| summarize count=count() by success`
    );
  };

  private static _extractFunctionAppNameAndFunctionName(functionResourceId: string): [string, string] {
    const armFunctionDescriptor = new ArmFunctionDescriptor(functionResourceId);
    const functionAppName = armFunctionDescriptor.slot
      ? `${armFunctionDescriptor.site}-${armFunctionDescriptor.slot}`
      : armFunctionDescriptor.site;
    const functionName = armFunctionDescriptor.name;
    return [functionAppName, functionName];
  }

  private static _formLast30DayUrl = (appInsightsAppId: string): string => {
    return `${AppInsightsService._getEndpoint()}/${appInsightsAppId}/query?api-version=${
      CommonConstants.ApiVersions.appInsightsQueryApiVersion20180420
    }&queryType=getLast30DaySummary`;
  };

  private static _formInvocationTracesUrl = (appInsightsAppId: string): string => {
    return `${AppInsightsService._getEndpoint()}/${appInsightsAppId}/query?api-version=${
      CommonConstants.ApiVersions.appInsightsQueryApiVersion20180420
    }&queryType=getInvocationTraces`;
  };

  private static _formOrchestrationTracesUrl = (appInsightsAppId: string): string => {
    return `${AppInsightsService._getEndpoint()}/${appInsightsAppId}/query?api-version=${
      CommonConstants.ApiVersions.appInsightsQueryApiVersion20180420
    }&queryType=getOrchestrationTraces`;
  };

  private static _formEntityTracesUrl = (appInsightsAppId: string): string => {
    return `${AppInsightsService._getEndpoint()}/${appInsightsAppId}/query?api-version=${
      CommonConstants.ApiVersions.appInsightsQueryApiVersion20180420
    }&queryType=getEntityTraces`;
  };

  private static _formEntityTraceDetailsUrl = (appInsightsAppId: string): string => {
    return `${AppInsightsService._getEndpoint()}/${appInsightsAppId}/query?api-version=${
      CommonConstants.ApiVersions.appInsightsQueryApiVersion20180420
    }&queryType=getEntityTraceDetails`;
  };

  private static _formInvocationTraceDetailsUrl = (appInsightsAppId: string): string => {
    return `${AppInsightsService._getEndpoint()}/${appInsightsAppId}/query?api-version=${
      CommonConstants.ApiVersions.appInsightsQueryApiVersion20180420
    }&queryType=getInvocationTraceDetails`;
  };

  private static _formOrchestrationTraceDetailsUrl = (appInsightsAppId: string): string => {
    return `${AppInsightsService._getEndpoint()}/${appInsightsAppId}/query?api-version=${
      CommonConstants.ApiVersions.appInsightsQueryApiVersion20180420
    }&queryType=getOrchestrationTraceDetails`;
  };

  private static _getEndpoint = (): string => {
    if (NationalCloudEnvironment.isFairFax()) {
      return CommonConstants.AppInsightsEndpoints.fairfax;
    }

    if (NationalCloudEnvironment.isMooncake()) {
      return CommonConstants.AppInsightsEndpoints.mooncake;
    }

    return CommonConstants.AppInsightsEndpoints.public;
  };

  private static _extractSummaryFromQueryResult = (result: AppInsightsQueryResult) => {
    const summary: AppInsightsMonthlySummary = { successCount: 0, failedCount: 0 };
    const summaryTable = result.tables.find(table => table.name === 'PrimaryResult');
    const rows = summaryTable && summaryTable.rows;

    // NOTE (michinoy & allisonm): The query returns up to two rows, with two columns: status and count
    // status of True = Success
    // status of False = Failed
    if (rows) {
      rows.forEach(row => {
        if (row[0] === 'True') {
          summary.successCount = row[1];
        } else if (row[0] === 'False') {
          summary.failedCount = row[1];
        }
      });
    } else {
      LogService.trackEvent(LogCategories.applicationInsightsQuery, 'parseSummary', `Unable to parse summary: ${result}`);
    }

    return summary;
  };

  private static _extractInvocationTracesFromQueryResult = (result: AppInsightsQueryResult) => {
    const traces: AppInsightsInvocationTrace[] = [];
    const summaryTable = result.tables.find(table => table.name === 'PrimaryResult');
    const rows = summaryTable && summaryTable.rows;

    if (rows) {
      rows.forEach(row => {
        if (row.length >= 9) {
          traces.push({
            timestamp: row[0],
            timestampFriendly: moment.utc(row[0]).format('YYYY-MM-DD HH:mm:ss.SSS'),
            id: row[1],
            name: row[2],
            success: row[3] === 'True',
            resultCode: row[4],
            duration: Math.round(Number.parseFloat(row[5])),
            operationId: row[6],
            invocationId: row[8],
          });
        } else {
          LogService.trackEvent(LogCategories.applicationInsightsQuery, 'parseInvocationTrace', `Unable to parse invocation trace: ${row}`);
        }
      });
    } else {
      LogService.trackEvent(
        LogCategories.applicationInsightsQuery,
        'parseInvocationTraces',
        `Unable to parse invocation traces: ${result}`
      );
    }

    return traces;
  };

  private static _extractInvocationTraceDetailsFromQueryResult = (result: AppInsightsQueryResult) => {
    const details: AppInsightsInvocationTraceDetail[] = [];
    const summaryTable = result.tables.find(table => table.name === 'PrimaryResult');
    const rows = summaryTable && summaryTable.rows;

    if (rows) {
      rows.forEach((row, index) => {
        if (row.length >= 3) {
          details.push({
            rowId: index,
            timestamp: row[0],
            timestampFriendly: moment.utc(row[0]).format('YYYY-MM-DD HH:mm:ss.SSS'),
            message: row[1],
            logLevel: row[2],
          });
        } else {
          LogService.trackEvent(
            LogCategories.applicationInsightsQuery,
            'parseInvocationDetail',
            `Unable to parse invocation detail: ${row}`
          );
        }
      });
    } else {
      LogService.trackEvent(
        LogCategories.applicationInsightsQuery,
        'parseInvocationDetails',
        `Unable to parse invocation details: ${result}`
      );
    }

    return details;
  };

  private static _extracOrchestrationTracesFromQueryResult = (result: AppInsightsQueryResult) => {
    const traces: AppInsightsOrchestrationTrace[] = [];
    const summaryTable = result.tables.find(table => table.name === 'PrimaryResult');
    const rows = summaryTable && summaryTable.rows;

    if (rows) {
      rows.forEach(row => {
        if (row.length >= 8) {
          traces.push({
            timestamp: row[1],
            timestampFriendly: moment.utc(row[1]).format('YYYY-MM-DD HH:mm:ss.SSS'),
            id: row[2],
            name: row[3],
            DurableFunctionsInstanceId: row[0],
            DurableFunctionsRuntimeStatus: row[6],
            DurableFunctionsType: row[7],
          });
        } else {
          LogService.trackEvent(
            LogCategories.applicationInsightsQuery,
            'parseOrchestrationTrace',
            `Unable to parse orchestration trace: ${row}`
          );
        }
      });
    } else {
      LogService.trackEvent(
        LogCategories.applicationInsightsQuery,
        'parseOrchestrationTraces',
        `Unable to parse orchestration traces: ${result}`
      );
    }

    return traces;
  };

  private static _extractOrchestrationTraceDetailsFromQueryResult = (result: AppInsightsQueryResult) => {
    const details: AppInsightsOrchestrationTraceDetail[] = [];
    const summaryTable = result.tables.find(table => table.name === 'PrimaryResult');
    const rows = summaryTable && summaryTable.rows;

    if (rows) {
      rows.forEach((row, index) => {
        if (row.length >= 5) {
          details.push({
            rowId: index,
            timestamp: row[0],
            timestampFriendly: moment.utc(row[0]).format('YYYY-MM-DD HH:mm:ss.SSS'),
            message: row[4],
            state: row[2],
          });
        } else {
          LogService.trackEvent(
            LogCategories.applicationInsightsQuery,
            'parseOrchestrationDetail',
            `Unable to parse orchestration detail: ${row}`
          );
        }
      });
    } else {
      LogService.trackEvent(
        LogCategories.applicationInsightsQuery,
        'parseOrchestrationDetails',
        `Unable to parse orchestration details: ${result}`
      );
    }

    return details;
  };

  private static _extractEntityTracesFromQueryResult = (result: AppInsightsQueryResult) => {
    const traces: AppInsightsEntityTrace[] = [];
    const summaryTable = result.tables.find(table => table.name === 'PrimaryResult');
    const rows = summaryTable && summaryTable.rows;

    if (rows) {
      rows.forEach(row => {
        if (row.length >= 8) {
          traces.push({
            timestamp: row[1],
            timestampFriendly: moment.utc(row[1]).format('YYYY-MM-DD HH:mm:ss.SSS'),
            id: row[2],
            name: row[3],
            DurableFunctionsInstanceId: row[0],
            DurableFunctionsRuntimeStatus: row[6],
            DurableFunctionsType: row[7],
          });
        } else {
          LogService.trackEvent(LogCategories.applicationInsightsQuery, 'parseEntityTrace', `Unable to parse entity trace: ${row}`);
        }
      });
    } else {
      LogService.trackEvent(LogCategories.applicationInsightsQuery, 'parseEntityTraces', `Unable to parse entity traces: ${result}`);
    }

    return traces;
  };

  private static _extractEntityTraceDetailsFromQueryResult = (result: AppInsightsQueryResult) => {
    const details: AppInsightsEntityTraceDetail[] = [];
    const summaryTable = result.tables.find(table => table.name === 'PrimaryResult');
    const rows = summaryTable && summaryTable.rows;

    if (rows) {
      rows.forEach((row, index) => {
        if (row.length >= 5) {
          details.push({
            rowId: index,
            timestamp: row[0],
            timestampFriendly: moment.utc(row[0]).format('YYYY-MM-DD HH:mm:ss.SSS'),
            message: row[4],
            state: row[2],
          });
        } else {
          LogService.trackEvent(LogCategories.applicationInsightsQuery, 'parseEntityDetails', `Unable to parse entity detail: ${row}`);
        }
      });
    } else {
      LogService.trackEvent(LogCategories.applicationInsightsQuery, 'parseEntityDetails', `Unable to parse entity details: ${result}`);
    }

    return details;
  };
}

redpajama_set_name: RedPajamaGithub