/// @inheritdoc INestedFactory
function addOperator(bytes32 operator) external override onlyOwner {
  require(operator != bytes32(""), "NF: INVALID_OPERATOR_NAME");
  bytes32[] memory operatorsCache = operators;
  for (uint256 i = 0; i < operatorsCache.length; i++) {
      require(operatorsCache[i] != operator, "NF: EXISTENT_OPERATOR");
  }
  operators.push(operator);
  emit OperatorAdded(operator);
}
/// @notice Rebuild the operatorCache
function rebuildCache() external {
    bytes32[] memory requiredOperators = resolverOperatorsRequired();
    bytes32 name;
    IOperatorResolver.Operator memory destination;
    // The resolver must call this function whenever it updates its state
    for (uint256 i = 0; i < requiredOperators.length; i++) {
        name = requiredOperators[i];
        // Note: can only be invoked once the resolver has all the targets needed added
        destination = resolver.getOperator(name);
        if (destination.implementation != address(0)) {
            operatorCache[name] = destination;
        } else {
            delete operatorCache[name];
        }
        emit CacheUpdated(name, destination);
    }
}
/// @inheritdoc INestedFactory
function removeOperator(bytes32 operator) external override onlyOwner {
  uint256 operatorsLength = operators.length;
  for (uint256 i = 0; i < operatorsLength; i++) {
      if (operators[i] == operator) {
          operators[i] = operators[operatorsLength - 1];
          operators.pop();
          emit OperatorRemoved(operator);
          return;
      }
  }
  revert("NF: NON_EXISTENT_OPERATOR");
}
/// @notice Check the state of operatorCache
function isResolverCached() external view returns (bool) {
  bytes32[] memory requiredOperators = resolverOperatorsRequired();
  bytes32 name;
  IOperatorResolver.Operator memory cacheTmp;
  IOperatorResolver.Operator memory actualValue;
  for (uint256 i = 0; i < requiredOperators.length; i++) {
