text:
U.S. Employer Return-to-Work FAQs
Time to Read: 19 minutes
This list of frequently asked questions and answers provides some initial guidance on how to navigate and mitigate the challenges employers may face as workplaces around the country begin to re-open or resume some operations.
Companies will need to customize their policies to reflect their operations, and the guidance from federal and state agencies is rapidly changing. Please email COVID-19RecoveryPolicies@ropesgray.com if you have specific questions your business's re-opening process.
1. When is it legally permissible to have employees return to the workplace?
State and local public health orders have, in some jurisdictions, mandated workplace closures for certain categories of businesses and organizations. These orders vary widely from state to state and even county to county, and the pace (and scope) at which they now are being lifted also varies. Ropes & Gray has a dedicated team of attorneys monitoring these developments, an overview of which is available here.
2. May employers instruct ill employees not to report to work?
Employees displaying COVID-19 Symptoms
U.S. employers generally have the right to instruct visibly ill employees to stay away from the workplace in order to prevent the spread of illness. The Centers for Disease Control and Prevention ("CDC") has issued interim guidance advising businesses to immediately separate and send home any employees, volunteers and others who appear to have symptoms of COVID-19. The Occupational Safety and Health Administration ("OSHA") has issued similar guidance, noting that COVID-19 implicates employers' duty to furnish to their workers "employment and a place of employment, which are free from recognized hazards that are causing or are likely to cause death or serious physical harm." The Equal Employment Opportunity Commission ("EEOC") has likewise issued guidance reasoning that employers would not violate the Americans with Disabilities Act and its relevant regulations (together, the "ADA") by requiring employees to stay home if they have symptoms of COVID-19. For a discussion of temperature checks of employees, see Question 4 below. Any policies requiring employees to stay away from the workplace would need to be applied consistently and narrowly tailored to meet specific health and safety objectives.
Employees with Pre-Existing Risk Factors
Employers may not generically exclude from the workplace employees whose health status or demographics put them at higher risk from COVID-19. But the ADA would permit exclusion if the employee's presence in the workplace would constitute a "direct threat" to themselves or others, though the EEOC has emphasized that the "direct threat requirement is a high standard." Consult with counsel before excluding an employee on the basis of a pre-existing condition, as any such action will require an individualized assessment of the particular employee's circumstances and the available reasonable accommodations. See also Question 6, below.
Employees who are Pregnant
Employers may not exclude an employee from the workplace involuntarily due to pregnancy, nor may employers single out employees on the basis of pregnancy for adverse employment actions such as leave, layoff, or furlough. Although pregnancy itself does not trigger an employer's obligations to make reasonable accommodations, pregnancy-related medical conditions may be disabilities covered by the ADA, and pregnant employees may be entitled to job modifications (such as remote work or leave) to the extent such modifications are available to other employees.
3. What certification may an employer require before allowing an employee to return to work?
Employers may require employees to provide fitness-for-duty or return-to-work certification after being treated for COVID-19 or quarantining at home at the direction of the employer or a public health official or health care provider. Employers also may require—and state or local reopening orders or guidance may recommend or compel—all returning employees to submit responses to screening questionnaires asking whether they have been diagnosed with, or are experiencing symptoms associated with, or potentially have been exposed to COVID-19. Questions could include:
Have you tested positive for or otherwise been diagnosed with COVID-19?
Do you have reason to believe you may have been exposed to COVID-19?
Are you experiencing any symptoms of infection with COVID-19, such as fever or chills, cough, shortness of breath, fatigue, muscle or body aches, headache, new loss of taste or smell, nausea or vomiting, diarrhea or sore throat?
Have you been in contact with any person who has tested positive for or otherwise been diagnosed with COVID-19 within the past 14 days?
Have you been the subject of a self-quarantine or self-isolation order from a public health official or public healthcare provider?
Have you traveled outside your home state within the past 14 days?
Any required certification should be narrowly tailored to seek information that is job-related, consistent with business necessity and sufficient to make a determination an employee is not a "direct threat." Employers should consult with counsel, and follow and take into consideration any updates from the CDC and/or other public health authorities regarding their current assessment of the spread and severity of COVID-19.
Additionally, current government guidance cautions against mandating fitness-for-duty or return-to-work certifications that require a visit with a health care provider, whose availability may be limited under current circumstances and who thus may not be able to provide such documentation in a timely manner. Alternative approaches may include employee self-certification or a form, stamp, or email from a local clinic administrator.
4. Can employers require temperature checks, COVID-19 tests, or antibody testing before allowing employees to enter the workplace?
The EEOC has recently issued guidance stating that, pursuant to CDC guidelines, employers may not require employees to submit to antibody testing before allowing them to enter the workplace, because such a test is not sufficiently "job related and consistent with business necessity."
By contrast, employers may require or administer checks such as a COVID-19 test or a temperature check before allowing entrance to the workplace. In addition, several states have issued laws or orders that require (e.g., Arizona and Colorado) or recommended (e.g., Tennessee and Connecticut) daily temperature checks of employees entering the workplace. Employers should consider outsourcing such testing to a third party that is qualified to perform clinical tests, and, if performing the test in-house, should ensure that the testing will be performed by personnel who are adequately trained and equipped with personal protective equipment ("PPE"). Employers should also undertake reasonably diligent efforts to ensure that the test to be administered is safe and reliable. An alternative—and potentially easier to administer—approach would be to require employees to take their own temperatures at home before reporting to work, and certifying upon arrival to the workplace that they do not have a fever. It is possible that employees' time spent taking their temperature at home would be counted as paid time under state law, though U.S. Supreme Court precedent suggests that this time would not be compensable under federal law.
Employers should be mindful of the practical limitations of such testing. For instance, all available testing (particularly temperature testing) is imprecise, and some infected individuals will pass the screening and some non-infected individuals will be turned away. Also, even an accurate test for infection is a valid result only for the time at which the test is taken, leaving undetected any subsequent exposure to, or incubation of, the disease. Finally, employers should consider carefully the logistics of testing, and whether it would force employees to queue or otherwise violate social distancing practices in a way that is ultimately counter-productive.
Employers likely do not need to obtain written consent before taking employees' temperatures in this context if the test is not invasive, though they could consider requiring such a signed consent to be conservative, as a condition of allowing return to work. If a test is performed by a third party clinical provider the employee may also need to consent to the sharing of the results with the employer. Employers should consider providing a general notice and/or posting a disclosure at the site where temperatures are being taken (particularly in California, where such advance notice is required of certain businesses and the content of the notice prescribed). Employers should also be prepared to apply any temperature or other testing thresholds consistently, to avoid violating anti-discrimination laws. Results of any testing should be kept confidential like any other medical information received concerning employees (i.e., maintained separately from the employee's personnel file and shared no more broadly than necessary). Note that New York has issued guidance indicating that an employer is prohibited from retaining the actual testing results (i.e., the specific temperature data of an individual), but may maintain records confirming that employees were screened and the results of such screening (e.g., pass/fail).
If an employee requests an alternative method of screening in order to accommodate a medical condition, employers should treat this request as they would any other request for accommodation under the ADA. If the employee's disability is not obvious or already known, an employer may ask the employee for information and medical documentation to establish that the condition is a disability and what specific limitations require an accommodation, and then determine if that accommodation or an alternative accommodation can be provided. If the request is easy and inexpensive to accommodate, the employer might voluntarily choose to make the accommodation available to any employee who asks, without engaging in a full interactive process.
5. What obligations may employers trigger if they preclude employees from coming into the workplace?
If an employer sends an employee home or otherwise excludes an employee from the workplace due to COVID-19-related symptoms, illness (including a high temperature), or exposure, the employer may be required to provide such employee with paid leave or job-protected unpaid leave under various federal, state, and local laws (including the Families First Coronavirus Response Act ("FFCRA") and similar state laws), as well as under any existing company policies, employment agreements or collective bargaining agreements.
Under some state and local laws (e.g., California, New York, Massachusetts), employees may also be entitled to reporting-time pay (i.e., wages that compensate employees who report to work as scheduled but who are not put to work) if they show up for work but their employer sends them home. For those employees located in states that do not require reporting-time pay, employees who report to work and are sent home may nonetheless be entitled to reporting-time pay under the terms of an employment agreement, company policy or collective bargaining agreement. Employees may also be entitled to pay under certain state and local "predictable scheduling" laws (including, for example, such laws in Seattle, New York City, and San Francisco) if they do not receive adequate notice of a scheduling change, though some cities (e.g., Chicago) explicitly provide an exception relating to advance notice for changes to an employee's schedule and the payment of predictability pay in the event of a pandemic.
6. How far do employers need to go to accommodate employees with preexisting risk factors who are classified as high-risk for severe illness from COVID-19?
If an employee's pre-existing risk factor (e.g., serious heart conditions, chronic lung disease, diabetes, severe obesity) constitutes a disability under local, state or federal law and an employee requests a reasonable accommodation, an employer must provide a reasonable accommodation unless doing so would pose an undue hardship (i.e., would result in significant difficulty or expense for the employer, taking into account the nature and cost of the accommodation, the resources available to the employer, and the operation of the employer's business), and must engage in an interactive process with the employee in an attempt to define such an accommodation. Under the current circumstances, telework may be a reasonable accommodation, particularly for those employees who already have been working from home. Employers, however, should be mindful they are not treating employees differently based on protected characteristics (e.g., giving female employees more favorable treatment than male employees regarding flexible work requests, perhaps because of gender-based assumptions about childcare responsibilities). Other reasonable accommodations may include alternate work assignments, staggered work schedules or relocation of a desk or workspace. As discussed in Question 2, exclusion of the employee from the workplace may be permissible, but only after individualized assessment.
Based on current EEOC guidance, employers may now begin asking employees with known disabilities whether they will need reasonable accommodations in the future when they are permitted to return to the workplace. Likewise, employers may make information available to all employees regarding who to contact (should they wish to) in order to request accommodation for a disability that they may need upon return to the workplace, or send a general notice to all employees who are designated for return to the workplace, noting that the employer is willing to consider requests for accommodation or flexibilities on an individualized basis and specifying whom employees should contact.
Employees with a Disabled Household Members and Older Employees
An employer is not legally required to provide a reasonable accommodation for an employee because that employee lives in the same household as someone, who, due to disability, is at greater risk of severe illness from COVID-19. Similarly, and in accordance with EEOC guidance, employers are not obligated to provide reasonable accommodations to employees based solely on age (absent a qualifying disability under the ADA). Nevertheless, there may be compelling employee morale, retention, liability risk (See Question 9) and/or other considerations that weigh in favor of flexibility.
7. Can employers instruct workers not to socialize during their off-duty time?
Some employers have considered establishing rules or guidelines that, at least for the near future, discourage employees who report to a physical workplace from engaging in leisure or other activities with anyone other than co-habiting family members. Although such a rule is in many ways un-monitorable and largely unenforceable, and although it seems intrusive by standards that preceded this pandemic, there may be some wisdom to it, in order to promote individual and group employee health and reduce workplace transmission risk. Before adopting rules of this nature, employers will need to navigate state laws that, in some jurisdictions such as New York and California, limit an employer's ability to regulate lawful off-duty conduct. Employers subject to collective bargaining agreements may also need to carefully consider whether such a rule or guideline would trigger a bargaining obligation.
Employers should ensure that any policies they put in place are applied consistently and are narrowly tailored to discourage activities where employees cannot practice social distancing or otherwise comply with public health guidance.
8. What if an employee refuses to return to work?
An employer may terminate the employment of an employee who refuses to come to work out of concern of exposure to COVID-19 if that employee is (i) not disabled (or is disabled but no reasonable accommodation exists that does not impose an undue hardship on the employer) and (ii) not subject to protection under the National Labor Relations Act ("NLRA"), Labor Management Relations Act ("LMRA") or Occupational Safety and Health Act.
In general, a non-disabled employee who refuses to come to work out of concern that he or she will contract COVID-19 is not entitled to a reasonable accommodation (e.g., teleworking) under the ADA. Employers should, however, be mindful that, apart from obvious physical disabilities, employees may have mental health conditions (e.g., anxiety disorder, obsessive-compulsive disorder, post-traumatic stress disorder) that entitle them to a reasonable accommodation under the circumstances. As in any disability accommodation process, employers may (i) ask questions to determine whether the condition is a disability; (ii) discuss with the employee how the requested accommodation would assist him or her and enable that employee to keep working; (iii) explore alternative accommodations that may effectively meet the employee's needs; and (iv) request medical documentation if needed.
The NLRA prohibits retaliating against employees (whether or not represented by a union) who engage in protected concerted activity. Employees who act in concert to refuse to work because of unsafe or unhealthy conditions in the workplace could be deemed to be engaging in protected activity so long as they have a "good faith" belief that their health and safety are at immediate risk—even if they are mistaken. The LMRA contains similar protections, and does not require that employees act in concert with each other to be protected. The LMRA would, however, require an employee to show more than a good faith belief, but rather present ascertainable, objective evidence supporting a conclusion that an "abnormally dangerous" workplace condition exists. Employers may temporarily replace employees who are acting under these NLRA or LMRA protections, but should consult with counsel before securing permanent replacements.
Under the Occupational Safety and Health Act, employees may refuse to perform work if (i) they refused to work in "good faith," meaning that they genuinely believed that an imminent danger existed; (ii) a reasonable person would agree that there is a real danger of death or serious injury; (iii) where possible, they asked the employer to eliminate the danger and the employer failed to do so; and (iv) there is not enough time due to the urgency of the hazard to get the imminent danger corrected through regular enforcement channels, such as requesting an OSHA inspection. While the Act does not expressly prohibit hiring a replacement for an employee who refuses to perform work under these standards, it does prohibit employers from retaliating against employees who exercise these rights, so employers should consult with counsel before discharging or permanently replacing an employee under these circumstances.
9. What liability risks exist should an employee contract COVID-19?
Employers could see personal injury claims from employees who allegedly contract the coronavirus while on the job. For instance, on April 6, 2020, the family of a Walmart employee who died of COVID-19 complications filed suit against Walmart, and a number of similar lawsuits have followed since. Plaintiffs in these cases, however, will face significant hurdles in successfully bringing these claims under current law. Several states (e.g., North Carolina, Louisiana and Georgia) have since passed legislation that protect employers (or, in the case of North Carolina, "essential businesses") from liability claims over exposure to COVID-19, so long as the employer is acting in good faith in accordance with published guidance and has not caused harm through reckless, intentional, willful, or grossly negligence acts. Additionally, Senate Republicans recently unveiled the Health, Economic Assistance, Liability Protection and Schools ("HEALS") Act, which would provide broad liability protections for businesses, schools and other institutions.
Workers' compensation provides benefits (including wage replacement benefits and reimbursement for medical expenses) to employees who are injured or become ill in the course and scope of their job duties and (as to wage replacement benefits) are unable to work. Workers' compensation claims are almost universally covered by workers' compensation insurance policies, unless the employer has opted to self-insure. Workers' compensation claims do not require any proof of negligence or fault, but, in general, the workers' compensation regime preempts all common law and statutory claims against the employer arising out of workplace injuries, including claims of employer negligence. Some states allow exceptions to workers' compensation exclusivity in limited circumstances, such as injuries caused by the employer's "serious and willful misconduct" (a much higher standard than negligence). In some states where there is such an exception, the employee's recourse would be a civil lawsuit; in others, the recourse is an award of double-damages (which is not insurable).
Workers' compensation insurers may take the position that a COVID-19 infection is not a compensable occupational disease that arises out of employment, but rather is an "ordinary disease of life" that is not subject to workers' compensation. Many workers' compensation policies have a second coverage, typically called "Part B, Employer's Liability," to close this insurance gap. Some jurisdictions (e.g., California, and to a lesser extent Washington and Illinois) have taken action to make it more likely that COVID-19-related claims will be eligible for recovery through workers' compensation.
Given the reality of community spread of COVID-19 and asymptomatic transmission, plaintiffs may also struggle to prove that the defendant (in a lawsuit) or the workplace (in a workers' compensation claim, absent the actions taken by the states noted above) was the source of an infection.
Negligence and Standard of Care
While employers cannot prevent employees or their estates from filing claims or lawsuits due to COVID-19 exposure in the workplace (even if those claims ultimately have no merit), employers may be able to mitigate general liability risks by strictly following applicable guidance from the CDC and OSHA (as well as guidance from state and local authorities), educating and constantly communicating with employees so that employees self-monitor for symptoms and practice proper infectious disease control practices, and appropriately informing employees of risks and potential exposure. While it is not clear that following CDC or OSHA guidance would itself be sufficient to avoid liability, it is likely that failure to follow CDC or OSHA guidance would be used by plaintiffs as evidence of failure to fulfill the applicable standard of care.
10. Does requiring employees to adhere to personal cleanliness policies, or to wear masks or other personal protective equipment, have any legal implications?
Any personal cleanliness or workplace hygiene policies should be carefully drafted to include the latest guidance from federal, state and local public health authorities. Supervisors must apply such policies in a neutral and fair manner, in order to reduce the likelihood of claims of unlawful discrimination. Employers should provide facilities and supplies (such as sinks with hot water and soap, and alcohol-based hand-cleansing solution) necessary to comply with its workplace policies.
Requiring employees to wear PPE may trigger OSHA regulations, or comparable state regulations, that impose training and other requirements (e.g., requiring regular hazard assessments, training on proper equipment usage, provision and replacement of equipment). Requiring employees to wear simple masks or other face coverings may arguably trigger these regulations, but, for the duration of the pandemic, and until effective treatments and/or vaccines are identified and widely used, workers—especially in hard-hit geographic areas—should be strongly encouraged, and perhaps even required, to wear masks or other face coverings when interacting closely with colleagues, customers and visitors. In some jurisdictions, state or local law or guidance may require that masks or other face coverings be worn, in particular in situations where social distancing cannot be observed. Although this may upset some workers, rigorous adherence to this practice would likely reduce the risk of workplace transmission of COVID-19, as well as potential liability. If an employer requires masks, other face coverings or PPE, it should provide this equipment to employees. Employers should also be prepared to provide reasonable accommodations for reasons of disability or religion or other protected characteristics.
11. What specific steps can employers take to keep their workplaces safe?
OSHA has published general guidance for employers, which is available here. The CDC's relevant guidance for employers is available here.
In addition, some employers are taking steps such as:
Adopting flexible sick leave policies, and requiring employees to stay home, or, if practicable, work from home, if they are sick (for any reason) or experiencing symptoms of COVID-19;
Screening employees' temperatures, requiring completion of daily health attestation forms, and informing and encouraging employees to self-monitor for COVID-19 signs and symptoms;
Suspending use of common areas, establishing occupancy protocols for high-traffic areas (e.g., bathrooms), and discouraging shared use of work tools and equipment;
Promoting frequent and thorough handwashing;
Cleaning and disinfecting the workplace routinely;
Limiting visitors and in-person meetings;
Recommending (or requiring under certain circumstances) that employees wear masks or other face coverings;
Limiting or prohibiting non-essential work travel;
Creating contact assessment protocols; and
Monitoring evolving legal developments and public health recommendations.
Douglas Brayley
Megan Bisk
Lauren E. Ramirez
Rebecca M. Mitchell


We aim to provide everyone who comes into contact with our services the highest possible quality of health care. To do this we must keep records about you, your health and the care we have provided or plan to provide you.
We are committed to using records about you in a way which respects your rights and promotes your wellbeing. We work to keep your personal information secure and confidential. We undertake an annual assessment called Data Security and Protection Toolkit to demonstrate that this is so.
For this reason we need the information we hold about you to be as accurate and up to date as possible. So please let us know if any of your personal details change.
We work to involve you in decisions about your care and provide you with clear, comprehensive information to support you to make choices about your care.
Access to your clinical records is limited to clinical teams who are working with you. We are moving to use new technology as it becomes available if we believe it will enhance our ability to deliver better services, and responds to people's needs more quickly. We use electronic patient records to securely store clinical information which is only accessed by individuals directly involved in your care. More recently we began using Skype for Business (formerly Microsoft Lync) to conduct virtual consultations with clinicians where this is appropriate for both clinician and patient. You are still able to access a clinician in person should you prefer. We have also begun to use a company called DOCMAIL to deliver high quantity letters, e.g. appointments. The company fully complies with the Data Protection Act and General Data Protection Regulations. While these things are new, we rigorously ensure any systems we use conform to NHS information governance standards and that the appropriate level of encryption and security standards are met.
What else we might use this information for?
Investigate any incidents which occur, or any concerns or complaints that you may have about your care. This may involve liaising with other services involved in tour care, and in some circumstances, other NHS bodies may be involved in regulating the services we provide.
You may be receiving care from other people as well as the NHS (like social services). We may need to share some information about you so we can all work together for your benefit. We will only use or pass on information about you if you have agreed to us doing so and if others involved in your care have a genuine need for it. When we pass on any information we will ensure that it is kept confidential and secure.
We will not usually disclose information to your family or carer without your agreement. This will be discussed with you and, with your agreement, we will keep your relatives, friends or carers up to date with your care and treatment.
The General Data Protection Regulations provide you with a number of rights in relation to the information that we hold. You can read more about these rights in the Privacy Notice section.


The lives of coal miners and their families have always been difficult, but during the nineteenth and early twentieth centuries things were especially hard. Boys had to go to work as soon as they were able, in order for the families to survive. My own grandfather went to work in the mines when he was thirteen and a great uncle started when he was eight. The rule of thumb in many families was that, if the boy could carry his lunch bucket at his side without it dragging on the ground, he was big enough and old enough to go to work in the mines. The mining companies controlled everything. The owned the housing around the mines. They paid the miners with company script (not money) that could only be spent in the company owned stores. (Think of the old song "Sixteen Tons." The miner says, " Saint Peter don't you call me cause I can't go. I own my soul to the company store.") The work was difficult and dangerous.
In The Breaker Boys by Pat Hughes, Nate Tanner is a rich boy whose family owns coal mines near Hazleton, PA. He has everything a kid could want or need - except a friend. Then he meets Johnny an easygoing Polish American boy who works sorting coal in a filthy, dark building called a breaker. Unaware that Nate is the boss's son, Johnny invites him to play baseball with the breaker boys. As the summer of 1897 progresses, Nate finds himself piling lie on top of lie to keep his identity a secret from Johnny, and the friendship a secret from his family. It also becomes harder and harder for Nate to accept the treatment of the miners and their families.


text:
Q: Algebra where operators are assumed as variables. Does there exists any form of Algebra where operators can be assumed as variables?
For example:
$$
1+2\times3=7
$$
can be considered as:
$$
1\:(\mathrm{\,X})\:2\:(\mathrm{Y})\:3=7
$$
?

A: I would say the answer is most definitely yes, if you construe the operators to be functions.  For example, we could represent the "operator" $+$ (on $\mathbb{Z}$, the integers, for example) to be the function $p: \mathbb{Z} \times \mathbb{Z} \to \mathbb{Z}$ given by $p(z_1, z_2) = z_1 + z_2$ for $(z_1, z_2) \in  \mathbb{Z} \times \mathbb{Z}$; likewise the "operator" * would be a function $t: \mathbb{Z} \times \mathbb{Z} \to \mathbb{Z}$ such that $t(z_1, z_2) = z_1*z_2$; with these conventions, the equation $1 + 2*3 = 7$ would be written $p(1, t(2, 3)) = 7$.  Now observe that $p$ and $t$ are "merely" elements of the set $\mathcal{F}$ of functions from $\mathbb{Z} \times \mathbb{Z}$ to $\mathbb{Z}$; letting $f_1, f_2$ denote variables ranging over the set $\mathcal{F}$, we see that our expression $p(1, t(2, 3))$ in fact corresponds to letting $f_1 = p$ and $f_2 = t$; clearly many other such choices are possible, though most of them would yield an $f_1(1, f_2(2, 3))$ which is more difficult to compute!  But in fact a similar paradigm occurs over and over again in certain areas of mathematics.
One problem which might be encountered in this approach is that of parsing an expression like $1(X)2(Y)3$ into appropriate functional form, how to group the elements and so forth.  But I'll leave that discussion for future research and questions!
Hope this helps!  Cheers, Bob Lewis.

A: Absolutely! In abstract algebra, you study general operations, besides $+$ and $\times$, that satisfy certain identities. An example of an identity is your equation $1\mathop X (2\mathop{Y}3)=7$. This equation constrains the variables $X$ and $Y$, subject to the constants 1, 2, 3, and 7. So you could say that $X={+}$ and $Y={\times}$ is a "solution" to the equation, whereas $X={\times}$ and $Y={+}$ is not a solution. However, unless you're working with differential equations, I don't think that terminology is very common. Usually you would give a name to a kind of operation that satisfies a given identity. For example, an operation $\circ$ is called commutative if $a\circ b = b\circ a$ for all $a$ and $b$. Then you would say that addition is commutative, but subtraction is not commutative.
In universal algebra, you go even further and treat the identities themselves as variables! From this viewpoint, you can consider all possible sets of identities and their interrelationships. I'm horribly rusty, so please don't ask me to expand on this idea. :)

redpajama_set_name: RedPajamaStackExchange


1. What's your No.1 drink at Annee's?
3. Which fictional character best describes you?
4.Where do you want to be in 5 years?
5. What are your Top 5 everyday essential items?
Drinking Annee's by the surf/beach making surfboards.
I want to be happy with where I am in life and enjoy the work I do.
Phone, iPod, hair serum, notebook & water bottle.
Phone, wallet, water, headphones and snack.
Lip Balm, Phone, hair tie, charger & prodive hoodie.
Pikachu: fast, always smiling and can be powerful, loyal.


In the O&M field, operators encounter the following common problem if there is a fault: large number of alarms, difficult fault locating, and numerous invalid dispatches. An operator in country J is used as an example. The number of reported alarms differs greatly from the number of valuable dispatches within one month, and 99.96% of reported alarms are invalid.
Use the AI training platform to learn alarm correlation rules based on historical alarms and topology database data. The real-time alarm sequences identify flag alarms based on alarm correlation rules and help implement cross-domain alarm correlation, greatly reducing the number of duplicate dispatches. Analyze fault root causes based on flag alarms, the fault cause library, and maintenance database, reducing invalid site visits caused by faults, such as software faults.
Operator M is used as an example. A total number of 2 million alarms are reported on a day. After the alarms are merged in the centralized fault handling system, most alarms can be filtered out, and the dispatch system generates about 4000 dispatches. The system can filter out 30% of duplicate dispatches and 30% of invalid dispatches based on the analysis and the AI accurate dispatch solution. The system can further filter out 30% of unnecessary site visit dispatches based on root cause analysis. Finally, there are about 1400 valuable dispatches.


text:
Der IBU-Cup 2017/18 wurde zwischen dem 22. November 2017 und dem 17. März 2018 ausgetragen. Die Wettkämpfe waren international besetzt und waren nach dem Biathlon-Weltcup 2017/18 die zweithöchste Wettkampfserie im Biathlon.

Titelverteidiger der Gesamtwertung waren Alexei Wolkow und Darja Wirolainen.

Höhepunkt der Saison waren die Biathlon-Europameisterschaften im italienischen Ridnaun. Die Wettkämpfe flossen auch in dieser Saison in die Wertung des IBU-Cups mit ein.

Zum ersten Mal wurde in dieser Saison die Disziplin Super-Sprint beim letzten IBU-Cup in Chanty-Mansijsk ausgetragen.

Austragungsorte

Wettkampfkalender

Frauen

Pokalwertungen Frauen

Männer

Pokalwertung Männer

Mixed

Anmerkungen

Weblinks
 Offizielle Homepage der IBU

2017/18
Biathlonveranstaltung 2017
Biathlonveranstaltung 2018
Wintersport-Continental-Cup 2017/18

redpajama_set_name: RedPajamaWikipedia


text:
Q: Bootstrap responsive grid changing order of columns when displayed on mobile with rows? ----------------------
A   |    B     |   C
----------------------

when scaled to mobile I will expect:
-------
   B
-------
   A
-------
   C

Is it possible with new in Bootstrap3 push option?
I was trying

        A

          B

         C

A: See this question

*

*col-vp-push-x = push the column to the right by x number of columns, starting from where the column would normally render -> position: relative, on a vp or larger view-port.

*col-vp-pull-x = pull the column to the left by x number of columns, starting from where the column would normally render -> position: relative, on a vp or larger view-port.
vp = xs, sm, md, or lg
x = 1 thru 12
I think what messes most people up, is that you need to change the order of the columns in your HTML markup (in the example below, B comes before A), and that it only does the pushing or pulling on view-ports that are greater than or equal to what was specified. i.e. col-sm-push-5 will only push 5 columns on sm view-ports or greater.

*

*(Desktop) Larger view-ports get pushed and pulled.

*(Mobile) Smaller view-ports render in normal order.

DEMO

        Content B

        Content A

        Content C

View-port >= sm
|A|B|C|

View-port < sm
|B|
|A|
|C|


text:
What is IMO on Facebook?
imo is a simple and fun way to message and video chat. Download the free app on Android, iPhone, and iPad. Additional Information. – Avoid SMS and phone charges – unlimited messages and calls over your 3G, 4G or Wi-Fi connection. – High-quality video and voice calls.
Is Imo safe for privacy?
IMO app uses encryption services to ensure that all the calls, all the chats and any data you share with the application remains as secure and private as instinctively possible.
Who is the owner of Imo app?
Ralph Harik
What does IMO app do?
imo is a free video, voice and chat app that lets you talk to your contacts one-on-one or in groups. The app also connects you to people you don't know through turning on your location and connecting with people close by.
Can someone monitor my IMO video call?
"Video calling can easily be hacked by monitoring the IP addresses of both the users and hackers can see live video chats. Or, if there is a screen recording app installed at the other end, your video calls can be recorded and be compromised," said Mohit Kumar, another cyber expert.
Can I use the same IMO account on 2 phones?
Click the "Link accounts" button in the top right corner of your screen. (Note: This button will only appear once two or more accounts have been added to your imo account.) Linking accounts allows you to automatically sign in to all of your added services while only using one to sign in to the imo service.
What is EU MRV regulation?
The EU MRV Regulation (EU) 2015/757 on "monitoring, reporting and verification of carbon dioxide emissions from maritime transport" was adopted by European Council (EC) and Parliament and entered into force on 1 July, 2015. The primary aim of this regulation is for reducing CO2 emissions from maritime transport.
Is Solas part of Imo?
To achieve this, the International Maritime Organization (IMO) relies on its two very strong pillars: SOLAS & MARPOL – The International Conventions for safeguarding human life and marine environment from all kinds of pollutions and accidents.
How can I know my IMO vessel number?
The integrity of an IMO number can be verified using its check digit. This is done by multiplying each of the first six digits by a factor of 2 to 7 corresponding to their position from right to left. The rightmost digit of this sum is the check digit.
What is the highest body of Imo?
How much data does IMO use for video calling?
Per minute (video call) = ~3.25 MB. Per hour (video call) = ~ 195 MB. Per minute (audio call) = ~2 MB. Per minute (audio call) = ~ 120 MB.
Is Imo connected to Facebook?
Imo currently supports accounts through MSN, Facebook, Google Talk, Yahoo!, Skype, AIM (AIM!), ICQ, Jabber and Steam, among others. …
What is IMO on social media?
IMO stands for in my opinion. You might also see, "IMHO" (in my humble opinion.)
What does IMO mean when texting?
What is Seemp part1?
The inclusion of new regulation 22A, will now require two parts to a SEEMP. Part I (ship management. plan to improve energy efficiency), which is applicable to ships of 400 gross tonnage and above, to contain. a possible approach for monitoring ship and fleet efficiency performance over time and some options to.
What does Yeah IG mean?
I Guess. When used to mean "I Guess," IG usually indicates agreement on the part of the sender with something that has just been said. IG usually implies reluctance or uncertainty, rather then whole-hearted agreement and is often used when people would rather say "no," but don't want to appear rude.
What is a MRV Report?
When it comes to climate action, effective measurement, reporting and verification (MRV) of emissions and emissions reductions is critical to help countries understand GHG sources and trends, design mitigation strategies, enhance credibility and take other policy actions.
Why was IMO created?
International Maritime Organization (IMO), formerly (1948–82) Inter-governmental Maritime Consultative Organization, United Nations (UN) specialized agency created to develop international treaties and other mechanisms on maritime safety; to discourage discriminatory and restrictive practices in international trade and …
Which app uses the least data for calls?
Apple's FaceTime used the least amount of data in the test, eating up 8.8MB of data in a 4-minute call. Skype and WhatsApp consumed an average of 12.3MB and 12.74MB of mobile data during video calls.
Is Imo better than WhatsApp?
As WhatsApp is an old app, it has upgraded so much now and its features are more than the IMO. WhatsApp was first used for messaging App that's why its messaging feature is very fast and strong. IMO is new App it needs more improvement and new features. IMO is famous for its Video and Audio calling.
Is Imo Banned in UAE?
IS IMO BLOCKED IN UAE? Yes, IMO is also an unlicensed VoIP service that is not supported in the UAE.
Why do people say IMO?
The term IMO, with the meaning "In My Opinion", is typically used to preface a comment in order to make the speaker appear less forthright and authoritative. IMO means "I'm not stating this as a fact, but it is what I believe".
What is IMO DCS?
The International Maritime Organization (IMO) adopted a mandatory Fuel Oil Data Collection System (DCS) for international shipping, requiring ships of 5,000 gross tonnage or above to start collecting and reporting data to an IMO database from 2019.
What does MRV stand for?
Defining MRV MRV stands for Measurement (or estimation), Reporting and Verification. MRV of emissions: estimation of emissions at national, regional, sectoral levels.
21/12/2021 administrator Authoring Tools

redpajama_set_name: RedPajamaCommonCrawl


text:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<TITLE>
BasicConnection (VMware vSphere Web Services SDK JAXWS Java Samples Documentation)
</TITLE>

<META NAME="date" CONTENT="2013-08-19">

<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">

      Overview
      Package
    Class
      Tree
      Deprecated
      Index

 PREV CLASS
 NEXT CLASS

  FRAMES
 NO FRAMES

  All Classes

  SUMMARY: NESTED | FIELD | CONSTR | METHOD

DETAIL: FIELD | CONSTR | METHOD

com.vmware.connection

Class BasicConnection

java.lang.Object
  com.vmware.connection.BasicConnection

All Implemented Interfaces:
Connection

public class BasicConnection
extends java.lang.Object
implements Connection

This simple object shows how to set up a vSphere connection as it was done in vSphere 4.x and is provided
 as a reference for anyone working with older vSphere servers that do not support modern SSO features.
 It is intended as a utility class for use by Samples that will need to connect before they can do anything useful.
 This is a light weight POJO that should be very easy to reuse later.

 Samples that need a connection open before they can do anything useful extend ConnectedVimServiceBase so that the
 code in those samples can focus on demonstrating the feature at hand. The logic of most samples will not be
 changed by the use of the BasicConnection or the SsoConnection.

See Also:
ConnectedVimServiceBase

Constructor Summary

BasicConnection()

Method Summary

 Connection
connect()

 Connection
disconnect()

 java.util.Map
getHeaders()

 java.lang.String
getHost()

 java.lang.String
getPassword()

 java.lang.Integer
getPort()

 com.vmware.vim25.ServiceContent
getServiceContent()

 java.lang.String
getServiceInstanceName()

 com.vmware.vim25.ManagedObjectReference
getServiceInstanceReference()

 java.lang.String
getUrl()

 java.net.URL
getURL()

 java.lang.String
getUsername()

 com.vmware.vim25.UserSession
getUserSession()

 com.vmware.vim25.VimPortType
getVimPort()

 com.vmware.vim25.VimService
getVimService()

 boolean
isConnected()

 void
setPassword(java.lang.String password)

 void
setUrl(java.lang.String url)

 void
setUsername(java.lang.String username)

Methods inherited from class java.lang.Object

equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Constructor Detail

BasicConnection

public BasicConnection()

Method Detail

setUrl

public void setUrl(java.lang.String url)

Specified by:
setUrl in interface Connection

getUrl

public java.lang.String getUrl()

Specified by:
getUrl in interface Connection

getHost

public java.lang.String getHost()

Specified by:
getHost in interface Connection

getPort

public java.lang.Integer getPort()

Specified by:
getPort in interface Connection

setUsername

public void setUsername(java.lang.String username)

Specified by:
setUsername in interface Connection

getUsername

public java.lang.String getUsername()

Specified by:
getUsername in interface Connection

setPassword

public void setPassword(java.lang.String password)

Specified by:
setPassword in interface Connection

getPassword

public java.lang.String getPassword()

Specified by:
getPassword in interface Connection

getVimService

public com.vmware.vim25.VimService getVimService()

Specified by:
getVimService in interface Connection

getVimPort

public com.vmware.vim25.VimPortType getVimPort()

Specified by:
getVimPort in interface Connection

getServiceContent

public com.vmware.vim25.ServiceContent getServiceContent()

Specified by:
getServiceContent in interface Connection

getUserSession

public com.vmware.vim25.UserSession getUserSession()

Specified by:
getUserSession in interface Connection

getServiceInstanceName

public java.lang.String getServiceInstanceName()

Specified by:
getServiceInstanceName in interface Connection

getHeaders

public java.util.Map getHeaders()

Specified by:
getHeaders in interface Connection

getServiceInstanceReference

public com.vmware.vim25.ManagedObjectReference getServiceInstanceReference()

Specified by:
getServiceInstanceReference in interface Connection

connect

public Connection connect()

Specified by:
connect in interface Connection

isConnected

public boolean isConnected()

Specified by:
isConnected in interface Connection

disconnect

public Connection disconnect()

Specified by:
disconnect in interface Connection

getURL

public java.net.URL getURL()

Specified by:
getURL in interface Connection

      Overview
      Package
    Class
      Tree
      Deprecated
      Index

 PREV CLASS
 NEXT CLASS

  FRAMES
 NO FRAMES

  All Classes

  SUMMARY: NESTED | FIELD | CONSTR | METHOD

DETAIL: FIELD | CONSTR | METHOD

redpajama_set_name: RedPajamaGithub


text:
MAPFRE Global Corporate
Log In - Online Portals
MotorMax Insurance
Max Protect
Other Insurance Products
SME Insurance
MyInsurance
Buy, Quote & Renew Online
Motor Claims
Home Claims
Travel Claims
Boat Claims
Business Claims
Authorised Repairers
Wedding Claims
Middlesea Assist
Plumbing Emergencies
Electrical Emergencies
Mediphone
Insure and Save
New Regional Office in Luqa
Category: News 2015
Entity: MAPFRE
MAPFRE Middlesea, has announced the opening of a new Regional Office in Luqa. The office is situated at Magri Autocare Building, Triq il-Kunsill ta' l-Ewropa. This Regional Office is in line with the distribution strategy stipulated by the company, to spread out the offices in order to better cater to the clients' needs.
The Regional Office will provide a complete range of insurance products and services, wherein a specialised team will assist clients with all their insurance, protection, savings, investment and retirement needs. It also houses a motor claims surveying area in attendance. The office is open from Monday to Friday from 8:00 hrs to 17:00 hrs. In August, the opening hours are from 8:00 hrs to 13:00 hrs.
Announcing the opening, Assistant General Manager Fernando Docampo said "We are proud to add a new Regional Office to our network. Our company is going from strength to strength and I am very pleased that we are enhancing accessibility. We consider this office as yet another milestone in our continuous determination to pursue excellence, something that we will surely continue to invest in in the near future."
MAPFRE Middlesea currently has two other regional offices situated in Birkirkara and Floriana, as well as a network of intermediaries all around Malta and Gozo.
MAPFRE Middlesea is Malta's leading insurance company, listed in the Stock Exchange and with an operating history of over 30 years. It is also a member of global insurance group MAPFRE.
For further information visit our website www.middlesea.com or send an email to mapfre@middlesea.com or call on 25694700.
MAPFRE Middlesea p.l.c. (C-5553) is authorised by the Malta Financial Services Authority to carry on both Long Term and General Business under the Insurance Business Act, 1998. COM 13072015 941.
Since All January February March April May June July August September October November December All 2010 2011 2012 2013 2014 2015
To All January February March April May June July August September October November December All 2010 2011 2012 2013 2014 2015
Insure and Save Loyalty Card Facebook Page
MAPFRE Middlesea © 2020 All rights reserved
Download Motor App


All of our work is done in our warehouse location. No job is to big for us at The Frame Market with over thousands of feet of moulding in-stock. You not only receive excellent customer service but excellent framing at an unbeatable time.
The Frame Market also Provides for the trade. We also welcome Military jobs such as American Flags with medallions framed into a shadow box. We also welcome jobs for hotel lobbies as well as government buildings. We offer our services in the most cost and time efficient manner possible.


The mind maps are one of the most popular methods for learning and remembering. It's an effective visual technique that easily unlocks your brain's potential. There're no age or whatsoever limits for using mind mapping and it's productive for every aspect of your life.
Mind maps is a way to brainstorm. They set your ideas free and make it easier to analyze and memorize things.
Using mind maps daily will your change the way you think and create, positively changing the way you feel. Since there's no limit on the number of ideas and links your brain creates, there's also no limit on the different ways you can use the maps. Mind maps turn boring data into vivid, memorable and well-organized charts. The most beautiful thing about mind maps is that they work in sync with the natural way our brain works.
Start in the center of your writing space. Whether it's a sheet of paper, sketchbook or an Escreo wall, starting in the center gives the brain the freedom to spread in all directions and express itself more naturally.
Sketch your central idea. An image can tell a thousand words and it also unlocks your imagination. Using an image as a starting point, stimulates your brain to produce more ideas.
After adding a few ideas, start connecting their main branches to the central image. Then connect the second and third level branches to the first and second levels, and so on. Remember that our brain loves associations. Try connecting two (or three or four) ideas together. This way you may discover new points of view.
Use colors! They stimulate your brain, spark your creative thinking and are simply fun! Check our colorful writing accessories here.
Use various shapes to draw the branches – zig-zag, waves, double lines, braids, etc. Avoid straight lines! They kill all the fun and suppress your imagination.
Use one keyword per line. This way your mind map is fit and precise. Try using pictures everywhere, even if you can't draw well. Each image, just like the central one, tells a thousand words. So 10 images in your mind map tell around 10,000 words. Wow!
Do you use mind maps? And do you feel inspired to get started now? Share your mind maps with us here!


text:
Marriage and civil rights
The case for monogamy
Polygamists deserve tolerance, not legal recognition
by Stephen Macedo | Princeton University
Stephen Macedo is Laurance S. Rockefeller Professor of Politics and the University Center for Human Values at Princeton University and the author of, Just Married: Same-Sex Couples, Monogamy, and the Future of Marriage (Princeton University Press, 2015)
MANY progressives are signing on to a central plank in Chief Justice John Roberts's dissent in the recent same-sex marriage case. As W.W. put it in a recent post here, now that same-sex marriage has "blasted open" the "libertarian door," liberals need "more rationally compelling arguments" to shut polygamists out. Indeed, the author asserts that accounts of polygamy's social harms, including mine, have "the same speculative character as some conservative arguments against legal gay marriage." And if polygamy in practice has always been patriarchal, the same could have been said of monogamous marriage until 40 (or 50?) years ago. If one can be reformed why not the other?
Others charge that mere "political pragmatism" led many same-sex marriage proponents to distance themselves from polygamy. In so doing, says Fredrik DeBoer, these erstwhile liberals ignore the principle that "consent is the measure of all things in sexual and romantic practice." We will now reap the "long term cost" of the "incredibly flimsy" arguments against polygamy advanced on behalf of liberal monogamy, including same-sex marriage.
Yet W.W., Mr DeBoer, and other libertarians seem unaware of the extensive evidence of polygamy's social harms, as well as the principled reasons for distinguishing plural from same-sex marriage. They are also too quick to conflate social tolerance, partial recognition and equal recognition of plural marriages. Finally, consent is not the only basis for drawing legal distinctions when it comes to "all things" marital. Let's take these up briefly in turn.
If same-sex marriage is legal, why not polygamy?
I explore the evidence of polygamy's harms in a recently published book, drawing on many sources that include the well-informed 100,000-word opinion penned by Chief Justice Robert Bauman of the Supreme Court of British Columbia in its landmark case on polygamy. Assisted by eminent scholars and extensive first-hand testimony, Justice Bauman assembled "the most comprehensive judicial record on the subject ever produced." That record demonstrates "a very strong basis for a reasoned apprehension of harm…inherent in the practice of polygamy", harm "to women, to children, to society and to the institution of monogamous marriage."
The vast majority (85%) of the polygamous societies studied by anthropologists reveal the arrangement to be a marker of privilege and high status. In that form—as polygyny, one husband with multiple wives—plural marriage still prevails across much of the world. Polyandry, or a marriage involving multiple husbands, is rare and fragile and seems to exist mainly under highly unfavourable circumstances (as when brothers marry the same woman in order to keep intact a farm that can only support one family).
Polygyny increases competition among men and the pool of unmarried males, which contributes to greater violence, risk taking, and substance abuse in society (if the top 10% of males take an average of three wives, 20% of men will be unable to marry). Complex plural families—composed of multiple wives and children related as half-siblings—are prone to jealousy and conflict. Even accounts sympathetic to polygamy identify jealousy as a big problem, and diminished genetic relatedness is a risk for sexual abuse. Polygamous families are characterised by much higher levels of violence and stress in the home, as well as worse health outcomes for women and children.
Monogamy, in contrast, gives better-off men an incentive to invest their surplus resources in their children rather than in acquiring additional wives. Indeed, studies of Mormon polygamy in the 19th century found that the children of poorer men tended to enjoy better health and longevity because their fathers couldn't afford to have multiple wives. Moreover, the "cruel arithmetic" of polygyny requires that many younger and lower-class males, potential competitors for younger wives, will be expelled from polygamous communities by older, higher-status males.
Because monogamy increases the surplus resources available to be invested in children and reduces conflict and competition, it enables greater social progress. The origins of monogamy are unknown, but it became the rule in ancient Greece and Rome and spread through Rome's influence. The transition to institutionalised monogamy thus appears to have contributed to more egalitarian social relations, greater social progress and a fairer distribution of the opportunity to marry and create a family.
In addition to the large body of empirical evidence—the surface of which I have barely scratched here—there are principled reasons that distinguish polygamy and same-sex marriage.
First, common sense and evidence suggest that plural marriage is "an advantageous strategy available to those with the inclination and resources to pursue it," in the words of Justice Bauman. Whereas most people experience sexual orientation as a given, any of us might form the preference for bringing a third person into our sexual relationships (and men seem most prone to this). In addition, equality in marriage requires reciprocity, as two people come to depend on one another and must negotiate ways of conducting wide segments of their lives together. Bringing in a third person—making the dyad a triad—compounds the complexity of all these negotiations and is a recipe for conflict.
A third consideration in favour of one spouse per person is distributive fairness. Most men and women strive mightily to find a suitable marriage partner. We should design our social and political institutions, here as elsewhere, to secure the conditions within which this opportunity is available to all on fair terms. Monogamy serves this important public purpose, while polygamy is associated in practice with status and gender hierarchies.
Finally, it was long argued that same-sex marriage would degrade marriage for all but no one ever explained how. Plural marriage, in contrast, changes the character of marriage deeply in a way that degrades its core meaning. Millions have entered into marital commitments with the assurance that marriage is monogamous: the law of marriage confirms it. Monogamous marital commitment therefore provides a basis for the mutual trust that allows two people to build a life in common. The option of legally recognised polygamy changes the public meaning of marriage for all by furnishing options for married couples that many—I'd wager most—would find unwelcome. Plural civil marriage would thus undermine assurances central to marriage as we know it, assurances that the vast majority find deeply valuable.
21st-century mating: Luv u l8r
The libertarians are unlikely to be moved by any of this because, as W.W. says, liberal monogamists cannot show that the "patriarchal, inegalitarian aspects of historical plural marriage" are "incapable of being fixed". True: you cannot prove a negative. But why is it not equally likely that a significant minority of well-off men could find plural marriage an exciting option (Newt Gingrich's second wife has reported that he proposed an open marriage before divorcing her). Polygamy is already making a comeback in China in spite of the fact that it remains against the law, and in other places legal restrictions are being relaxed.
W.W. and others observe that polygamous marriage will be deeply unattractive to all but a small minority of women. If polygamy remains a fringe phenomenon, as it is now in America, then there is nothing to worry about. This is one reason why we can safely tolerate polygamy, but I do not think we should go further and extend equal recognition. The law of monogamy reflects and reinforces sensible judgments about the patterns of life that are generally happy and successful.
The real question is: why would anyone argue for the equal legal recognition of plural marriage given that it has existed for centuries but never taken the hoped-for egalitarian social form? Mr DeBoer asserts that, "Polyamory", the name given to egalitarian adult romantic networks, "is a fact. People are living in group relationships today." Yet he cites no studies of the prevalence of this arrangement—or its effects—because there are none. The evidence of polyamory is entirely a matter of anecdote, speculation and free-love advocacy. In no Western society is there any broad social movement for polygamous or "polyamorous rights" equivalent to the decades-long struggle for the rights of gay, lesbian and transgendered citizens. Responsible liberal societies ought to reform complex social institutions such as marriage on the basis of reliable evidence and widely available social knowledge.
Let me be clear: I am not arguing that polygamy is "inherently immoral", as some have asserted in the past with respect to both plural and same-sex relations. I also allow that in particular instances polygamous families can be successful and healthy. But the general human experience with polygamy–past and present–suggests to me that there are weighty and legitimate grounds for concern here that allow us to distinguish plural and same-sex marriage.
So I agree with the libertarians that consensual plural cohabitation should not be prosecuted. Tolerance has been the de facto policy across America for decades, though we may need clarification on that score. A clear policy of toleration would be sufficient to allow respectable polygamists now living in the shadows to emerge. No doubt we will continue to learn about this "experiment in living". But equal legal recognition of polygamous marriage requires positive evidence that this is a general social form that serves the interests of adults, children and society generally in a way that is consistent with our basic constitutional commitments to equal liberty and fair opportunity. Whatever the libertarians might say, the public morality of a liberal society not only allows but requires reasonable efforts to preserve important social institutions that are conducive to equal freedom and fair opportunity for all.
The libertarians are right about one thing: no one knows how these matters will look 100 years from now. But why should we expect future generations to look favourably on radical social experiments conducted in the absence of supportive evidence? And why would we credit their judgment if they did? History's arc, as best we can now tell, bends away from the plural marriage and toward monogamy, gender equality, and same-sex marriage.


text:
// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.ui.jcef;

import com.intellij.credentialStore.Credentials;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.ui.JBColor;
import com.intellij.ui.scale.JBUIScale;
import com.intellij.ui.scale.ScaleContext;
import com.intellij.util.IconUtil;
import com.intellij.util.LazyInitializer;
import com.intellij.util.ObjectUtils;
import com.intellij.util.ui.UIUtil;
import org.cef.browser.CefBrowser;
import org.cef.browser.CefFrame;
import org.cef.callback.CefAuthCallback;
import org.cef.callback.CefContextMenuParams;
import org.cef.callback.CefMenuModel;
import org.cef.callback.CefNativeAdapter;
import org.cef.handler.*;
import org.cef.network.CefRequest;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeListener;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Objects;
import java.util.concurrent.locks.ReentrantLock;

import static com.intellij.ui.scale.ScaleType.OBJ_SCALE;
import static com.intellij.ui.scale.ScaleType.SYS_SCALE;
import static org.cef.callback.CefMenuModel.MenuId.MENU_ID_USER_LAST;

/**
 * Base class for windowed and offscreen browsers.
 */
@SuppressWarnings("unused")
public abstract class JBCefBrowserBase implements JBCefDisposable {
  /**
   * @see #setProperty(String, Object)
   */
  public static class Properties {
    /**
     * Prevents the browser from providing credentials via the
     * {@link CefRequestHandler#getAuthCredentials(CefBrowser, String, boolean, String, int, String, String, CefAuthCallback)} callback.
     *

     * Accepts {@link Boolean} values. Use the property to handle the callback on your own.
     */
    public static final @NotNull String NO_DEFAULT_AUTH_CREDENTIALS = "JBCefBrowserBase.noDefaultAuthCredentials";

    /**
     * Disables or enables a context menu on click.
     *

     * Accepts {@link Boolean} values.
     */
    public static final @NotNull String NO_CONTEXT_MENU = "JBCefBrowserBase.noContextMenu";

    /**
     * Whether the browser is represented by a lightweight component.
     *

     * Accepts {@link Boolean} values. By default the browser is rendered in the windowed mode and is represented
     * by a heavyweight component. However, when the browser is rendered in the off-screen mode via a software (buffered)
     * renderer it is normally represented by lightweight (Swing) component.
     *
     * @see JBCefOsrHandlerBrowser
     */
    public static final @NotNull String IS_LIGHTWEIGHT = "JBCefBrowserBase.isLightweight";

    static {
      PropertiesHelper.setType(NO_DEFAULT_AUTH_CREDENTIALS, Boolean.class);
      PropertiesHelper.setType(NO_CONTEXT_MENU, Boolean.class);
      PropertiesHelper.setType(IS_LIGHTWEIGHT, Boolean.class);
    }
  }

  @NotNull protected static final String BLANK_URI = "about:blank";
  @NotNull private static final Icon ERROR_PAGE_ICON = AllIcons.General.ErrorDialog;

  @SuppressWarnings("SpellCheckingInspection")
  protected static final String JBCEFBROWSER_INSTANCE_PROP = "JBCefBrowser.instance";
  @NotNull private final DisposeHelper myDisposeHelper = new DisposeHelper();
  @Nullable private volatile LoadDeferrer myLoadDeferrer;
  @NotNull private String myLastRequestedUrl = "";
  @NotNull private final Object myLastRequestedUrlLock = new Object();
  @Nullable private volatile ErrorPage myErrorPage;
  @NotNull protected final PropertiesHelper myPropertiesHelper = new PropertiesHelper();

  private static final LazyInitializer.LazyValue<@NotNull String> ERROR_PAGE_READER = LazyInitializer.create(() -> {
    try {
      return new String(FileUtil.loadBytes(Objects.requireNonNull(
        JBCefApp.class.getResourceAsStream("resources/load_error.html"))), StandardCharsets.UTF_8);
    }
    catch (IOException | NullPointerException e) {
      Logger.getInstance(JBCefBrowser.class).error("couldn't find load_error.html", e);
    }
    return "";
  });

  private static final LazyInitializer.LazyValue<ScaleContext.@NotNull Cache<String>> BASE64_ERROR_PAGE_ICON = LazyInitializer.create(
    () -> {
      return new ScaleContext.Cache<>((ctx) -> {
        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
          BufferedImage image = IconUtil.toBufferedImage(IconUtil.scale(ERROR_PAGE_ICON, ctx), false);
          ImageIO.write(image, "png", out);
          return Base64.getEncoder().encodeToString(out.toByteArray());
        }
        catch (IOException ex) {
          Logger.getInstance(JBCefBrowser.class).error("couldn't write an error image", ex);
        }
        return "";
      });
    });

  /**
   * According to
   * SetZoomLevel
   * docs, there is a geometric progression that starts with 0.0 and 1.2 common ratio.
   * Following functions provide API familiar to developers:
   *
   * @see #setZoomLevel(double)
   * @see #getZoomLevel()
   */
  private static final double ZOOM_COMMON_RATIO = 1.2;
  private static final double LOG_ZOOM = Math.log(ZOOM_COMMON_RATIO);
  @NotNull protected final JBCefClient myCefClient;
  @NotNull protected final CefBrowser myCefBrowser;
  private final @NotNull RenderingType myRenderingType;
  @Nullable private final CefLifeSpanHandler myLifeSpanHandler;
  @Nullable private final CefLoadHandler myLoadHandler;
  @Nullable private final CefRequestHandler myRequestHandler;
  private final @Nullable CefContextMenuHandler myContextMenuHandler;
  private final ReentrantLock myCookieManagerLock = new ReentrantLock();
  @Nullable private volatile JBCefCookieManager myJBCefCookieManager;
  @Nullable private volatile String myCssBgColor;
  private @Nullable JDialog myDevtoolsFrame = null;

  /**
   * Defines the way the browser is rendered onto its surface.
   */
  @ApiStatus.Experimental
  public enum RenderingType {
    /**
     * The browser is rendered on a platform heavyweight window embedded into the host frame.
     */
    EMBEDDED_WINDOW,
    /**
     * The browser is rendered off-screen on a heavyweight canvas via OGL.
     */
    OGL_CANVAS,
    /**
     * The browser is rendered off-screen on a lightweight Swing component via a buffered image.
     */
    BUFFERED_IMAGE,

    // [tav] todo
    //VOLATILE_IMAGE
  }

  static class CreateBrowserArtefacts {
    final @NotNull RenderingType renderingType;
    final @NotNull CefBrowser cefBrowser;
    final @NotNull JBCefClient client;

    CreateBrowserArtefacts(@NotNull RenderingType renderingType, @NotNull CefBrowser cefBrowser, @NotNull JBCefClient client) {
      this.renderingType = renderingType;
      this.cefBrowser = cefBrowser;
      this.client = client;
    }
  }

  JBCefBrowserBase(@NotNull CreateBrowserArtefacts artefacts) {
    this(artefacts.renderingType, artefacts.cefBrowser, true, artefacts.client);
  }

  JBCefBrowserBase(@NotNull RenderingType type,
                   @NotNull CefBrowser cefBrowser,
                   boolean isNewBrowserCreated,
                   @NotNull JBCefClient cefClient)
  {
    myRenderingType = type;
    myCefClient = cefClient;
    myCefBrowser = cefBrowser;

    if (type != RenderingType.EMBEDDED_WINDOW) JBCefApp.checkOffScreenRenderingModeEnabled();
    if (type == RenderingType.BUFFERED_IMAGE) setProperty(Properties.IS_LIGHTWEIGHT, Boolean.TRUE);

    if (isNewBrowserCreated) {
      cefClient.addLifeSpanHandler(myLifeSpanHandler = new CefLifeSpanHandlerAdapter() {
        @Override
        public void onAfterCreated(CefBrowser browser) {
          LoadDeferrer loader = myLoadDeferrer;
          if (loader != null) {
            loader.load();
            myLoadDeferrer = null;
          }
        }
      }, getCefBrowser());

      cefClient.addLoadHandler(myLoadHandler = new CefLoadHandlerAdapter() {
        @Override
        public void onLoadEnd(CefBrowser browser, CefFrame frame, int httpStatusCode) {
          setPageBackgroundColor();
        }
        @Override
        public void onLoadError(CefBrowser browser, CefFrame frame, ErrorCode errorCode, String errorText, String failedUrl) {
          // do not show error page if another URL has already been requested to load
          ErrorPage errorPage = myErrorPage;
          String lastRequestedUrl = getLastRequestedUrl();
          if (errorPage != null && lastRequestedUrl.equals(failedUrl)) {
            String html = errorPage.create(errorCode, errorText, failedUrl);
            if (html != null) UIUtil.invokeLaterIfNeeded(() -> compareLastRequestedUrlAndPerform(failedUrl, () -> loadHTML(html)));
          }
        }
      }, getCefBrowser());

      cefClient.addRequestHandler(myRequestHandler = new CefRequestHandlerAdapter() {
        @Override
        public boolean onBeforeBrowse(CefBrowser browser,
                                      CefFrame frame,
                                      CefRequest request,
                                      boolean user_gesture,
                                      boolean is_redirect)
        {
          setLastRequestedUrl(ObjectUtils.notNull(request.getURL(), ""));
          return super.onBeforeBrowse(browser, frame, request, user_gesture, is_redirect);
        }
        @Override
        public boolean getAuthCredentials(CefBrowser browser,
                                          String origin_url,
                                          boolean isProxy,
                                          String host,
                                          int port,
                                          String realm,
                                          String scheme, CefAuthCallback callback)
        {
          if (isProxy && !isProperty(Properties.NO_DEFAULT_AUTH_CREDENTIALS)) {
            Credentials credentials = JBCefProxyAuthenticator.getCredentials(JBCefBrowserBase.this, host, port);
            if (credentials != null) {
              callback.Continue(credentials.getUserName(), credentials.getPasswordAsString());
              return true;
            }
            Logger.getInstance(JBCefBrowserBase.class).error("missing credentials to sign in to proxy");
          }
          return super.getAuthCredentials(browser, origin_url, isProxy, host, port, realm, scheme, callback);
        }
      }, getCefBrowser());

      cefClient.addContextMenuHandler(myContextMenuHandler = createDefaultContextMenuHandler(), getCefBrowser());
    }
    else {
      myLifeSpanHandler = null;
      myLoadHandler = null;
      myRequestHandler = null;
      myContextMenuHandler = null;
    }
  }

  /**
   * Loads URL.
   */
  public final void loadURL(@NotNull String url) {
    if (isCefBrowserCreated()) {
      loadUrlImpl(url);
    }
    else {
      myLoadDeferrer = new LoadDeferrer(null, url);
    }
  }

  /**
   * Loads html content.
   *
   * @param html content to load
   * @param url  a dummy URL that may affect restriction policy applied to the content
   */
  public final void loadHTML(@NotNull String html, @NotNull String url) {
    if (isCefBrowserCreated()) {
      loadHtmlImpl(html, url);
    }
    else {
      myLoadDeferrer = new LoadDeferrer(html, url);
    }
  }

  /**
   * Loads html content.
   */
  public final void loadHTML(@NotNull String html) {
    loadHTML(html, BLANK_URI);
  }

  @NotNull
  public final CefBrowser getCefBrowser() {
    return myCefBrowser;
  }

  /**
   * @param zoomLevel 1.0 is 100%.
   * @see #ZOOM_COMMON_RATIO
   */
  public final void setZoomLevel(double zoomLevel) {
    myCefBrowser.setZoomLevel(Math.log(zoomLevel) / LOG_ZOOM);
  }

  /**
   * @return 1.0 is 100%
   * @see #ZOOM_COMMON_RATIO
   */
  public final double getZoomLevel() {
    return Math.pow(ZOOM_COMMON_RATIO, myCefBrowser.getZoomLevel());
  }

  @NotNull
  public final JBCefClient getJBCefClient() {
    return myCefClient;
  }

  @NotNull
  public final JBCefCookieManager getJBCefCookieManager() {
    myCookieManagerLock.lock();
    try {
      if (myJBCefCookieManager == null) {
        myJBCefCookieManager = new JBCefCookieManager();
      }
      return Objects.requireNonNull(myJBCefCookieManager);
    }
    finally {
      myCookieManagerLock.unlock();
    }
  }

  @SuppressWarnings("unused")
  public final void setJBCefCookieManager(@NotNull JBCefCookieManager jBCefCookieManager) {
    myCookieManagerLock.lock();
    try {
      myJBCefCookieManager = jBCefCookieManager;
    }
    finally {
      myCookieManagerLock.unlock();
    }
  }

  /**
   * Returns the component representing the browser in the UI hierarchy.
   */
  public abstract @Nullable JComponent getComponent();

  /**
   * Returns the rendering type.
   */
  public @NotNull RenderingType getRenderingType() {
    return myRenderingType;
  }

  final boolean isCefBrowserCreated() {
    assert myCefBrowser instanceof CefNativeAdapter;
    // [tav] todo: this can be thread race prone
    return ((CefNativeAdapter)myCefBrowser).getNativeRef("CefBrowser") != 0;
  }

  @Override
  public void dispose() {
    dispose(null);
  }

  protected void dispose(@Nullable Runnable subDisposer) {
    myDisposeHelper.dispose(() -> {
      if (subDisposer != null) subDisposer.run();

      if (myLifeSpanHandler != null) getJBCefClient().removeLifeSpanHandler(myLifeSpanHandler, getCefBrowser());
      if (myLoadHandler != null) getJBCefClient().removeLoadHandler(myLoadHandler, getCefBrowser());
      if (myRequestHandler != null) getJBCefClient().removeRequestHandler(myRequestHandler, getCefBrowser());
      if (myContextMenuHandler != null) getJBCefClient().removeContextMenuHandler(myContextMenuHandler, getCefBrowser());

      myCefBrowser.stopLoad();
      myCefBrowser.close(true);

      if (myCefClient.isDefault()) Disposer.dispose(myCefClient);
    });
  }

  @Override
  public final boolean isDisposed() {
    return myDisposeHelper.isDisposed();
  }

  /**
   * Returns {@code JBCefBrowser} instance associated with this {@code CefBrowser}.
   */
  @Nullable
  public static JBCefBrowser getJBCefBrowser(@NotNull CefBrowser browser) {
    Component uiComp = browser.getUIComponent();
    if (uiComp != null) {
      Component parentComp = uiComp.getParent();
      if (parentComp instanceof JComponent) {
        return (JBCefBrowser)((JComponent)parentComp).getClientProperty(JBCEFBROWSER_INSTANCE_PROP);
      }
    }
    return null;
  }

  /**
   * Sets (overrides) background color in the html page.
   *

   * The color is set for the currently displayed page and all the subsequently loaded pages.
   *
   * @see css color format
   * @param cssColor the color in CSS format
   */
  public void setPageBackgroundColor(@NotNull String cssColor) {
    myCssBgColor = cssColor;
    setPageBackgroundColor();
  }

  private void setPageBackgroundColor() {
    if (myCssBgColor != null) {
      getCefBrowser().executeJavaScript("document.body.style.backgroundColor = \"" + myCssBgColor + "\";", BLANK_URI, 0);
    }
  }

  private void loadHtmlImpl(@NotNull String html, @NotNull String url) {
    loadUrlImpl(JBCefFileSchemeHandlerFactory.registerLoadHTMLRequest(getCefBrowser(), html, url));
  }

  private void loadUrlImpl(@NotNull String url) {
    setLastRequestedUrl(""); // will be set to a correct value in onBeforeBrowse()
    getCefBrowser().loadURL(url);
  }

  private String getLastRequestedUrl() {
    synchronized (myLastRequestedUrlLock) {
      return myLastRequestedUrl;
    }
  }

  private void setLastRequestedUrl(@NotNull String url) {
    synchronized (myLastRequestedUrlLock) {
      myLastRequestedUrl = url;
    }
  }

  private void compareLastRequestedUrlAndPerform(@NotNull String url, @NotNull Runnable action) {
    synchronized (myLastRequestedUrlLock) {
      if (myLastRequestedUrl.equals(url)) action.run();
    }
  }

  /**
   * Used to create an error page.
   */
  public interface ErrorPage {
    /**
     * Default error page.
     */
    ErrorPage DEFAULT = new ErrorPage() {
      @Override
      public @NotNull String create(CefLoadHandler.@NotNull ErrorCode errorCode,
                                    @NotNull String errorText,
                                    @NotNull String failedUrl)
      {
        int fontSize = (int)(EditorColorsManager.getInstance().getGlobalScheme().getEditorFontSize() * 1.1);
        int headerFontSize = fontSize + JBUIScale.scale(3);
        int headerPaddingTop = headerFontSize / 5;
        int lineHeight = headerFontSize * 2;
        int iconPaddingRight = JBUIScale.scale(12);
        Color bgColor = JBColor.background();
        String bgWebColor = String.format("#%02x%02x%02x", bgColor.getRed(), bgColor.getGreen(), bgColor.getBlue());
        Color fgColor = JBColor.foreground();
        String fgWebColor = String.format("#%02x%02x%02x", fgColor.getRed(), fgColor.getGreen(), fgColor.getBlue());

        String html = ERROR_PAGE_READER.get();
        html = html.replace("${lineHeight}", String.valueOf(lineHeight));
        html = html.replace("${iconPaddingRight}", String.valueOf(iconPaddingRight));
        html = html.replace("${fontSize}", String.valueOf(fontSize));
        html = html.replace("${headerFontSize}", String.valueOf(headerFontSize));
        html = html.replace("${headerPaddingTop}", String.valueOf(headerPaddingTop));
        html = html.replace("${bgWebColor}", bgWebColor);
        html = html.replace("${fgWebColor}", fgWebColor);
        html = html.replace("${errorText}", errorText);
        html = html.replace("${failedUrl}", failedUrl);

        ScaleContext ctx = ScaleContext.create();
        ctx.update(OBJ_SCALE.of(1.2 * headerFontSize / (float)ERROR_PAGE_ICON.getIconHeight()));
        // Reset sys scale to prevent raster downscaling on passing the image to jcef.
        // Overriding is used to prevent scale change during further intermediate context transformations.
        ctx.overrideScale(SYS_SCALE.of(1.0));

        html = html.replace("${base64Image}", ObjectUtils.notNull(BASE64_ERROR_PAGE_ICON.get().getOrProvide(ctx), ""));

        return html;
      }
    };

    /**
     * Returns an error page html.
     *

     * To prevent showing the error page (e.g. filter out {@link CefLoadHandler.ErrorCode#ERR_ABORTED}) just return {@code null}.
     * To fallback to default error page return {@link ErrorPage#DEFAULT#create(CefLoadHandler.ErrorCode, String, String)}.
     */
    @Nullable
    String create(@NotNull @SuppressWarnings("unused") CefLoadHandler.ErrorCode errorCode, @NotNull String errorText, @NotNull String failedUrl);
  }

  /**
   * Sets the error page to display in the browser on load error.
   *

   * By default no error page is displayed. To enable displaying default error page pass {@link ErrorPage#DEFAULT}.
   * Passing {@code null} prevents the browser from displaying an error page.
   *
   * @param errorPage the error page producer, or null
   */
  public void setErrorPage(@Nullable ErrorPage errorPage) {
    myErrorPage = errorPage;
  }

  /**
   * Supports {@link Properties}.
   *
   * @throws IllegalArgumentException if the value has wrong type or format
   */
  public void setProperty(@NotNull String name, @Nullable Object value) {
    myPropertiesHelper.setProperty(name, value);
  }

  /**
   * @see #setProperty(String, Object)
   */
  @Nullable
  public Object getProperty(@NotNull String name) {
    return myPropertiesHelper.getProperty(name);
  }

  /**
   * @return the passed boolean property value or {@code false} if it is not set or is not boolean
   */
  public boolean isProperty(@NotNull String name) {
    return myPropertiesHelper.is(name);
  }

  /**
   * @see #setProperty(String, Object)
   */
  void addPropertyChangeListener(@NotNull String name, @NotNull PropertyChangeListener listener) {
    myPropertiesHelper.addPropertyChangeListener(name, listener);
  }

  /**
   * @see #setProperty(String, Object)
   */
  void removePropertyChangeListener(@NotNull String name, @NotNull PropertyChangeListener listener) {
    myPropertiesHelper.removePropertyChangeListener(name, listener);
  }

  protected DefaultCefContextMenuHandler createDefaultContextMenuHandler() {
    return new DefaultCefContextMenuHandler(ApplicationManager.getApplication().isInternal());
  }

  protected class DefaultCefContextMenuHandler extends CefContextMenuHandlerAdapter {
    protected static final int DEBUG_COMMAND_ID = MENU_ID_USER_LAST;
    private final boolean isInternal;

    public DefaultCefContextMenuHandler(boolean isInternal) {
      this.isInternal = isInternal;
    }

    @Override
    public void onBeforeContextMenu(CefBrowser browser, CefFrame frame, CefContextMenuParams params, CefMenuModel model) {
      if (isProperty(Properties.NO_CONTEXT_MENU)) {
        model.clear();
        return;
      }
      if (isInternal) {
        model.addItem(DEBUG_COMMAND_ID, "Open DevTools");
      }
    }

    @Override
    public boolean onContextMenuCommand(CefBrowser browser, CefFrame frame, CefContextMenuParams params, int commandId, int eventFlags) {
      if (isProperty(Properties.NO_CONTEXT_MENU)) {
        return false;
      }
      if (commandId == DEBUG_COMMAND_ID) {
        openDevtools();
        return true;
      }
      return false;
    }
  }

  public void openDevtools() {
    if (myDevtoolsFrame != null) {
      myDevtoolsFrame.toFront();
      return;
    }

    Window activeFrame = null;
    for (Frame frame : Frame.getFrames()) {
      if (frame.isActive()) {
        activeFrame = frame;
        break;
      }
    }

    if (activeFrame == null) return;
    Rectangle bounds = activeFrame.getGraphicsConfiguration().getBounds();

    myDevtoolsFrame = new JDialog(activeFrame);
    myDevtoolsFrame.setTitle("JCEF DevTools");
    myDevtoolsFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    myDevtoolsFrame.setBounds(bounds.width / 4 + 100, bounds.height / 4 + 100, bounds.width / 2, bounds.height / 2);
    myDevtoolsFrame.setLayout(new BorderLayout());
    JBCefBrowser devTools = new JBCefBrowser(myCefBrowser.getDevTools(), myCefClient);
    myDevtoolsFrame.add(devTools.getComponent(), BorderLayout.CENTER);
    myDevtoolsFrame.addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosed(WindowEvent e) {
        myDevtoolsFrame = null;
        Disposer.dispose(devTools);
      }
    });
    myDevtoolsFrame.setVisible(true);
  }

  private final class LoadDeferrer {
    @Nullable private final String myHtml;
    @NotNull private final String myUrl;

    private LoadDeferrer(@Nullable String html, @NotNull String url) {
      myHtml = html;
      myUrl = url;
    }

    public void load() {
      // JCEF demands async loading.
      SwingUtilities.invokeLater(
        myHtml == null ?
        () -> loadUrlImpl(myUrl) :
        () -> loadHtmlImpl(myHtml, myUrl));
    }
  }
}