code: function update_modifier_state(e) {
  
          // Get state
          var state = Guacamole.Keyboard.ModifierState.fromKeyboardEvent(e);
  
          // Release alt if implicitly released
          if (guac_keyboard.modifiers.alt && state.alt === false) {
              guac_keyboard.release(0xFFE9); // Left alt
              guac_keyboard.release(0xFFEA); // Right alt
              guac_keyboard.release(0xFE03); // AltGr
          }
  
          // Release shift if implicitly released
          if (guac_keyboard.modifiers.shift && state.shift === false) {
              guac_keyboard.release(0xFFE1); // Left shift
              guac_keyboard.release(0xFFE2); // Right shift
          }
  
          // Release ctrl if implicitly released
          if (guac_keyboard.modifiers.ctrl && state.ctrl === false) {
              guac_keyboard.release(0xFFE3); // Left ctrl 
              guac_keyboard.release(0xFFE4); // Right ctrl 
          }
  
          // Release meta if implicitly released
          if (guac_keyboard.modifiers.meta && state.meta === false) {
              guac_keyboard.release(0xFFE7); // Left meta 
              guac_keyboard.release(0xFFE8); // Right meta 
          }
  
          // Release hyper if implicitly released
          if (guac_keyboard.modifiers.hyper && state.hyper === false) {
              guac_keyboard.release(0xFFEB); // Left hyper
              guac_keyboard.release(0xFFEC); // Right hyper
          }
  
          // Update state
          guac_keyboard.modifiers = state;
  
      }
docs: Given a keyboard event, updates the local modifier state and remote
  key state based on the modifier flags within the event. This function
  pays no attention to keycodes.
  
  @private
  @param {KeyboardEvent} e
  The keyboard event containing the flags to update.