Welcome To Zelo Street!

This is a blog of liberal stance and independent mind

Saturday, 23 June 2018

Julia Hartley Dooda - Oh Happy Day

Today is two years since the EU referendum, a time for Europhobes to celebrate securing a freedom that they had already, and getting back a country that they had not lost. And for increasingly desperate self-promotion artiste Julia Hartley Brewer, it is an opportunity for her to open mouth, and then clumsily insert reassuringly expensive footwear.

We know who you are, thanks

Ms Hartley Dooda wanted to tell the world of the happiness experienced by Herself Personally Now at the referendum result. She instead showed the world that when it comes to finding oneself in a hole, she’s your go-to source for ignoring Healey’s Dictum and just carrying on digging.

“Happy Brexit Day, everyone! Two years on, this is still one of the happiest moments of my life” she trilled. Yes, all those people losing their jobs, living standards about to go down the chute, economic growth soon to stagnate, but She’s All Right Jack.

Adam Boulton of Sky News (first for breaking wind) was distinctly underwhelmed by the idea, responding “Wherever you stand on #Brexit that is pretty tragic”. One other Tweter asked “what about when your child was born?”

At this point, Ms Hartley Dooda could, and should, have got out while the going was not so bad. But she was too important to merely concede that she might have fouled up. “I didn’t say it was THE best day - just one of them. Is reading a problem for you?” she retorted, managing to change “happiest” to “best” and set Twitter off again.

And she knew who was at fault here - REMOANERS! “Some Remoaners seem to be struggling with the concept of someone having more than ONE ‘happiest moment in their lives’. I have been lucky enough to have HUNDREDS in my life. This is *one* of them. I hope that’s not too complicated for their Brussels-fuddled brains to cope with”.

She had done so much that she kept on digging and came back for afters. “Oh yeah, and zip lining down that volcano in Costa Rica, watching my daughter sing a solo in her school play, getting my A levels, listening to my husband read bedtime stories to my daughter, waterfights on the beach in Cornwall, getting my first journo job, the list goes on”.

One Tweeter pointed out that this was just a teensy bit elitist. Off went Ms Hartley Dooda once more. “God, these #FBPE people are so miserable, aren’t they?” Speak for yourself.

So she hasn't done the birthplace of pizza in Naples, seen the Secession building in Vienna, climbed to the viewing deck of the Novy Most in Bratislava, seen where JFK gave his “Ich bin ein Berliner” speech, strolled the streets of Segovia, walked the beach where they filmed OHMSS, eaten deep fried artichoke in Rome, strolled Paris’ Jardins du Luxembourg, walked on the Grossglockner glacier, and looked out at dusk over Lisbon from the Santa Justa Tower. So she’s right to conclude “It has, truly, been a shit life”.


Pentadecapeptide BPC 157 and its effects on a NSAID toxicity model: diclofenac-induced gastrointestinal, liver, and encephalopathy lesions.
We attempted to fully antagonize the extensive toxicity caused by NSAIDs (using diclofenac as a prototype). Herein, we used the stable gastric pentadecapeptide BPC 157 (GEPPPGKPADDAGLV, MW 1419), an anti-ulcer peptide shown to be efficient in inflammatory bowel disease clinical trials (PL 14736) and various wound treatments with no toxicity reported. This peptide was given to antagonize combined gastrointestinal, liver, and brain toxicity induced by diclofenac (12.5mg/kg intraperitoneally, once daily for 3 days) in rats. Already considered a drug that can reverse the toxic side effects of NSAIDs, BPC 157 (10 μg/kg, 10 ng/kg) was strongly effective throughout the entire experiment when given (i) intraperitoneally immediately after diclofenac or (ii) per-orally in drinking water (0.16 μg/mL, 0.16 ng/mL). Without BPC 157 treatment, at 3h following the last diclofenac challenge, we encountered a complex deleterious circuit of diclofenac toxicity characterized by severe gastric, intestinal and liver lesions, increased bilirubin, aspartate transaminase (AST), alanine transaminase (ALT) serum values, increased liver weight, prolonged sedation/unconsciousness (after any diclofenac challenge) and finally hepatic encephalopathy (brain edema particularly located in the cerebral cortex and cerebellum, more in white than in gray matter, damaged red neurons, particularly in the cerebral cortex and cerebellar nuclei, Purkinje cells and less commonly in the hippocampal neurons). The very extensive antagonization of diclofenac toxicity achieved with BPC 157 (μg-/ng-regimen, intraperitoneally, per-orally) may encourage its further use as a therapy to counteract diclofenac- and other NSAID-induced toxicity.


The present invention relates generally to magnetic stimulation and more particularly to high-speed magnetic stimulation of biological tissue.
For some time, electrical or magnetic stimulation devices have been used to stimulate biological tissue.
Electric stimulation of biological tissue is wellknown and generally involves the use of a plurality of electrodes strategically placed on the tissue of a subject (human or animal). Electric pulses are subsequently generated and applied to the electrodes. The tissue in an area separating the electrodes is thus stimulated by the passage of current therethrough.
Magnetic stimulation of biological tissue is a much more recent development. Magnetic stimulation involves the application of a magnetic field to biological tissue. A magnetic transducer such as a wire wound coil is employed to generate the magnetic field. The coil may be contactless and operate a predetermined distance away from the subject. Alternatively, the coil may contact or may be implanted in the subject.
Magnetic stimulation offers many significant advantages over electrical stimulation. Magnetic stimulation eliminates the need for direct physical electrical contact to the subject and thus removes problems associated with high skin electrical resistance, damage to tissue due to high current flow and the like. Additionally, the subject is exposed to less risk since hazards arising from electrical shock due to malfunctioning equipment are reduced, if not eliminated.
Potential applications of magnetic stimulation also include the stimulation of both the central and peripheral nervous systems. Specifically, magnetic stimulation followed by recordal of the corresponding motor evoked potentials (MEPs) is believed to be a promising application of magnetic neural stimulation. MEPs have been recorded over spinal cord, peripheral nerve and muscle following transcranial electrical stimulation. These MEPs have been demonstrated to accurately reflect the functional integrity of efferent spinal motor pathways of rats and cats subjected to mechanical trauma, compression and ischemia, and also have been well correlated with the degree of clinical recovery. These results suggest major clinical applications for MEPs in evaluation of efferent motor pathways as well as in intraoperative monitoring. Conventional neurophysiological techniques do not permit such examination of central motor pathways.
With respect to diagnostic evaluation of efferent motor pathways, MEP abnormalities have been demonstrated in patients with multiple sclerosis, compressive and radiation induced myelopathies, and hereditary spastic paraparesis. In some cases subclinical dysfunction was detected.
Further, intraoperative monitoring of efferent motor pathways is likely to achieve major importance supplementing somatosensory evoked potential (SEP) monitoring during neurosurgery. SEPs, which monitor principally dorsal cord function, do not adequately predict the integrity of the descending motor pathways. Successful use of MEP monitoring has been reported in a large series of neurosurgical procedures, where monitoring results correlated well with clinical outcome. Although at present transpinal cord stimulation is not known to have been reported, this may also be possible.
Magnetic neural stimulation is also likely to be a useful research tool for brain physiology. Using electrical stimulation, MEP to cerebellar stimulation has been demonstrated and used to study interactions of pyramidal and extra-pyramidal motor systems. MEPs have also been used to study the function of callosal pathways. It is likely that many further research applications for the study of brain physiology will emerge. Magnetic stimulation of the brain provides instrumental, noninvasive access to brain function, with the possibility of modification of that function.
Magnetic neural stimulation offers several potential advantages over conventional electrical stimulation. Magnetic stimulation is painless. Transcutaneous electrical stimulation produces the greatest current density in the most superficial skin layers, the skin layers most sensitive to pain. In contrast, lines of flux produced by magnetic stimulation penetrate the skin essentially unaltered, making it possible to stimulate nerves without exciting overlying cutaneous pain fibers, which have a higher threshold for stimulation.
The painless nature of magnetic stimulation will likely prove a major practical advantage in performing peripheral nerve and SEP studies on children. Moreover, the electrophysiological examination of deeper lying and proximal peripheral nerve, which is inaccessible to study by conventional electrical stimulation because of the painful and potentially damaging currents required to excite deep lying tissue, appears to be feasible using magnetic stimulation.
Rapid electrical stimulation of peripheral nerve is sufficiently painful so that this technique cannot be employed on conscious patients. Fortunately, magnetic stimulation at similarly high rates of stimulation is painless.
Magnetic stimulation produces substantially less stimulus artifact than electrical stimulation. This will facilitate SEP recordings in settings where the time interval between stimulus and response is very short, such as recordings in infants and small children, trigeminal nerve SEPs, and blink reflex recordings.
Magnetic stimulation may make transcutaneous clinical evaluation of small, unmyelinated nerve pathways possible. Although potentially useful techniques for small and selective fiber stimulation have been proposed, these techniques have not been successfully used transcutaneously in a clinical setting, most likely due to the high currents that would be required, as well as the effect of skin and nerve upon the pulse shape. Since magnetic fields are not substantially altered by the skin and nerve sheath, it may be possible to use a magnetic stimulator capable of delivering a shaped magnetic pulse to selectively stimulate smaller myelinated and unmyelinated fibers.
Unfortunately, practical use of magnetic neural stimulation has been limited by the inability of currently available magnetic neural stimulators to selectively stimulate a limited area of neural tissue, especially cerebral, spinal or peripheral neural tissue. Presently available stimulators employ large stimulating coils which are incapable of focusing and limiting the lateral spread of the magnetic field. Additionally, the ability to selectively stimulate more discrete areas of tissue such as the brain will be important in gaining an understanding of the physiology of magnetic nerve stimulation and may also enhance its ultimate clinical utility. Furthermore, many peripheral neurophysiological tests involve determination of nerve conduction velocity, and hence require accurate knowledge of precisely where nerve stimulation occurred.
Present devices also cannot stimulate at rates over about 1 Hz. As a result, clinical MEP testing and monitoring is presently restricted for practical purposes to recording of electromyogram (EMG) activity only. Although the sensitivity of clinical studies would likely be enhanced by recording neural responses over spinal cord and peripheral nerve, such studies would require signal averaging, which is impractical at low stimulation rates.
Present magnetic neural stimulators are also unable to operate at the speed necessary for SEP testing since averaging of response to a prohibitively large number of stimuli is required. Thus, magnetic peripheral nerve stimulation, although pain-free, is also not practical for SEP testing using presently available devices. Present devices are also unable to selectively stimulate a limited area of neural tissue.


Q:

Call webservice with NTLM authentication

Is it possible calling a webservice using NTLM authentication from apex?
It is a microsoft navision webservice, I tried to do it in java following this guide and it works.

A:

I was working on a project that required SalesForce to call a service that used NTLM authentication.  I ended up writing a client implementation of NTLM in apex that you can re-use.  I've hosted it on github here:
https://github.com/natewallace/ApexNTLM
Upload all of the classes into your org and then use the HttpClient class to send messages to your NTLM secured service.

A:

No answers so far... I'll try to summarize what I did without posting actual code (I don't have IP rights to it). Also - I know very little about MicroSoft-y world and I'm not a proper network admin either so don't shout at me if my understanding of certain things is dumbified.
Solution is written in PHP and follows excellent blog entry http://rabaix.net/en/articles/2008/03/13/using-soap-php-with-ntlm-authentication.
Other notable sources include "Freddy's blog" on MSDN (already mentioned by OP). This is the PHP article, you can find Java and C# examples there... hell, even javascript!: http://blogs.msdn.com/b/freddyk/archive/2010/01/19/connecting-to-nav-web-services-from.aspx
Problem
As far as I know it can't be done. The WSDL files from NAV generate into Apex classes just fine (even if the names can be a bit lenghty and you need to rename Update method because it's a reserved keyword... usually I pick UpdateSingle to match UpdateMultiple).
The problem is the NTLM authentication. Salesforce can send "Basic" or "Digest"... What NAV expects is something related to Windows domain, both servers being in same LAN. Which obviously can't be done since Salesforce servers are sitting somewhere else.
The whole thing is tricky to debug because when you access webservice endpoints with Internet Explorer NAV will happily display the WSDL and accept your handcrafted SOAP message if you have any (you can use IE Developer Tools or packet sniffer to see that this "special" authentication is used). Accessed from Firefox / Salesforce / anything that doesn't use some DLLs related to IE - boom, blank page. Originally we thought the packets die somewhere on firewall (I don't remember anymore, I think the damn thing just acts as a black hole, doesn't even return HTTP 401 Unauthorized).
And no, you can't somehow hardcode generated "NTLM key" or use some library on SF side to generate it.
Solution
I quickly hacked a proxy-like page in PHP (on a virtual machine with WAMP stack). It might not have best performance in the world but it works till today and there was no incentive to investigate if "true" proxy solution would be better. I'll keep writing about PHP - since you did your first attempt in Java you might be more comfortable with it.
I've built on Monsieur Rabaix's base with addition of config file where I'd store:

NAV dedicated integration user's username & pass
IP addresses of NAV servers (test & prod)
Salesforce "production"'s instance Id

URL-rewriting flow
Salesforce calls an endpoint (you need to manually edit the class generated from WSDL and add it to Remote Site Settings) similar to
http://proxyPublicAddress/?
org={!UserInfo.getOrganizationId()}&
company=NAV%20Company%201&
page=NameOfPageExposedAsWebservice

Of course you can add more params as you see fit, include some authentication methods... This is the bare minimum. Your proxy needs to make decision whether to send the request to production or test NAV (that's the org), which page or CodeUnit you want to access and in which NAV Company it sits. In apex do not call anything from EncodingUtil class to encode the company name. Simple String encodedName = name.replace(' ', '%20'); is enough.
So let's say your proxy translated it into "local address"
http://192.168.0.10:7047/DynamicsNAV/WS/NAV%20Company%201/Page/NameOfPageExposedAsWebservice

(to all non NAV-developers who happen to read it - NAV is funny and keeps data in separate schemas per each "billing entity". This entity has to be passed as part of webservice endpoint, can't be a part of SOAP payload. Obviously we don't want to generate separate Apex classes per entity so you really need to attack the endpoint variable in the output of wsdl2apex)
Header and payload transfer flow
Simple stuff really, get headers and raw SOAP message from POST data, wrap it in NTLM, get the response and send it back to SF. No need to waste cycles on parsing of this XML in any way, you can add some debug logging if you want during initial testing phase.
<?php
$requestHeaders = getallheaders();
$request = file_get_contents("php://input"); // that's raw POST data

$gateway = new NavGateway($_GET, $request, $requestHeaders); // in $_GET I'll have the URL params like "org". Constructor checks the mandatory params and builds the URL or throws back SOAP Exception
$response = $gateway -> dispatch();
$responseHeaders = $gateway -> soapClient ->__getLastResponseHeaders();

// Send back to SF the HTTP headers from NAV and the response body.
header($responseHeaders);
echo $response;


Drake said Siuslaw officials had notified his company promptly about the problems and that G-P expects an offer of replacement timber, “but that has not been identified yet.”

Levi Beelart, the owner of B&G Logging, said his company is out nearly $100,000 in lost production after being pulled off the Porter Thin, a 5.5 million-board-foot timber sale near Florence. That left his crew of 16 equipment operators, riggers, truck drivers and supervisors idle until they could shift to another logging site.

“At 11 o’clock one morning they came up to us and said we needed to stop all operations,” he said. “It took us four days to move to another job, so we lost four days.”

Beelart said he’s been assured the Forest Service will cover his out-of-pocket expenses, but he’s nervous that finding replacement timber for the affected contracts could mean fewer logs available for companies like his a year or two down the road.

Still, he said, the Siuslaw has been a good partner to work with and seems to be doing the best it can to rectify the problem.

“I don’t think it was their fault, necessarily,” Beelart said. “No matter who you are, you’re going to make mistakes. It’s how you deal with them and move forward that matters.”


/*
AutoHotkey

Copyright 2003-2009 Chris Mallett (support@autohotkey.com)

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
*/

#ifndef hook_h
#define hook_h

#ifndef MINIDLL
#include "hotkey.h" // Use here and also by hook.cpp for ChangeHookState(), which reads from static Hotkey class vars.

#else
#include "script.h"
#endif
// WM_USER is the lowest number that can be a user-defined message.  Anything above that is also valid.
// NOTE: Any msg about WM_USER will be kept buffered (unreplied-to) whenever the script is uninterruptible.
// If this is a problem, try making the msg have an ID less than WM_USER via a technique such as that used
// for AHK_USER_MENU (perhaps WM_COMMNOTIFY can be "overloaded" to contain more than one type of msg).
// Also, it has been announced in OnMessage() that message numbers between WM_USER and 0x1000 are earmarked
// for possible future use by the program, so don't use a message above 0x1000 without good reason.
enum UserMessages {AHK_HOOK_HOTKEY = WM_USER, AHK_HOTSTRING, AHK_USER_MENU, AHK_DIALOG, AHK_NOTIFYICON
	, AHK_RETURN_PID, AHK_EXIT_BY_RELOAD, AHK_EXIT_BY_SINGLEINSTANCE, AHK_CHECK_DEBUGGER
	// Allow some room here in between for more "exit" type msgs to be added in the future (see below comment).
	, AHK_GUI_ACTION = WM_USER+20 // Avoid WM_USER+100/101 and vicinity.  See below comment.
	// v1.0.43.05: On second thought, it seems better to stay close to WM_USER because the OnMessage page
	// documents, "it is best to choose a number greater than 4096 (0x1000) to the extent you have a choice.
	// This reduces the chance of interfering with messages used internally by current and future versions..."
	// v1.0.43.03: Changed above msg number because Micha reports that previous number (WM_USER+100) conflicts
	// with msgs sent by HTML control (AHK_CLIPBOARD_CHANGE) and possibly others (I think WM_USER+100 may be the
	// start of a range used by other common controls too).  So trying a higher number that's (hopefully) very
	// unlikely to be used by OS features.
	, AHK_CLIPBOARD_CHANGE, AHK_HOOK_TEST_MSG, AHK_CHANGE_HOOK_STATE, AHK_GETWINDOWTEXT
	, AHK_HOT_IF_EVAL	// HotCriterionAllowsFiring uses this to ensure expressions are evaluated only on the main thread.
	, AHK_HOOK_SYNC // For WaitHookIdle().
	, AHK_INPUT_END, AHK_INPUT_KEYDOWN, AHK_INPUT_CHAR, AHK_INPUT_KEYUP
	, AHK_EXECUTE  // Naveen N9: enable running ahk code from another os thread
	, AHK_EXECUTE_FUNCTION_VARIANT
	, AHK_EXECUTE_LABEL
	, AHK_EXECUTE_FUNCTION_DLL // HotkeyIt for ahkFunction
};
// NOTE: TRY NEVER TO CHANGE the specific numbers of the above messages, since some users might be
// using the Post/SendMessage commands to automate AutoHotkey itself.  Here is the original order
// that should be maintained:
// AHK_HOOK_HOTKEY = WM_USER, AHK_HOTSTRING, AHK_USER_MENU, AHK_DIALOG, AHK_NOTIFYICON, AHK_RETURN_PID

// UPDATE to the below comment: After a careful review, it seems best to buffer a user's selection of
// a custom menu item if the current quasi-thread is uninterruptible.  This is exactly the same way
// hotkeys are buffered.  By making a thread truly uninterruptible, behavior is more consistent with
// what most users would want, though it should be noted that this also makes it impossible for the
// OnExit subroutine to be interrupted by a custom menu item, even one that is designed to simply
// exit the script (by means of aborting the on-exit subroutine).  Another reason to buffer the
// selection of a custom menu item is that we don't want to interrupt the current thread if is
// right in the middle of executing a single line, e.g. doing something with the deref buffer
// (during which time an interruption might destroy the buffer's contents) or trying to open the
// clipboard or save data to it.  This particular weakness may be resolved when/if a dedicated
// thread is created to maintain the hook(s), thus allowing critical operations such as opening
// the clipboard to use a true Sleep() rather than MsgSleep().
// Since WM_COMMNOTIFY is never generated by the Win32 API, and since we want AHK_USER_MENU to be
// an ID less than WM_HOTKEY so that it doesn't get filtered out when the script is uninterruptible,
// the following trick is used to map our user-defined messages onto WM_COMMNOTIFY by sacrificing the
// wParam part of the message (using it as an indicator of what the message really is).
// Another reserved msg that might be fairly safe is WM_MDIICONARRANGE, but it's far less preferable:
#define TRANSLATE_AHK_MSG(msg, wparam) \
	if (msg == WM_COMMNOTIFY)\
	{\
		msg = (UINT)wparam;\
		wparam = 0;\
	} // In the above, wparam is made zero to help catch bugs.

// And these macros are kept here so that all this trickery is centrally located and thus more maintainable:
#define ASK_INSTANCE_TO_CLOSE(hwnd, reason) PostMessage(hwnd, WM_COMMNOTIFY, reason, 0);

// POST_AHK_USER_MENU: A gui_hwnd value != 0 is passed with the message if it came from a GUI's menu bar.
// This is done because it's good way to pass the info, but also so that its value will be in sync with the
// timestamp of the message (in case the message is stuck in the queue for a long time).  No pointer is
// passed in this case since they might become invalid between the time the msg is posted vs. processed.
#ifndef MINIDLL
#define POST_AHK_USER_MENU(hwnd, menu, gui_hwnd) PostMessage(hwnd, AHK_USER_MENU, gui_hwnd, menu);
#define POST_AHK_GUI_ACTION(hwnd, control_index, gui_event, event_info) PostMessage(hwnd, AHK_GUI_ACTION \
	, (WPARAM)(((control_index) << 16) | (gui_event)), (LPARAM)(event_info)); // Caller must ensure that gui_event is less than 0xFFFF.
#endif
// POST_AHK_DIALOG:
// Post a special msg that will attempt to force it to the foreground after it has been displayed,
// since the dialog often will flash in the task bar instead of becoming foreground.
// It's enough just to queue up a single message that dialog's message pump will forward to our
// main window proc once the dialog window has been displayed.  This avoids the overhead of creating
// and destroying the timer (although the timer may be needed anyway if any timed subroutines are
// enabled).  My only concern about this is that on some OS's, or on slower CPUs, the message may be
// received too soon (before the dialog window actually exists) resulting in our window proc not
// being able to ensure that it's the foreground window.  That seems unlikely, however, since
// MessageBox() and the other dialog invocating API calls (for FileSelectFile/Folder) likely
// ensures its window really exists before dispatching messages.
#define POST_AHK_DIALOG(timeout) PostMessage(g_hWnd, WM_COMMNOTIFY, AHK_DIALOG, (LPARAM)timeout);

// Some reasoning behind the below data structures: Could build a new array for [sc][sc] and [vk][vk]
// (since only two keys are allowed in a ModifierVK/SC combination, only 2 dimensions are needed).
// But this would be a 512x512 array of shorts just for the SC part, which is 512K.  Instead, what we
// do is check whenever a key comes in: if it's a suffix and if a non-standard modifier key of any kind
// is currently down: consider action.  Most of the time, an action be found because the user isn't
// likely to be holding down a ModifierVK/SC, while pressing another key, unless it's modifying that key.
// Nor is he likely to have more than one ModifierVK/SC held down at a time.  It's still somewhat
// inefficient because have to look up the right prefix in a loop.  But most suffixes probably won't
// have more than one ModifierVK/SC anyway, so the lookup will usually find a match on the first
// iteration.
#ifndef MINIDLL
struct vk_hotkey
{
	vk_type vk;
	HotkeyIDType id_with_flags;
};
struct sc_hotkey
{
	sc_type sc;
	HotkeyIDType id_with_flags;
};

// Style reminder: Any POD structs (those without any methods) don't use the "m" prefix
// for member variables because there's no need: the variables are always prefixed by
// the struct that owns them, so there's never any ambiguity:
struct key_type
{
	ToggleValueType *pForceToggle;  // Pointer to a global variable for toggleable keys only.  NULL for others.
	// Keep sub-32-bit members contiguous to save memory without having to sacrifice performance of
	// 32-bit alignment:
	HotkeyIDType hotkey_to_fire_upon_release; // A up-event hotkey queued by a prior down-event.
	HotkeyIDType first_hotkey; // The first hotkey using this key as a suffix.
	modLR_type as_modifiersLR; // If this key is a modifier, this will have the corresponding bit(s) for that key.
	#define PREFIX_ACTUAL 1 // Values for used_as_prefix below, for places that need to distinguish between type of prefix.
	#define PREFIX_FORCED 2 // v1.0.44: Added so that a neutral hotkey like Control can be forced to fire on key-up even though it isn't actually a prefix key.
	UCHAR used_as_prefix; // Whether a given virtual key or scan code is even used by a hotkey.
	bool used_as_suffix;  //
	bool used_as_key_up;  // Whether this suffix also has an enabled key-up hotkey.
	UCHAR no_suppress; // Contains bitwise flags such as NO_SUPPRESS_PREFIX.
	bool is_down; // this key is currently down.
	bool it_put_alt_down;  // this key resulted in ALT being pushed down (due to alt-tab).
	bool it_put_shift_down;  // this key resulted in SHIFT being pushed down (due to shift-alt-tab).
	bool down_performed_action; // the last key-down resulted in an action (modifiers matched those of a valid hotkey)
	bool hotkey_down_was_suppressed; // Whether the down-event for a key was suppressed (thus its up-event should be too).
	// The values for "was_just_used" (zero is the initialized default, meaning it wasn't just used):
	char was_just_used; // a non-modifier key of any kind was pressed while this prefix key was down.
	// And these are the values for the above (besides 0):
	#define AS_PREFIX 1
	#define AS_PREFIX_FOR_HOTKEY 2
	bool sc_takes_precedence; // used only by the scan code array: this scan code should take precedence over vk.
}; // Keep the macro below in sync with the above.

// Fix for v1.0.43.01: Caller wants item.no_suppress initialized to remove all flags except NO_SUPPRESS_STATES.
// Otherwise, a hotkey that removes the mouse hook will cause a non-suppressed key-up to become suppressed,
// causing the key to get stuck down.  The following two-line script can reproduce this:
//   ~LCtrl::Hotkey, RButton, Off
//   RButton::return
#define RESET_KEYTYPE_ATTRIB(item) \
{\
	item.first_hotkey = HOTKEY_ID_INVALID;\
	item.used_as_prefix = 0;\
	item.used_as_suffix = false;\
	item.used_as_key_up = false;\
	item.no_suppress &= NO_SUPPRESS_STATES;\
	item.sc_takes_precedence = false;\
}
#endif
// Since index zero is a placeholder for the invalid virtual key or scan code, add one to each MAX value
// to compute the number of elements actually needed to accommodate 0 up to and including VK_MAX or SC_MAX:
#define VK_ARRAY_COUNT (VK_MAX + 1)
#define SC_ARRAY_COUNT (SC_MAX + 1)
#ifndef MINIDLL
#define INPUT_BUFFER_SIZE 16384 // Default buffer size for Input.  Used to be the absolute max.
#define INPUTHOOK_BUFFER_SIZE 1024 // Default buffer size for InputHook.

enum InputStatusType {INPUT_OFF, INPUT_IN_PROGRESS, INPUT_TIMED_OUT, INPUT_TERMINATED_BY_MATCH
	, INPUT_TERMINATED_BY_ENDKEY, INPUT_LIMIT_REACHED, INPUT_INTERRUPTED};

// Bitwise flags for the Key arrays:
#define END_KEY_WITH_SHIFT 0x01
#define END_KEY_WITHOUT_SHIFT 0x02
#define END_KEY_ENABLED (END_KEY_WITH_SHIFT | END_KEY_WITHOUT_SHIFT)
#define INPUT_KEY_SUPPRESS 0x04
#define INPUT_KEY_VISIBLE 0x08
#define INPUT_KEY_VISIBILITY_MASK (INPUT_KEY_SUPPRESS | INPUT_KEY_VISIBLE)
#define INPUT_KEY_IGNORE_TEXT 0x10
#define INPUT_KEY_NOTIFY 0x20
#define INPUT_KEY_OPTION_MASK 0x3F
#define INPUT_KEY_IS_TEXT 0x40
#define INPUT_KEY_DOWN_SUPPRESSED 0x80

class InputObject;
struct input_type
{
	InputStatusType Status;
	input_type *Prev;
	InputObject *ScriptObject;
	LPTSTR Buffer; // Stores the user's actual input.
	int BufferLength; // The current length of what the user entered.
	int BufferLengthMax; // The maximum allowed length of the input.
	TCHAR *EndChars; // A string of characters that should terminate the input.
	UINT EndCharsMax; // Current size of EndChars buffer.
	LPTSTR *match; // Array of strings, each string is a match-phrase which if entered, terminates the input.
	UINT MatchCount; // The number of strings currently in the array.
	UINT MatchCountMax; // The maximum number of strings that the match array can contain.
	#define INPUT_ARRAY_BLOCK_SIZE 1024  // The increment by which the above array expands.
	LPTSTR MatchBuf; // The is the buffer whose contents are pointed to by the match array.
	UINT MatchBufSize; // The capacity of the above buffer.
	int Timeout;
	DWORD TimeoutAt;
	SendLevelType MinSendLevel; // The minimum SendLevel that can be captured by this input (0 allows all).
	bool AppendText;
	bool BackspaceIsUndo;
	bool CaseSensitive;
	bool TranscribeModifiedKeys; // Whether the input command will attempt to transcribe modified keys such as ^c.
	bool VisibleText, VisibleNonText;
	bool NotifyNonText;
	bool FindAnywhere;
	bool EndCharMode;
	vk_type EndingVK; // The hook puts the terminating key into one of these if that's how it was terminated.
	sc_type EndingSC;
	TCHAR EndingChar;
	bool EndingBySC; // Whether the Ending key was one handled by VK or SC.
	bool EndingRequiredShift; // Whether the key that terminated the input was one that needed the SHIFT key.
	modLR_type EndingMods;
	UINT EndingMatchIndex;
	UCHAR KeyVK[VK_ARRAY_COUNT]; // A sparse array of key flags by VK.
	UCHAR KeySC[SC_ARRAY_COUNT]; // A sparse array of key flags by SC.
	input_type::input_type() // A simple constructor to initialize the fields that need it.
		: Status(INPUT_OFF), Prev(NULL), ScriptObject(NULL)
		, Buffer(NULL), match(NULL), MatchBuf(NULL), MatchBufSize(0)
		, EndChars(NULL), EndCharsMax(0), KeyVK(), KeySC(), BufferLength(0)
		, EndingMods(0)
		// Default options:
		, MinSendLevel(0), BackspaceIsUndo(true), CaseSensitive(false), TranscribeModifiedKeys(false)
		, VisibleText(false), VisibleNonText(true), NotifyNonText(false), FindAnywhere(false), EndCharMode(false)
		, BufferLengthMax(INPUTHOOK_BUFFER_SIZE - 1), Timeout(0), AppendText(0)
	{
	}
	~input_type()
	{
		free(Buffer);
		free(match);
		free(MatchBuf);
		if (EndCharsMax) // If zero, EndChars may point to static memory.
			free(EndChars);
	}
	inline bool InProgress() { return Status == INPUT_IN_PROGRESS; }
	bool IsInteresting(KBDLLHOOKSTRUCT &aEvent);
	ResultType Setup(LPTSTR aOptions, LPTSTR aEndKeys, LPTSTR aMatchList, size_t aMatchList_length);
	void ParseOptions(LPTSTR aOptions);
	void SetTimeoutTimer();
	ResultType SetKeyFlags(LPTSTR aKeys, bool aEndKeyMode = true, UCHAR aFlagsRemove = 0, UCHAR aFlagsAdd = END_KEY_ENABLED);
	ResultType SetMatchList(LPTSTR aMatchList, size_t aMatchList_length);
	void Start();
	void EndByMatch(UINT aMatchIndex);
	void EndByKey(vk_type aVK, sc_type aSC, bool aBySC, bool aRequiredShift);
	void EndByChar(TCHAR aChar);
	void EndByTimeout() { EndByReason(INPUT_TIMED_OUT); }
	void EndByLimit() { EndByReason(INPUT_LIMIT_REACHED); }
	void EndByNewInput() { EndByReason(INPUT_INTERRUPTED); }
	void Stop() { EndByReason(INPUT_OFF); }
	void CollectChar(TCHAR *ch, int char_count);
	LPTSTR GetEndReason(LPTSTR aKeyBuf, int aKeyBufSize, bool aCombined = true);
private:
	void EndByReason(InputStatusType aReason);
};

#include "input_object.h"

ResultType InputStart(input_type &input, Var *output_var = NULL);
ResultType InputWait(Var *output_var, input_type &input);
input_type *InputRelease(input_type *aInput);
input_type *InputFind(InputObject *object);

//-------------------------------------------

struct KeyHistoryItem
{
	vk_type vk;
	sc_type sc;
	TCHAR event_type; // space=none, i=ignored, s=suppressed, h=hotkey, etc.
	bool key_up;
	float elapsed_time;  // Time since prior key or mouse button, in seconds.
	// It seems better to store the foreground window's title rather than its HWND since keystrokes
	// might result in a window closing (being destroyed), in which case the displayed key history
	// would not be able to display the title at the time the history is displayed, which would
	// be undesirable.
	// To save mem, could point this into a shared buffer instead, but if that buffer were to run
	// out of space (perhaps due to the target window changing frequently), window logging would
	// no longer be possible without adding complexity to the logging function.  Seems best
	// to keep it simple:
#define KEY_HISTORY_WINDOW_TITLE_SIZE 100
	TCHAR target_window[KEY_HISTORY_WINDOW_TITLE_SIZE];
};

//-------------------------------------------

LRESULT CALLBACK LowLevelKeybdProc(int aCode, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK LowLevelMouseProc(int aCode, WPARAM wParam, LPARAM lParam);
LRESULT LowLevelCommon(const HHOOK aHook, int aCode, WPARAM wParam, LPARAM lParam, const vk_type aVK
	, sc_type aSC, bool aKeyUp, ULONG_PTR aExtraInfo, DWORD aEventFlags);

#define HOTSTRING_INDEX_INVALID INT_MAX  // Use a signed maximum rather than unsigned, in case indexes ever become signed.
#define SuppressThisKey SuppressThisKeyFunc(aHook, lParam, aVK, aSC, aKeyUp, pKeyHistoryCurr, hotkey_id_to_post)
LRESULT SuppressThisKeyFunc(const HHOOK aHook, LPARAM lParam, const vk_type aVK, const sc_type aSC
	, bool aKeyUp, KeyHistoryItem *pKeyHistoryCurr, WPARAM aHotkeyIDToPost
	, WPARAM aHSwParamToPost = HOTSTRING_INDEX_INVALID, LPARAM aHSlParamToPost = 0);

#define AllowKeyToGoToSystem AllowIt(aHook, aCode, wParam, lParam, aVK, aSC, aKeyUp, pKeyHistoryCurr, hotkey_id_to_post)
LRESULT AllowIt(const HHOOK aHook, int aCode, WPARAM wParam, LPARAM lParam, const vk_type aVK, const sc_type aSC
	, bool aKeyUp, KeyHistoryItem *pKeyHistoryCurr, WPARAM aHotkeyIDToPost);

bool CollectInput(KBDLLHOOKSTRUCT &aEvent, const vk_type aVK, const sc_type aSC, bool aKeyUp, bool aIsIgnored
	, KeyHistoryItem *pKeyHistoryCurr, WPARAM &aHotstringWparamToPost, LPARAM &aHotstringLparamToPost);
bool CollectHotstring(KBDLLHOOKSTRUCT &aEvent, TCHAR aChar[], int aCharCount, HWND aActiveWindow
	, KeyHistoryItem *pKeyHistoryCurr, WPARAM &aHotstringWparamToPost, LPARAM &aHotstringLparamToPost);
bool CollectInputHook(KBDLLHOOKSTRUCT &aEvent, const vk_type aVK, const sc_type aSC, TCHAR aChar[], int aCharCount, bool aIsIgnored);
bool IsHotstringWordChar(TCHAR aChar);
void UpdateKeybdState(KBDLLHOOKSTRUCT &aEvent, const vk_type aVK, const sc_type aSC, bool aKeyUp, bool aIsSuppressed);
bool KeybdEventIsPhysical(DWORD aEventFlags, const vk_type aVK, bool aKeyUp);

void ChangeHookState(Hotkey *aHK[], int aHK_count, HookType aWhichHook, HookType aWhichHookAlways);
void AddRemoveHooks(HookType aHooksToBeActive, bool aChangeIsTemporary = false);
bool HookAdjustMaxHotkeys(Hotkey **&aHK, int &aCurrentMax, int aNewMax);
#endif
bool SystemHasAnotherKeybdHook();
bool SystemHasAnotherMouseHook();
#ifndef MINIDLL
DWORD WINAPI HookThreadProc(LPVOID aUnused);

void LinkKeysForCustomCombo(vk_type aNeutral, vk_type aLeft, vk_type aRight);

void ResetHook(bool aAllModifiersUp = false, HookType aWhichHook = (HOOK_KEYBD | HOOK_MOUSE)
	, bool aResetKVKandKSC = false);
HookType GetActiveHooks();
void FreeHookMem();
void ResetKeyTypeState(key_type &key);
void GetHookStatus(LPTSTR aBuf, int aBufSize);

void WaitHookIdle();
#endif //MINIDLL
#endif


Whether you need to glue PVC pipes to fix your plumbing or add some glitter to your favorite pair of flip-flops, getting the best glue for the job will make your project a greater success and will make it last longer. There are many different types of plastic and not all glues will work on all plastics. Even though the glue bottle says that it is approved for plastic, it does not necessarily mean that it will work on every type of plastic. Choosing the right glue for the job will save you frustration and assure that you are happy with the result.

The following table summarizes the qualities of the different types of the best glue for plastic in this review. For a more detailed explanation please refer to the Buyer’s Guide at the end of this article.

Best Glue for Plastic Comparison Table

Pratley Plastic Glue – Best Glue for Plastic Car Parts

Pratley Plastic Glue made the list because it is one of the few plastic adhesives that can be used on plastic automotive parts such as headlights, radiators, and dash components. It will work on most plastics, glass, fiberglass, and metal. It can be used on ABS plastic, unlike many types of glue.

We like this one because it is heavy-duty and sets quickly.

This glue also fills in gaps and cracks easily. It is suggested that you store the glue in the refrigerator after opening to keep it from getting old quickly. Once it has cured, it can be sanded, painted, or drilled. It is heat resistant up to 194°F.

Pros Quick set time

Quick set time Heavy duty

Heavy duty Can be used for automotive repairs Cons High odor

High odor Must use gloves to handle

Duco Cement – Best Glue for Plastic to Plastic

Duco Cement is a great multipurpose household glue that can be used on many different surfaces.

It dries quickly and is set in about 5 to 10 minutes. It dries tough and is water resistant. Another thing we liked about this glue is that it resistant to gasoline, mineral spirits, corn oil, and other solvents. This means that you can use it on surfaces that will be cleaned with the solvents and the glue will not be harmed, such as painted surfaces.

This glue is made from nitrocellulose, which makes it last longer before drying out if the cap is carefully replaced after each use.

It is recommended for use on plastic, wood, metal, and other crafts.

This glue was thick and easy to apply. This means that you can get an accurate placement of the glue. We also found that this glue was easily removed from the skin if you allow it to dry and then peel it off. Overall, we felt that this was a good all-purpose glue that would be suitable for many projects.

Pros Water resistant

Water resistant Resistant to solvents

Resistant to solvents Thick and does not run quickly when applying Cons Not recommended for areas that will be in contact with food

Not recommended for areas that will be in contact with food Highly flammable when wet

Highly flammable when wet Does not set as quickly as superglues

E6000 Craft Adhesive – Best All-Purpose Glue

E6000 is a household glue that has been around for a long time. It is a favorite because it dries white and can be used on many different services.

It is considered industrial strength, when used as directed. It is perfect for fusing ceramics, glass, fabric, leather, wood, metal, and some plastics.

One of the things that we did not like about E6000 is that it takes about five minutes to set. However, this can be an advantage, because it allows you some time to make adjustments before the glue sets. It takes about 24 to 72 hours to completely cure. This means that you should not use the object for this amount of time.

Once it has dried, it is tough and durable. It is water resistant and is paintable. Another thing we liked about this glue is that it is nonflammable and it is washer and dryer safe.

Pros Temperature resistant

Temperature resistant Water resistant

Water resistant Paintable when cured

Paintable when cured Washer and dryer safe Cons Dries white not clear

Dries white not clear Takes 24-72 hours to cure

Takes 24-72 hours to cure Does not set quickly

Plastruct Plastic Weld – Best Glue for Hard Plastic

Plastruct Plastic Weld made the list because it is especially made to bond plastic to plastic. It is made for ABS, butyrate, acrylic, and many more different types of plastic. It will bond Plexiglas and polystyrene with ease.

It works by using a solvent to dissolve a little bit of each surface. When the two pieces are stuck together, it welds them to each other so that they become one. This glue is immediately tacky and sets in only a few minutes.

This glue had a lower odor than other solvent-based glues. It sets up quickly and makes a permanent bond once it has cured. With this glue, make certain that you have your pieces in place quickly because after a few seconds you will not be able to move them around at all. It works that fast.

Pros Tight, permanent bond

Tight, permanent bond Especially formulated for plastics

Especially formulated for plastics Sets quickly Cons Strong odor

Strong odor Unused glue gets old quickly

Unused glue gets old quickly Thin, runs when being applied

Testor’s Cement for Plastic – Best Glue for Plastic Models

This glue is our choice for building models.

It sets up within a few seconds once the pieces are joined together. The disadvantage is that it does not have a long working time and you need to have the parts in place perfectly quickly.

This is another solvent-based glue. This means that it melts the two surfaces and bonds them as if they were welded together. This creates a permanent bond. Another drawback to this glue is that it has a strong odor.

This glue is quite runny when you first apply it. However, it has a precision tip to help you get the glue in the right place. One word of caution though, it takes very little of this glue to do its job.

Pros Sets up quickly

Sets up quickly Precision applicator tip

Precision applicator tip Welds plastic together Cons Runny at first

Runny at first Strong odor

Strong odor Not recommended for fiberglass repair

Loctite Ultra Gel Control – Best Glue for Plastic to Wood

Loctite Ultra Gel Control is the glue that we voted best all-around glue. We like it because it can glue a number of different surfaces together. It is the best glue when you need to glue wood to plastic.

It can be used on plastics, ceramic, wood, rubber, leather, metal, and many other different types of materials.

We like that it sets quickly and dries clear. However, it is not easy to clean excess glue or spilled glue from surfaces. Because it set so quickly, this can be problematic. We found that using alcohol on Q-tips will remove it with some effort. It forms a tight, strong bond that will last for a long time.

Pros Dries clear

Dries clear Sets quickly

Sets quickly Glues many different surfaces together Cons Not easy to clean excess glue from surfaces once dried

Not easy to clean excess glue from surfaces once dried Must have completely clean surface to work

Must have completely clean surface to work May turn cloudy over time when dried

Loctite Epoxy Plastic Bonder – Best Glue for Plastic to Metal

Loctite Epoxy Plastic Bonder is one of the best glues that we found for gluing a number of different surfaces together. It was one of the few glues that effectively bonded plastic to stainless steel.

It works well for bonding polycarbonate, nylon, mylar, PVC, acrylic, ABS, stainless steel, and almost any other type of plastic to other surfaces.

Like many epoxies, it has a strong odor, and slow set time. It takes approximately 20 to 25 minutes for it set. However, this is a nice if you need to reposition the pieces.

Pros Slow set time

Slow set time Can bond stainless steel

Can bond stainless steel Tough bond once cured Cons Hard to remove spills and excess

Hard to remove spills and excess Strong odor

Gorilla Super Glue – Best Glue for Rhinestones on Plastic

Gorilla glue is another popular choice among craftspeople and home users. We like it because it makes a tight bond. However, after time it can become brittle and the bond will break. All in all, we think this is a good glue, but he cannot make our best choice for larger projects because of this. For most projects, it would more than do the job.

This glue works on most plastics, metal, wood, rubber, leather, paper, and ceramic.

One thing that we do like about this glue is that it is versatile. It can bond many different types of materials. However, we found that it does not bond all plastics. For instance, even though it says that it bonds styrene, we found that it made a weak bond for this type of material.

That being said, we do think that this is an excellent glue for craft projects and would highly recommend it for gluing rhinestones on plastic. It is perfect for most craft applications that involve paper, glitter, and other types of smaller projects. For projects where a small surface area is involved, we think that this is one of the best glues on the market.

Pros Sets quickly

Sets quickly Low odor

Low odor Works on most surfaces Cons High odor

High odor Can become brittle

Can become brittle Not suitable for larger projects

Gorilla Epoxy – Best Glue for Rubber to Plastic Waterproof

Out of all the glues that Gorilla Glue makes, we like this one the best. We felt that it was the most durable for most household and automatic repair jobs. Once it has dried, it is waterproof, and resistant to solvents.

It can be used on a number of different s surfaces including steel, aluminum, glass, tile, plastics, ceramic, and wood.

One thing that we liked about this glue is that it will fill uneven surfaces, gaps, and voids. While it will withstand exposure to water, such as rain when dry, it will not withstand being soaked in water. If you replace the cap as soon as you are finished applying the glue, it lasts much longer. You have about five minutes from the time you apply the glue until it begins to set. This means that you can reposition it on projects, and you have plenty of time to replace the cap before it begins to dry in the tube.

Pros Sets in 5 minutes

Sets in 5 minutes Waterproof

Waterproof Fills gaps and voids Cons Strong odor

Strong odor Can become brittle in cold weather

Oatey PVC Regular – Best Glue for PVC Pipe

Oatey PVC Regular Cement and NSF Purple Primer is especially designed for bonding PVC to PVC. First, the PVC primer is applied, and then the cement. This is a solvent-based glue, which means that it melts a little bit of each piece and welds it together.

It creates an aggressive bond that can withstand the high pressures required for bonding PVC pipes and fittings for plumbing work This is a contractor grade adhesive.

When the weld is applied, it softens the pipe, so care should be taken not to deform them. The set and cure times can take anywhere from 2 to 48 hours. The set time is dependent on temperature and the diameter of the pipe. However, once the bond is formed, it is permanent.

This is the most popular type of adhesive used by plumbers for bonding PVC pipes together.

The lids of the bottles have daubers, and the application process can be messy. You will want to cover your work area and have a place for the pipes to sit undisturbed until they are completely cured. It is approved for all schedules of PVC pipe. This is the best plastic glue if you need to bond PVC to PVC, but it will not work on any other type of plastic.

Pros Aggressive bond for PVC to PVC

Aggressive bond for PVC to PVC Best PVC adhesive

Best PVC adhesive Contractor grade adhesive

Contractor grade adhesive Best for use in plumbing applications that must be under pressure Cons Long cure time

Long cure time Solvent based, strong odor

Solvent based, strong odor Messy application process

Messy application process Only suitable for PVC

Surehold Plastic Surgery is a superglue type adhesive that is specially formulated to bond plastic to plastic. We like this one because it is water resistant and suitable for both indoor and outdoor use. We also like that it dries clear, so you will never see the repair.

It is suitable for a wide range of plastics including ABS plastic, fiberglass, acrylic, nylon, polyester, PVC, polyurethane, and polycarbonate acrylic.

This glue had one of the widest ranges of plastics that it would bond. This is one of few types of glue that can be used to bond fiberglass. It sets in only 5 to 15 seconds and once it sets, it is very secure. Like many plastic types of glue, it works by melting part of both surfaces and then welding them together, making them as strong as the original.

The only thing that we did not like about it is that it is not UV resistant. It is advertised as an outdoor glue, but it will break down in UV light and eventually cause the bond to fail. This glue is perfect for small repairs but would not be recommended for large areas.

Pros Sets in 5-15 seconds

Sets in 5-15 seconds Gel no-drip formula

Gel no-drip formula Clog proof tube Cons Not UV resistant

Not UV resistant Strong odor

J-B PlasticWeld is one of the most popular epoxy type plastic glues on the market. It is an epoxy that forms a thick putty when mixed together. This means that you can shape it the way you want it and you do not have to worry about drips or runs. The most common uses for this product are both rigid and semi-flexible plastics, ABS, PVC, CPVC pipes, automotive repairs, and other applications that require a strong long-lasting bond.

This epoxy easily bonds many types of plastic. It can be used for bumpers, automotive trim, CPVC pipes, ABS, and PVC. It can also be used on fiberglass and vinyl siding.

Like many epoxies, this takes longer to set. It will set in approximately 25 minutes. However, it is completely cured in 3 hours, compared to the usual 24 or more hours for other epoxies to cure. When it cures it is off-white.

This is one of the strongest glues on the market once it is dry. It can hold up to 350 psi. It is also flexible when dry. It can be sanded, painted, sawed, and drilled once it has cured. You can use it as a filler and you will not even know that a repair was made.

J-B Weld may seem like the perfect epoxy, but it does not adhere to polypropylene, polyethylene, and a few other plastics. For the most part, it can do almost any job.

Pros Sets in 25 minutes

Sets in 25 minutes Can be sanded, drilled, and painted when dry

Can be sanded, drilled, and painted when dry Can hold up to 350 PSI when completely cured Cons Does not adhere all plastics

Does not adhere all plastics Long set time

Weld-On 790 Multi-Purpose PVC Cement is a medium bodied multi-purpose cement that is made for all classes and schedules of PVC pipe. It is a popular brand because it is low odor, does not drip as badly as other PVC pipe glues, and has a strong bond.

Suitable for all schedules of PVC pipe and diameters through 4-inch Schedule 80.

The set time depends on the diameter of the pipe and the temperature range. Colder temperatures will make it set more slowly than warmer temperatures. However, it is not recommended that this glue is used at over 100 degrees Fahrenheit (38 degrees Celsius).

It is suitable for use with all rigid PVC and CPVC but is not recommended for transition use. This glue can also be used for ABS and styrene pipe and pipe fittings. It can bond ABS to PVC.

This glue is more versatile than glues specifically designed for high-pressure PVC pipes, but it may not be suitable for all applications. Before using this one, you need to check with your local plumbing codes.

Pros Fast setting

Fast setting Low odor

Low odor High strength bond

High strength bond Medium bodied, low drip formula Cons May not meet the requirements of all plumbing building codes

May not meet the requirements of all plumbing building codes Can not be used in extreme temperatures

Can not be used in extreme temperatures Not suitable for high-pressure applications

Hot Stuff Instant Glue – Best for Filling Cracks

When Hot Stuff Instant Glue says instant, they mean it. This glue sets in about 3 to 5 seconds, so you need to have your pieces completely aligned before you apply the glue. This glue is designed to be as thin as water so that it will seep into cracks and hairline fractures. If you have a piece that has tiny cracks, this glue will help hold them together and keep them from splitting further.

It can be used to strengthen stone, wood, and other porous materials. That being said, it is also messy and runny. However, the set time is so fast that this is not problematic because it does not have time to run very far.

This glue can be used as a strengthening agent on fabrics, fiberglass, porous wood, stone, furniture, gun stocks, and wood that will be turned on the lathe.

When applying this clue, if you wanted to seep into cracks, or perhaps wick into cloth, you may need to apply it in layers. We found that this was one of the best all-purpose superglues on the market.

Pros Fast set time

Fast set time Best for filling hairline cracks

Best for filling hairline cracks Stops spread of splits

Stops spread of splits Can be used on fiberglass Cons Messy due to thinness

Messy due to thinness Requires a special debonder to remove from unwanted areas and hands

Requires a special debonder to remove from unwanted areas and hands Unopened glue should be kept in freezer to preserve

Buyer’s Guide – Finding the Best Glue for Plastic

With so many different types of glues on the market, it is often difficult to know which one is the right one for the job. If your project involves glue on plastic, you need to know which glue will work best.

You should choose a glue that is quick drying, quick to cure, water resistant, one that makes a firm bond, and one that is tough and long-lasting. There are many different types of plastic, and the same glue can have different properties when used on different types of plastic.

Different Types of Plastic

The following list is the most common types of plastic and the items made from them most often.

Polyethylene Terephthalate is most commonly found in plastic bottles, plastic bags, and items that are made of softer plastic. It is also known as PET or PETE plastic.

High-Density Polyethylene (HDPE) is a hard plastic that is typically used for detergent bottles, soda bottles, milk jugs, and some children’s toys.

Polyvinylchloride (PVC) is a common plastic found in things such as window frames, beach balls, garden hoses, imitation leather products, some children’s toys, and plumbing pipes and fittings.

Low-density Polyethylene (LDPE)is used in items such as floor tiles, shower curtains, squeezable plastic bottles, and outdoor furniture.

Polypropylene (PP) is typically found in straws, yogurt containers, buckets, appliances, and plastic bottle caps.

Polystyrene (PS) is found in softer items such as egg cartons, plastic model kits, disposable cups, plastic plates, Styrofoam peanuts, and CD cases. This is commonly referred to as styrene.

Acrylonitrile Butadiene-styrene (ABS) is used in harder plastic toys such as Lego’s.

Acrylic is used in many items that require the ability to see through them, such as the plastic glass on picture frames.

⇑ Return to Comparison table

Most of the time, the type of plastic is marked or stamped in raised lettering on the bottom of the product. Sometimes the type of plastic is found in the labeling or packaging.

Types of Plastic Glues

Just as different types of plastics have different properties, there are also different types of plastic glues as well. Understanding the basic categories of plastic glues can help you choose the right one, even if your item is not listed on the glue packaging.

Types of Plastic Glue

Cyanoacrylate This type of glue is the type to use when two items must be glued together tightly with no large gaps, such as items that will be clamped when they are glued. It comes in three different thicknesses for different applications. The thicker the glue, the longer it will take it to adhere the two items together. The only drawback is that it is not good for using on clear items because it will discolor them.

This type of glue is the type to use when two items must be glued together tightly with no large gaps, such as items that will be clamped when they are glued. It comes in three different thicknesses for different applications. The thicker the glue, the longer it will take it to adhere the two items together. The only drawback is that it is not good for using on clear items because it will discolor them. Model Cement This glue is recommended for rigid polystyrene, such as that found in model kits. It forms a strong bond, but you need to know that it works by dissolving the two surfaces and then molding them together so that they become one. It is possible to dissolve all the way through the plastic, as well as damage any plastic surface that you are working on.

This glue is recommended for rigid polystyrene, such as that found in model kits. It forms a strong bond, but you need to know that it works by dissolving the two surfaces and then molding them together so that they become one. It is possible to dissolve all the way through the plastic, as well as damage any plastic surface that you are working on. Epoxy The advantage to using epoxy is that it works well when the two surfaces do not match exactly. This type of glue must be mixed before using it. This type of glue works well on most plastics, but you tend to mix more than you will need for the project and waste much of it. Once it is mixed, you must use it immediately because it will begin to harden quickly. When purchasing epoxy, you need to read the labels carefully, because some of them list materials on which they are not recommended.

The advantage to using epoxy is that it works well when the two surfaces do not match exactly. This type of glue must be mixed before using it. This type of glue works well on most plastics, but you tend to mix more than you will need for the project and waste much of it. Once it is mixed, you must use it immediately because it will begin to harden quickly. When purchasing epoxy, you need to read the labels carefully, because some of them list materials on which they are not recommended. Multi-Purpose This type of glue works well on many surfaces, but it does not work well with most plastics. They will bond plastic, but may not be the best choice.

Tips for Working with Glues

Regardless of the type of glue, or surface, you are trying to bond together, there are certain guidelines that will help make your project a success.

Make sure that both surfaces are clean and dry before you begin the gluing process.

Rough surfaces are easier to glue than smooth ones. You can use some sandpaper to roughen the surface of each piece that you will glued together.

Be sure to read the set time on the package. The set time and cure time are different. When the glue is set, it means that it is bonded, but the glue is still soft and will break apart easily. Set and cure times should be listed on the package.

Make sure you read directions about the washing and care of the item once it is dry.

Safety Precautions

When using any type of glue, it is important to adhere to several safety precautions. Always work in a well-ventilated area. It is best to work outdoors, or in a room with plenty of ventilation. The fumes from the glues can cause nausea, dizziness, lightheadedness, skin irritation, eye irritation, and headaches. Some glues suggest the use of gloves to protect your skin. Be certain to get gloves made from the right type of plastic, or you could easily glue them together, or to your fingers. Be sure to read all of the instructions and warnings on the glue label.

Conclusion

Now that you understand the different types of glues and plastics that are available, you also know how to choose the best one for your job. With the help of these tips and suggestions, you should be able to make any project a success. The most important thing is to be sure to choose the right glue for your job and be sure to follow all of the safety instructions.

When all is said and done, we think that Loctite Ultra Control Gel is the best glue for any job that you need to do involving plastic. The reason why we picked this one is because it bonds the most number of different surfaces together. It is great when you have to bond plastic to something else such as metal or wood. We like that it sets quickly, and that it is a gel that will not run when it is applied. For most jobs, we feel that this would be the best glue for the job.


One of Telluride's mellower trails, this 4.5-mile out-and-back climbs a road-grade trail alongside Bear Creek to a beautiful waterfall on Telluride's south side. Walk straight from downtown onto the Bear Creek Trail at the end of Pine Street. Look for beaver activity on the trail's left side as it climbs toward a map kiosk just before mile 0.4. The wide dirt path turns south and continues climbing above the creek—though you'll only catch small glimpses of it until mile 1.5. The wide, rocky trail is easy to follow, but especially early in the summer, expect a few wet and muddy sections and a rock-hopping stream crossing or two. The highlight of this hike is the 100-foot falls at the valley's headwall. Towering cliffs line the rugged bowl and a picnic-perfect spot a few hundred feet below trail end is a great spot to admire them. -Mapped by Kristy Holland

Trail Facts

Waypoints

The trail is marked by a service gate and a large wooden sign explaining that community support helped preserve Bear Creek from development.

ADVERTISEMENT

Thanks for watching!

ADVERTISEMENT

Thanks for watching!

BRC002

Location: 37.9310459, -107.8064756

An illustrated map is posted in the kiosk near mile 0.4. It highlights the natural and human history of the area and includes details about mining, industry, and their affect on the watershed. Follow the wide path as it turns uphill to the right.

BRC003

Location: 37.919741, -107.8069336

During spring melt, expect this section of trail to be wet and muddy. As the trail climbs, you'll cruise through stands of aspen, ponderosa, and open meadows. Look for evidence of early 20th century mining alongside the trail and on the far side of Bear Creek to the left.

BRC004

Location: 37.9172498, -107.8073665

After climbing above the creek until now, the trail finally hits its banks near mile 1.5. Across the creek is a stream and scree field on the flanks of Ballard Mountain.

BRC005

Location: 37.9125315, -107.8077908

This eroded outcropping of red-brown shale marks the site of an old mill that once generated electricity for the town of Telluride.

BRC006

Location: 37.9109731, -107.8093184

Follow the main path uphill and to the right at this Y-junction.

BRC007

Location: 37.9100348, -107.810108

Bypass the Wasatch Trail that leads uphill on your right. Instead, stay on the much larger main path which continues alongside the creek.

BRC008

Location: 37.9082469, -107.8108549

A large, flat picnic area is a great stopping point. From here explore the falls and rocky base of the valley's headwall using the left-hand path leading over a berm, or on the rocks alongside the creek.

BRC009

Location: 37.9061137, -107.811799

This high-volume falls showers rocks and soil nearby. Watch your step on the slippery path as you approach for your photo opps.

Falls

Location: 37.9061222, -107.8117239

Annual runoff from Upper Bear Creek Falls exceeds that of Ingram and Bridal Veil falls closer to town. The cascading display is a worthy reward for your climb.

Trailhead

Location: 37.9343145, -107.8116274

This large sign is on a small hill above the road and marks the beginning of the Bear Creek Trail.

Beaver Den

Location: 37.9334006, -107.811048

Tree stumps and a beaver den in the pond below the trail are evidence of the rodents' activity in the area.

Kiosk

Location: 37.9310481, -107.8062844

This kiosk marks the point where the trail turns into the valley along the old Garden Road.

Views

Location: 37.9262244, -107.8065205

An up-canyon view of Ballard Mountain and La Junta Peak above an alpine meadow. Down-canyon views above the town of Telluride are equally beautiful.

Footbridge

Location: 37.9202493, -107.8069711

This small bridge leads over a runoff stream. There are several wet, rocky spots up ahead. In early summer, expect to hop rocks to avoid getting wet.

Wasatch Trail

Location: 37.910033, -107.8100395

Continue on the larger Bear Creek Trail at this junction with the Wasatch Trail that continues above the falls into Bridal Veil Basin.

Porcupine

Location: 37.9096691, -107.8104097

Local wildlife sightings could include this slow-moving porcupine.

Big Rock

Location: 37.9082469, -107.8107744

This flat below the falls is a great place to stop for a picnic. Explore the creek's banks and get a downstream view of the falls before continuing to climb.


Analysis of RNA exonucleolytic activities in cellular extracts.
Three types of exonucleases contribute to the turnover of messenger RNAs in eukaryotic cells: (1) general 3'-to-5' exonucleases, (2) poly(A)-specific 3'-to-5' exonucleases, and (3) 5'-to-3' exonucleases. All three of these activities can be detected in cytoplasmic extracts from a variety of eukaryotic cells. In this chapter, we describe the preparation and use of HeLa cytoplasmic S100 extracts to study these three distinct exonuclease activities. Also included is an immunodepletion protocol that can be used to identify the enzyme responsible for a given activity. These protocols can be easily expanded to the study of <I>trans-acting factors, <I>cis-acting RNA sequence elements, and the interplay of components involved in RNA turnover in various mammalian cell types.


Introduction
============

Obesity is a devastating condition of pandemic dimensions. In 2015, there were 107.7 million obese children and 603.7 million obese adults worldwide ([@bib1]), and this number is expected to rise. Overweight and obesity are associated with a number of comorbidities, most importantly type 2 diabetes (T2DM), cardiovascular disease, hypertension, dyslipidemia and several kinds of cancer, predominantly gastrointestinal (GI). In 2015, around 4 million deaths were attributed to overweight and obesity ([@bib1]).

Hypothetically speaking, obesity could be prevented simply by reducing food intake and increasing physical activity. However, adherence to lifestyle interventions such as regular exercise is poor. A number of psychological and economic factors are involved in such compliance, and humans might be evolutionarily predisposed to a positive energy balance ([@bib2]). Furthermore, once excess weight has been gained, human metabolism intrinsically defends against its loss ([@bib3]).

Since lifestyle interventions have so far proven insufficient to combat our obesity pandemic, other interventions are needed. To date, the most effective and long-lasting intervention is bariatric surgery. Of the various types of bariatric surgeries available, Roux-en-Y gastric bypass and biliopancreatic diversion/duodenal switch surgeries are the most common and successful, with reported initial excess weight reduction of up to 68--70%, where excess weight is defined as the difference between total preoperative weight and ideal weight ([@bib5], [@bib4]). Despite unquestionable effectiveness, bariatric surgery is typically only available to a small subset of individuals, with inclusion criteria being a BMI greater than 40 or greater than 35 with a comorbidity such as diabetes or heart disease ([@bib6]). In addition, the surgery itself is costly and not without risk ([@bib7]).

Notably, improvement of glycemic control by bariatric surgery is rapid and is often observed even before a clinically relevant weight loss ([@bib10], [@bib9], [@bib8]). Despite intense scientific investigation, changes in metabolic rate or intestinal nutrients absorption do not seem to explain the efficacy and sustainability in weight reduction ([@bib13], [@bib12], [@bib11], [@bib15], [@bib14]). Changes in food intake are frequently reported after bariatric surgery and are commonly considered a causal factor for the weight loss ([@bib16], [@bib18], [@bib17], [@bib15]). Notably, such differences in food intake do not seem to rely on physical limitations of the GI tract ([@bib19]), but rather result from changes in food preference, taste perception and modifications in the central food reward system ([@bib24], [@bib20], [@bib23], [@bib25], [@bib22], [@bib21]). It seems fair to hypothesize that such changes are likely mediated via neuronal and/or humoral factors ([@bib26]). For example, following Roux-en-Y gastric bypass, gastric banding or sleeve gastronomy, there is an increase in the secretion of glucagon-like peptide 1 (GLP-1) ([@bib27], [@bib28], [@bib26]), which is known not only for its beneficial effects on glycemia but also for its ability to decrease body weight via CNS-induced inhibition of food intake ([@bib29]).

GLP-1 is secreted by the intestinal L-cells in response to nutrient stimuli. GLP-1 directly acts on the β-cells to increase glucose-stimulated insulin secretion and also through the central nervous system to decrease food intake ([Fig. 1](#fig1){ref-type="fig"}) ([@bib30]). Native GLP-1 is rapidly degraded by dipeptidyl peptidase IV (DPP-IV), which cleaves native GLP-1 at the N-terminal alanine at the second position, resulting in the generation of the inactive GLP-1~9--36amide~ or GLP-1~9--37~ ([@bib33], [@bib31], [@bib32]). Native GLP-1 accordingly has a circulating half-life of 1.5--5 min ([@bib35], [@bib34]). Modifications to the native GLP-1 sequence have overcome this limitation. Common modifications include the substitution of a d-Serine or aminoisobutyric acid (Aib) residue at position 2 to increase resistance to peptidase degradation. Another common modification is extension of the peptide to include the nine amino acid C-terminal extension (CEX) of exendin-4, which stabilizes the secondary structure and can (depending on the peptide) improve glucagon receptor agonism ([@bib36], [@bib37], [@bib38], [@bib39], [@bib40],[@bib41]). Additional modifications such as site-specific acylation or conjugation with large biomolecules have resulted in a series of commercially available GLP-1 analogs, with varying efficacies ([@bib40],[@bib41]). Despite the development of several iterations, these GLP-1 analogs only have modest weight-lowering efficacy, which, depending on dose and duration of treatment, typically fall in the range of 1--5 kg ([@bib54], [@bib47], [@bib50], [@bib44], [@bib46], [@bib45], [@bib43], [@bib42], [@bib55], [@bib48], [@bib49], [@bib52], [@bib53], [@bib51]). Side effects such as nausea and GI distress preclude higher doses to drive greater weight loss. Therefore, it is clear that while GLP-1 analogs are beneficial to improve glycemia, targeting solely the GLP-1 receptor for the purpose of lowering body weight has limitations.Figure 1Schematic demonstrating the qualitative metabolic effects of GLP-1 (red arrows), glucagon (blue arrows) and GIP (green arrows) on systems metabolism, including key metabolic tissues. Arrows pointing upwards indicate an increase or improvement, while arrows pointing downwards indicate a decrease.

Serendipitously, native GLP-1 shows high sequence homology to glucagon and the glucose-dependent insulinotropic polypeptide (GIP). High sequence homology is also present in the receptors for GLP-1, glucagon and GIP, which together makes these peptides inherently prone to sequence hybridization for the purpose of simultaneously activating their receptors with only one molecule. Notably, glucagon can decrease body weight via inhibition of food intake and elevation of energy expenditure ([@bib30]). Consequently, it was believed that such a single molecule with dual agonism at the receptors for glucagon and GLP-1 would lead to complementary (and ideally synergistic) pharmacological action, putatively driving greater weight loss and glycemic benefits through non-redundant signaling pathways. Any observed beneficial action would naturally create hope for the possibility of lower dosing schemes, thus potentially reducing the possibility of side effects, such as those typically seen at high doses of GLP-1.

The unimolecular formulation has several advantages compared to the loose adjunct administration of the single peptides. The key biological difference is that each independent peptide would have its specific and potentially unique pharmacokinetic profile. Accordingly, the peptides in such a loose combination would likely differ in their rates of absorption, distribution, metabolism and clearance. In contrast, a unimolecular multiagonist would have only one pharmacokinetic profile, which was hypothesized to result in superior metabolic benefits compared to a loose co-mixture of the single peptides. Furthermore, in terms of practicality, a single molecule polyagonist can more easily achieve regulatory approval.

GLP-1/glucagon co-agonism
=========================

The combination of GLP-1R and glucagon receptor (GCGR) agonism into a single entity seems, at first glance, counter-intuitive. Glucagon raises blood glucose levels by stimulating gluconeogenesis and glycogenolysis ([Fig. 1](#fig1){ref-type="fig"}) ([@bib30]). In an obese patient, for whom diabetes is a liability or comorbidity, raising blood glucose would obviously be undesirable. Glucagon has indeed been postulated to play a key role in the development of type 2 diabetes ([@bib56]) and patients with T2DM are frequently reported to have postprandial hyperglucagonemia due to impaired glucose inhibition of glucagon secretion ([@bib57], [@bib58], [@bib61], [@bib60], [@bib59], [@bib62]). However, glucagon also increases satiety after a meal and increases energy expenditure in rodents and humans ([@bib30]). The logic behind a dual agonist targeting the receptors for GLP-1 and glucagon was thus that the insulinotropic effects of GLP-1 would buffer against any hyperglycemic liability of glucagon, while the anorectic effect of GLP-1 would synergize with glucagon's anorectic and thermogenic effects to ultimately drive weight loss ([Fig. 2](#fig2){ref-type="fig"}). One can argue that mother nature developed the first of such GLP-1/glucagon dual-agonists with oxyntomodulin (OXM). Notably, however, despite having activity at both cognate receptors, OXM greatly favors GLP-1R over GCGR ([@bib63]).Figure 2Schematic demonstrating the working principle, metabolic effects and key target tissues of the GLP-1/glucagon dual agonist, with the size of the text weighted to indicate the magnitude of the observed effect. Arrows pointing upwards indicate an increase or improvement, while arrows pointing downwards indicate a decrease. This dual agonist most prominently affects body weight.

The first patented and preclinically evaluated GLP-1/glucagon dual agonist was developed by the groups of Richard DiMarchi and Matthias Tschöp. The molecule is based on the glucagon sequence, with key GLP-1 residues introduced to impart GLP-1R agonism ([@bib64]). This dual agonist also includes an Aib residue at position 2 to protect from DPP-IV cleavage. A 40 kDa PEGylation was added on cysteine 24 to prolong *in vivo* action, and a lactam bridge between Glu16 and Lys20 was introduced to stabilize the secondary structure of the molecule and to boost GCGR activity ([@bib64]). In DIO mice monitored for 7 days, a single injection of 325 nmol/kg resulted in a decrease in food intake and a body weight loss of 25%, primarily due to a loss of fat mass ([@bib64]). In a more chronic setting, weekly administration of 70 nmol/kg of the co-agonist for 1 month resulted in a 28% decrease in body weight, primarily fat mass, as well as an improvement in glucose tolerance, an increase in energy expenditure and an increase in the utilization of lipids as energy substrates ([@bib64]). A 27-day study of the same dose revealed that the co-agonist decreases plasma triglycerides, LDL cholesterol and total cholesterol, decreased circulating leptin and normalized liver lipid content ([@bib64]). These preclinical results demonstrated the multifaceted 'approach' of the co-agonist, which robustly corrects obesity and improves multiple aspects of metabolism simultaneously.

Another example of a GLP-1R/GCGR co-agonist was developed by the research group of Merck. This co-agonist was inspired by the native hormone OXM. In order to boost the activity and efficacy of OXM, d-Serine was substituted at position 2 and a cholesterol moiety was added to the C-terminus of the peptide ([@bib65]). The resulting DualAG peptide showed nearly balanced potency at the receptors for GLP-1 and glucagon ([@bib65]). In DIO mice, every-other-day subcutaneous injections of 1.9 µmol/kg of DualAG for 14 days resulted in a 30% reduction in food intake and a 25% body weight loss, primarily due to a loss of fat mass ([@bib65]). In addition, DualAG induced significant improvements in glucose tolerance and normalized blood glucose levels, benefits that are likely secondary to the loss of body weight ([@bib65]). These effects were blunted in either GLP-1R^−/−^ or GCGR^−/−^ mice ([@bib65]), demonstrating the contribution of both receptors to the metabolic effects and emphasizing the importance of dual agonism for synergistic effects.

A third example of a GLP-1R/GCGR co-agonist has been developed by Sanofi. This peptide is based on the exendin-4 sequence with additional glucagon residues introduced to enhance activity at the GCGR ([@bib66]). Like many of the other dual-agonists, this peptide incorporated a d-Serine at position 2 to reduce peptidase degradation, and a palmitic acid at a Lys14 to extend the half-life, which was measured to be 3.2 h in healthy mice ([@bib66]). In DIO mice, a twice-daily subcutaneous injection of 50 µg/kg of this dual agonist over the course of 33 days resulted in a 29.1% drop in body weight, greater than the 13.6% drop in body weight from a matched dose of liraglutide ([@bib66]). Similarly, in db/db mice, twice-daily subcutaneous injections of 50 µg/kg of the dual agonist over the course of 32 days resulted in lower HbA1c levels than control animals ([@bib66]).

A fourth GLP-1/GCGR co-agonist (MEDbib382) is under development by MedImmune. This peptide has balanced activity at both receptors and increased stability against peptide degradation ([@bib67]). The half-life of this dual agonist is further enhanced by palmitoylation at Lys10, which promotes binding to serum albumin. In DIO mice, acute administration of 10 nmol/kg suppresses food intake and improves glucose tolerance, although these effects are absent in GLP-1R knockout mice ([@bib67]). In a more chronic setting, a daily dose of 30 nmol/kg of MEDbib382 results in a 30% decrease in body weight and suppression of food intake over the course of 4 weeks ([@bib67]). In a separate study, 3 weeks of 10 nmol/kg resulted in a greater weight loss than pair fed controls, and an increase in oxygen consumption and decrease in the respiration exchange ratio compared to vehicle controls, all without a difference in locomotor activity ([@bib67]), suggesting an energy expenditure component to the observed weight loss. Importantly, the weight-loss effects of MEDbib382 translate into cynomolgus monkeys. In a 29-day study with doses between 8 and 27 nmol/kg MEDbib382, cynomolgus monkeys dose dependently lost between 5 and 13% of their body weight ([@bib67]). This weight loss was accompanied by a reduction in food intake ([@bib67]). After treatment cessation, monkeys that had been treated with MEDbib382 stabilized at a lower body weight than the control monkeys ([@bib67]), perhaps indicating that MEDbib382 induced a lower 'set point' for body weight maintenance. In a separate study, 29 days of administration of 4--27 nmol/kg in cynomolgus monkeys did not affect blood glucose ([@bib67]).

These are just some of the GLP-1R/GCGR coagonists currently in development, and several of these peptides have progressed to Phase I and Phase II clinical testing ([Table 1](#tbl1){ref-type="table"}). Undoubtedly, more information on the clinical effects of these drugs will be available soon. Table 1Multiagonists in development.Target receptorsDrugCompanyStatusGLP-1R/GCGRHM12525AHamni PharmaceuticalsPhase IIJNJ-54728518Janssen PharmaceuticalsPhase IMEDbib382MedImmunePhase IIMK-8521MerckPhase IINN9277Novo NordiskPhase IMOD-6030/1Prolor/OPKO BiologicalPreclinicalSAR425899SanofiPhase IIVPD-107Spitfire PharmaPreclinicalTT-401Transition TherapeuticsPhase II/not advancingZP2929ZealandPhase IGLP-1R/GIPRCPD86Eli LillyPreclinicalLY3298176Eli LillyPhase IINN9709/MAR709/RG7697Novo Nordisk/MarcadiaPhase IISAR438335SanofiPhase IZP-I-98ZealandPreclinicalZP-DI-70ZealandPreclinicalGLP-1R/GCGR/GIPRHM15211Hamni PharmaceuticalsPreclinicalMAR423Novo Nordisk/MarcadiaPhase I

GLP-1/GIP co-agonism
--------------------

GIP is a 42 amino acid protein secreted by the enteroendocrine K-cells of the proximal small intestine in response to nutrient intake ([@bib68]). As an incretin hormone, the primary role of GIP is to stimulate insulin secretion ([Fig. 1](#fig1){ref-type="fig"}). Treatment with GIP is reported to normalize blood glucose and to improve glucose tolerance ([@bib69], [@bib70], [@bib71]), although its insulinotropic effects are blunted in some individuals with type 2 diabetes ([@bib72]). Despite its glycemic benefits, GIP was dismissed as a potential anti-obesity target due to some reports testifying GIP is obesogenic in nature in mice and certain cell lines ([@bib76], [@bib78], [@bib73], [@bib75], [@bib74], [@bib77], [@bib79]). However, more recent studies demonstrate that chronic treatment with GIP can decrease body weight in rodents ([@bib79]). Mice overexpressing GIP show improved glycemic control and resistance to diet-induced obesity ([@bib71]). Chronic GIPR agonism further improves glucose metabolism in DIO mice without signs of excess weight gain ([@bib80]). Transgenic pigs expressing a dominant negative GIP receptor in the pancreas also show impaired glucose tolerance due to delayed insulin secretion, impaired insulinotropic action of GIP, roughly 60% reduced β-cell proliferation and reduced islet mass of up to 58% at the age of 1 year ([@bib81]).

The rationale to combine the pharmacology of GLP-1 and GIP in a single entity was based on the hypothesis that such a dual incretin hormone action would maximize the glycemic benefits while the anorexigenic effect of GLP-1 would restrain any obesogenic potential of GIP ([Fig. 3](#fig3){ref-type="fig"}). In support of this hypothesis, co-administration of GLP-1 and GIP in mice was *a priori* confirmed to improve glycemia and body weight loss in DIO mice ([@bib39]).Figure 3Schematic demonstrating the working principle, metabolic effects and key target tissues of the GLP-1/GIP dual agonist. Arrows pointing upwards indicate an increase or improvement, while arrows pointing downwards indicate a decrease. The emphasis on glycemic control indicates the relative magnitude of the effect.

Two unimolecular dual incretin ('twincretin') hormones were subsequently created based on the primary glucagon sequence. The dual-agonists incorporated key GLP-1 and GIP residues such that the peptide activated both the GLP-1R and GIPR with equal potency *in vitro* ([@bib39]). Other modifications included an Aib residue at position 2 to increase resistance to DPP-IV cleavage. This peptide was either acylated with a C16:0 fatty acid (acylated version) at Lys40 or PEGylated with 40 kDa PEG at Cys24 (PEGylated version) to prolong *in vivo* action. The C-terminal ends of the peptides were further modified to carry the CEX tail from exendin-4. Daily administration of 30 nmol/kg of the unacylated version of the dual agonist in DIO mice over the course of 7 days resulted in a 14% drop in body weight, greater than a comparable dose of exendin-4 ([@bib39]). A single 30 nmol/kg dose of the 16-carbon acylated version of the peptide resulted in an 18.8% body weight drop ([@bib39]). Both versions of the peptide decreased food intake, lowered body weight primarily through the loss of fat mass and decreased blood glucose levels ([@bib39]). The PEGylated version of the peptide yielded similar results with less frequent dosing ([@bib39]). Like the GLP-1R/GCGR co-agonist, this GLP-1R/GIPR co-agonist has the potential to be an effective weight-loss drug.

The acylated GLP-1R/GIPR co-agonist was also investigated in cynomolgus monkeys. Monkeys were given a single 10 nmol/kg injection of the acylated co-agonist, and 24 h later, a dextrose infusion, during which blood glucose and insulin were measured. The co-agonist lowered blood glucose and increased insulin, both to a greater extent than a matched dose of liraglutide ([@bib39]).

The PEGylated co-agonist has even been investigated in humans. In a cohort of healthy, non-diabetic human subjects, a single injection of 4, 8 or 16 mg of the PEGylated co-agonist was followed by a dextrose infusion 72 h later. The co-agonist decreased blood glucose and increased plasma insulin concentration ([@bib39]). In more a chronic study, 53 patients with type 2 diabetes were given weekly injections of 4, 12, 20 and 30 mg of the PEGylated co-agonist, for 6 weeks. The co-agonist lowered HbA1c in a dose-dependent manner ([@bib39]). The co-agonist was well tolerated, with only mild-to-moderate side effects ([@bib39]). A further 13-week Phase II study investigated this compound in patients with type 2 diabetes, with comparisons to placebo and liraglutide treatment. Compared to placebo, treatment with once-daily subcutaneous injections of 1.8 mg of the acylated co-agonist resulted in significant decreases in plasma HbA1c, significant decreases in both fasting and self-reported plasma glucose and a decrease in body weight that was significant at week 8 but not at week 12 ([@bib82]). Furthermore, treatment with the acylated co-agonist resulted in a significant reduction in total cholesterol, along with a trend in reduction of LDL, triglycerides, free fatty acids and apolipoprotein B ([@bib82]). In the same study, treatment with liraglutide did not result in a change in cholesterol ([@bib82]). Decreases in plasma leptin (22% relative to placebo) were also observed ([@bib82]), suggesting an increase in leptin sensitivity. In a meal tolerance test, treatment with the compound significantly reduced 2 h post-prandial glucose ([@bib82]). In terms of safety, there were no serious adverse effects related to treatment. Reported adverse effects were mostly mild to moderate, and the majority were GI-related events ([@bib82]). In addition to these co-agonists, many other GLP-1R/GIPR coagonists are currently in development ([Table 1](#tbl1){ref-type="table"}). Whether the promising preclinical results translate into clinical weight-loss benefits remains to be seen.

GLP-1/GIP/glucagon tri-agonist
==============================

The preclinical results of the dual GLP-1-based agonists naturally suggest the combination of all three peptides as a potential unimolecular therapy. It was hypothesized that the dual insulinotropic effect of GLP-1 and GIP would optimally buffer against the diabetogenic liability of glucagon while combined agonism at the receptors for GLP-1 and glucagon would restrain any potential obesogenic effect of GIP. The ultimate result of such triple agonism was a profound ability to decrease body weight and to improve glycemic control ([Fig. 4](#fig4){ref-type="fig"}).Figure 4Schematic demonstrating the working principle, metabolic effects and key target tissues of the GLP-1/GIP/glucagon triple agonist, with the size of the text weighted to indicate the magnitude of the observed effect. Arrows pointing upwards indicate an increase or improvement, while arrows pointing downwards indicate a decrease. The triagonist most predominately affects body weight, glycemic control and liver cholesterol and hepatosteatosis.

Beginning with a previously validated GLP-1/glucagon dual agonist sequence, GIP residues were introduced stepwise to create a peptide with equal *in vitro* potency at all three receptors and with superior potency relative to all three native peptides ([@bib40],[@bib41]). This peptide also included an Aib residue at position 2 to protect against DPP-IV cleavage and a C16:0 palmitic acid at the Lys10 position to prolong *in vivo* action ([@bib40],[@bib41]). In DIO mice, a 20-day study of daily subcutaneous injections of as little as 3 nmol/kg of the triple agonist resulted in a 26.6% body weight reduction, which was primarily the result of a loss of fat mass ([@bib40],[@bib41]). In addition, the triple agonist lowered *ad libitum* blood glucose, improved glucose tolerance and lowered circulating insulin levels ([@bib40],[@bib41]), suggesting improved insulin sensitivity. The triple agonist also lowered hepatic lipid content ([@bib40],[@bib41]), which would be beneficial in a translational setting for patients with fatty liver disease and non-alcoholic steatohepatitis (NASH). Importantly, the metabolic benefits of the triple agonist are dependent on signaling at all three target receptors ([@bib40],[@bib41]), demonstrating that it is truly the *triple* agonism responsible for the observed benefits. The efficacy of the triple agonist has also been investigated in female mice. The triagonist was equally efficacious in lowering body weight in DIO female mice compared to fat mass matched male mice ([@bib83]). In addition, with a daily dose of 10 nmol/kg for 27 days, the triagonist largely resolved the hepatosteatosis observed in the female mice ([@bib83]). Unsurprisingly, the triagonist had only mild effects on glucose tolerance in female mice, since female mice are inherently protected against the development of hyperglycemia and hyperinsulinemia. However, the triagonist did resolve the mild hyperinsulinemia observed in the female mice ([@bib83]). Taken together, these results suggest that the triagonist has translational potential in both sexes.

Other triple GLP-1R/GCGR/GIPR agonists are in development ([Table 1](#tbl1){ref-type="table"}). Hamni Pharmaceuticals has developed a glucagon-based triple agonist, HM15211, with equal potency at all three receptors *in vitro* ([@bib84], [@bib85]). This triple agonist lowers body weight in DIO mice to a greater extent than liraglutide alone and also improves lipid metabolism and hepatic steatosis ([@bib84], [@bib85]).

A third example, Syn-GIP-ZP, is a triple agonist created by fusing a GLP-1R/GCGR dual agonist and a GIP analog to the heavy and light chains of Synagis, an antibody with low immunogenicity in humans ([@bib86]). This fusion peptide has agonism at all three receptors ([@bib86]) and demonstrates that multiagonism is not necessarily limited to structurally related peptides, but can be achieved through fusion to larger biomolecules. Naturally, the advantages of this approach are the increased synthetic flexibility and enhanced pharmacokinetics; however, these molecules must be carefully engineered for stability and carefully designed so that the ratio of agonism between components is metabolically beneficial.

Are multiagonist peptides the golden therapy for obesity?
=========================================================

Until now, most anti-obesity drugs have been focused either on singular molecular targets or their loose combination in a co-mixture. Unfortunately, none of these strategies has so far led to satisfactory results. While most historic pharmacotherapies are hampered by an unfavorable imbalance between efficacy and safety, this new class of multiagonist drugs has emerged with candidates that may finally close the gap between the efficacy seen with bariatric surgery and pharmacology. Whereas these multiagonist peptides outperform available best in class drugs to treat obesity, only time will tell if they really represent an appreciable step forward. The available preclinical data are encouraging. However, whether the efficacy and tolerability that has been demonstrated in rodents and monkeys also translates to humans remains to be seen. More long-term studies and outpatient trials are required to determine sustainability and safety. While a final judgment requires more long-term clinical studies, we can be carefully optimistic that this new class of specially engineered drugs is lighting the path to a new era in weight-loss pharmacology.

Declaration of interest
=======================

S J B, M K and T D M declare that there is no conflict of interest that could be perceived as prejudicing the impartiality of this review. M H T is a scientific advisor for Novo Nordisk and Erx Biotech.

Funding
=======

This work was supported in part by funding to M H T from the Alexander von Humboldt Foundation, the Helmholtz Alliance ICEMED & the Helmholtz Initiative on Personalized Medicine iMed by Helmholtz Association and the Helmholtz cross-program topic 'Metabolic Dysfunction.' This work was further supported by grants from the German Research Foundation DFG-TS226/1-1, DFG-TS226/3-1, European Research Council ERC AdG HypoFlam no. 695054 and the German Center for Diabetes Research (DZD e.V.).

Acknowledgements
================

The figures were made using material provided by Servier Medical Art (Servier), under the terms of the Creative Commons Attribution 3.0 Unported License.

Author contribution statement
=============================

S J B and T D M conceptualized the project and wrote the manuscript. M K and M H T co-conceptualized the manuscript and edited the manuscript.


Q:

Installing vmware tools on a windows vm using ansible

I am trying to install vmware tools on a guest vm using ansible. Most of the examples I have seen online have been on linux using open-vm-tools. This an example below.
    - name: debian | installing open-vm-tools
  apt: name=open-vm-tools state=present
  when: ansible_os_family == "Debian" and ansible_virtualization_type == "VMware"

- name: centos | installing open-vm-tools if a vm
  yum: name=open-vm-tools state=present
  when: ansible_os_family == "Redhat" and ansible_virtualization_type == "VMware"

- name: centos | starting and enabling open-vm-tools
  service: name=vmtoolsd.service state=restarted enabled=yes
  when: ansible_os_family == "Redhat" and ansible_virtualization_type == "VMware"

Is there an example of how to do it in windows?

A:

Would suggest using win_chocolatey to automatically download and install, eg:
- name: install vmware tools via Chocolatey
  win_chocolatey: name="vmware-tools"

Otherwise, win_copy + win_package to push the package over and install it.