module MU

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the folder or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the folder or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the folder or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2016 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2016 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2016 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2016 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2016 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2016 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2016 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2016 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2016 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2016 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2014 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2017 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2020 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2017 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2019 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2017 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2018 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Copyright

Copyright © 2017 eGlobalTech, Inc., all rights reserved

Licensed under the BSD-3 license (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License in the root of the project or at

http://egt-labs.com/mu/LICENSE.html

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Constants

DEBUG

For log entries that should only be logged when we're in verbose mode

ERR

Log entries for fatal errors

ERROR

Log entries for fatal errors

INFO

For ordinary log entries

NOTICE

For more interesting log entries which are not errors

SUMMARY

Log entries that will be held and displayed/emailed at the end of deploy, cleanup, etc.

WARN

Log entries for non-fatal errors

WARNING

Log entries for non-fatal errors

Public Class Methods

account_number() click to toggle source

Wrapper for {MU::Cloud::AWS.account_number}

# File modules/mu.rb, line 844
def self.account_number
  if !@@globals[Thread.current.object_id].nil? and
     !@@globals[Thread.current.object_id]['account_number'].nil?
    return @@globals[Thread.current.object_id]['account_number']
  end
  @@globals[Thread.current.object_id] ||= {}
  @@globals[Thread.current.object_id]['account_number'] = MU::Cloud::AWS.account_number
  @@globals[Thread.current.object_id]['account_number']
end
adminBucketName(platform = nil, credentials: nil) click to toggle source

Return the name of the Mu log and key bucket for this Mu server. Not necessarily in any specific cloud provider. @return [String]

# File modules/mu.rb, line 1099
def self.adminBucketName(platform = nil, credentials: nil)
  return nil if platform and !MU::Cloud.supportedClouds.include?(platform)

  clouds = platform.nil? ? MU::Cloud.supportedClouds : [platform]
  clouds.each { |cloud|
    bucketname = MU::Cloud.cloudClass(cloud).adminBucketName(credentials)
    begin
      if platform or (MU::Cloud.cloudClass(cloud).hosted? and platform.nil?) or cloud == MU::Config.defaultCloud
        return bucketname
      end
    end
  }

  return bucketname
end
appname() click to toggle source

Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.

# File modules/mu.rb, line 506
def self.appname;
  @@globals[Thread.current.object_id] ||= {}
  @@globals[Thread.current.object_id]['appname']
end
chefVersion() click to toggle source

The version of Chef we will install on nodes. @return [String]

# File modules/mu.rb, line 794
def self.chefVersion
  @@chefVersion
end
chef_user() click to toggle source

Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.

# File modules/mu.rb, line 536
def self.chef_user;
  @@globals[Thread.current.object_id] ||= {}
  if @@globals.has_key?(Thread.current.object_id) and @@globals[Thread.current.object_id].has_key?('chef_user')
    @@globals[Thread.current.object_id]['chef_user']
  elsif Etc.getpwuid(Process.uid).name == "root"
    return "mu"
  else
    return Etc.getpwuid(Process.uid).name
  end
end
curRegion() click to toggle source

Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.

# File modules/mu.rb, line 560
def self.curRegion
  @@globals[Thread.current.object_id] ||= {}
  @@globals[Thread.current.object_id]['curRegion'] ||= myRegion || ENV['EC2_REGION']
end
dataDir(for_user = MU.mu_user) click to toggle source

Mu's deployment metadata directory.

# File modules/mu.rb, line 575
def self.dataDir(for_user = MU.mu_user)
  if !localOnly and
     ((Process.uid == 0 and (for_user.nil? or for_user.empty?)) or
      for_user == "mu" or for_user == "root")
    return @myDataDir
  else
    for_user ||= MU.mu_user
    basepath = Etc.getpwnam(for_user).dir+"/.mu"
    Dir.mkdir(basepath, 0755) if !Dir.exist?(basepath)
    Dir.mkdir(basepath+"/var", 0755) if !Dir.exist?(basepath+"/var")
    return basepath+"/var"
  end
end
deploy_id() click to toggle source

Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.

# File modules/mu.rb, line 500
def self.deploy_id;
  @@globals[Thread.current.object_id] ||= {}
  @@globals[Thread.current.object_id]['deploy_id']
end
detectCloudProviders() click to toggle source

Little hack to initialize library-only environments' config files

# File modules/mu.rb, line 642
def self.detectCloudProviders
  MU.log "Auto-detecting cloud providers"
  new_cfg = $MU_CFG.dup
  examples = {}
  MU::Cloud.supportedClouds.each { |cloud|
    cloudclass = MU::Cloud.cloudClass(cloud)
    begin
      if cloudclass.hosted? and !$MU_CFG[cloud.downcase]
        cfg_blob = cloudclass.hosted_config
        if cfg_blob
          new_cfg[cloud.downcase] = cfg_blob
          MU.log "Adding auto-detected #{cloud} stanza", MU::NOTICE
        end
      elsif !$MU_CFG[cloud.downcase] and !cloudclass.config_example.nil?
        examples[cloud.downcase] = cloudclass.config_example
      end
    rescue NoMethodError => e
      # missing .hosted? is normal for dummy layers like CloudFormation
      MU.log e.message, MU::WARN
    end
  }
  new_cfg['auto_detection_done'] = true
  if new_cfg != $MU_CFG or !cfgExists?
    MU.log "Generating #{cfgPath}"
    saveMuConfig(new_cfg, examples) # XXX and reload it
  end
  new_cfg
end
dupGlobals(parent_thread_id, target_thread: Thread.current) click to toggle source

Copy the set of global variables in use by another thread, typically our parent thread.

# File modules/mu.rb, line 481
def self.dupGlobals(parent_thread_id, target_thread: Thread.current)
  @@globals[parent_thread_id] ||= {}
  @@globals[parent_thread_id].each_pair { |name, value|
    setVar(name, value, target_thread: target_thread)
  }
end
environment() click to toggle source

Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.

# File modules/mu.rb, line 512
def self.environment;
  @@globals[Thread.current.object_id] ||= {}
  @@globals[Thread.current.object_id]['environment']
end
etcDir() click to toggle source

The Mu config directory @return [String]

# File modules/mu.rb, line 446
def self.etcDir;
  @@etcDir
end
generateWindowsPassword(safe_pattern: '~!@ click to toggle source

Generate a random password which will satisfy the complexity requirements of stock Amazon Windows AMIs. return [String]: A password string.

# File modules/mu.rb, line 1077
def self.generateWindowsPassword(safe_pattern: '~!@#%^&*_-+=`|(){}[]:;<>,.?', retries: 50)
  # We have dopey complexity requirements, be stringent here.
  # I'll be nice and not condense this into one elegant-but-unreadable regular expression
  attempts = 0
  safe_metachars = Regexp.escape(safe_pattern)
  begin
    if attempts > retries
      MU.log "Failed to generate an adequate Windows password after #{attempts} attempts", MU::ERR
      raise MuError, "Failed to generate an adequate Windows password after #{attempts} attempts"
    end
    winpass = Password.random(14..16)
    attempts += 1
  end while winpass.nil? or !winpass.match(/^[a-z]/i) or !winpass.match(/[A-Z]/) or !winpass.match(/[a-z]/) or !winpass.match(/\d/) or !winpass.match(/[#{safe_metachars}]/) or winpass.match(/[^\w\d#{safe_metachars}]/)

  MU.log "Generated Windows password after #{attempts} attempts", MU::DEBUG
  return winpass
end
globals() click to toggle source

Rig us up to share some global class variables (as MU.var_name). These values are PER-THREAD, so that things like Momma Cat can be more or less thread-safe with global values.

# File modules/mu.rb, line 464
def self.globals;
  @@globals
end
handle() click to toggle source

Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.

# File modules/mu.rb, line 530
def self.handle;
  @@globals[Thread.current.object_id] ||= {}
  @@globals[Thread.current.object_id]['handle']
end
hashCmp(hash1, hash2, missing_is_default: false) click to toggle source

Recursively compare two hashes. Intended to see when cloud API descriptions of existing resources differ from proposed changes so we know when to bother updating. @param hash1 [Hash]: The first hash @param hash2 [Hash]: The second hash @param missing_is_default [Boolean]: Assume that any element missing from hash2 but present in hash1 is a default value to be ignored @return [Boolean]

# File modules/mu.rb, line 1009
def self.hashCmp(hash1, hash2, missing_is_default: false)
  return false if hash1.nil?
  hash2.keys.each { |k|
    if hash1[k].nil?
      return false
    end
  }
  if !missing_is_default
    hash1.keys.each { |k|
      if hash2[k].nil?
        return false
      end
    }
  end

  hash1.keys.each { |k|
    if hash1[k].is_a?(Array) 
      return false if !missing_is_default and hash2[k].nil?
      if !hash2[k].nil?
        hash2[k].each { |item|
          if !hash1[k].include?(item)
            return false
          end
        }
      end
    elsif hash1[k].is_a?(Hash) and !hash2[k].nil?
      result = hashCmp(hash1[k], hash2[k], missing_is_default: missing_is_default)
      return false if !result
    else
      if missing_is_default
        return false if !hash2[k].nil? and hash1[k] != hash2[k]
      else
        return false if hash1[k] != hash2[k]
      end
    end
  }
  true
end
inGem?() click to toggle source

Are we operating in a gem?

# File modules/mu.rb, line 417
def self.inGem?
  return @in_gem if defined? @in_gem

  if Gem.paths and Gem.paths.home and File.dirname(__FILE__).match(/^#{Gem.paths.home}/)
    @in_gem = true
  elsif Gem.paths and Gem.paths.path and !Gem.paths.path.empty?
    Gem.paths.path.each { |p|
      if File.dirname(__FILE__).match(/^#{Regexp.quote(p)}/)
        @in_gem = true
      end
    }
    @in_gem = false if !defined? @in_gem
  else
    @in_gem = false
  end
end
installDir() click to toggle source

The Mu install directory @return [String]

# File modules/mu.rb, line 454
def self.installDir;
  @@installDir
end
loadGroomer(groomer) click to toggle source

@param groomer [String]: The grooming agent to load. @return [Class]: The class object implementing this groomer agent

# File modules/mu.rb, line 803
def self.loadGroomer(groomer)
  MU::Groomer.loadGroomer(groomer)
end
localOnly() click to toggle source

Returns true if we're running without a full systemwide Mu Master install, typically as a gem.

# File modules/mu.rb, line 412
def self.localOnly
  ((Gem.paths and Gem.paths.home and File.realpath(File.expand_path(File.dirname(__FILE__))).match(/^#{Gem.paths.home}/)) or !Dir.exist?("/opt/mu"))
end
log(msg, level = MU::INFO, shorthand_details = nil, details: nil, html: false, verbosity: nil, color: true) click to toggle source

Shortcut to invoke {MU::Logger#log}

# File modules/mu.rb, line 612
def self.log(msg, level = MU::INFO, shorthand_details = nil, details: nil, html: false, verbosity: nil, color: true)
  return if (level == MU::DEBUG and verbosity and verbosity <= MU::Logger::LOUD)
  return if verbosity and verbosity == MU::Logger::SILENT
  details ||= shorthand_details

  if (level == MU::ERR or
      level == MU::WARN or
      level == MU::DEBUG or
      (verbosity and verbosity >= MU::Logger::LOUD) or
      (level == MU::NOTICE and !details.nil?)) and
      Thread.current.thread_variable_get("name")
    newdetails = {
      :thread => Thread.current.object_id,
      :name => Thread.current.thread_variable_get("name")
    }
    newdetails[:details] = details.dup if details
    details = newdetails
  end

  @@logger.log(msg, level, details: details, html: html, verbosity: verbosity, color: color)
end
mainDataDir() click to toggle source

The main (root) Mu user's data directory. @return [String]

# File modules/mu.rb, line 438
def self.mainDataDir;
  @@mainDataDir
end
mommaCatPort() click to toggle source

The port on which the Momma Cat daemon should listen for requests @return [Integer]

# File modules/mu.rb, line 686
def self.mommaCatPort
  @@mommacat_port
end
mommacat() click to toggle source

Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.

# File modules/mu.rb, line 494
def self.mommacat;
  @@globals[Thread.current.object_id] ||= {}
  @@globals[Thread.current.object_id]['mommacat']
end
muCfg() click to toggle source

Front our global $MU_CFG hash with a read-only copy

# File modules/mu.rb, line 406
def self.muCfg
  Marshal.load(Marshal.dump($MU_CFG)).freeze
end
mu_public_addr() click to toggle source

Public Mu server IP address, not necessarily the same as MU.my_public_ip (an be a proxy, load balancer, etc)

# File modules/mu.rb, line 738
def self.mu_public_addr;
  @@mu_public_addr
end
mu_public_ip() click to toggle source

Public Mu server name, not necessarily the same as MU.my_public_ip (an be a proxy, load balancer, etc)

# File modules/mu.rb, line 733
def self.mu_public_ip;
  @@mu_public_ip
end
mu_user() click to toggle source

Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.

# File modules/mu.rb, line 548
def self.mu_user
  @@globals[Thread.current.object_id] ||= {}
  if @@globals.has_key?(Thread.current.object_id) and @@globals[Thread.current.object_id].has_key?('mu_user')
    return @@globals[Thread.current.object_id]['mu_user']
  elsif Etc.getpwuid(Process.uid).name == "root"
    return "mu"
  else
    return Etc.getpwuid(Process.uid).name
  end
end
myAZ() click to toggle source

Find the cloud provider availability zone where this master resides, if any

# File modules/mu.rb, line 868
def self.myAZ
  if MU::Cloud::Google.hosted?
    zone = MU::Cloud::Google.getGoogleMetaData("instance/zone")
    @@myAZ_var = zone.gsub(/.*?\//, "")
  elsif MU::Cloud::AWS.hosted?
    return nil if MU.myCloudDescriptor.nil?
    begin
      @@myAZ_var ||= MU.myCloudDescriptor.placement.availability_zone
    rescue Aws::EC2::Errors::InternalError => e
      MU.log "Got #{e.inspect} on MU::Cloud::AWS.ec2(region: #{MU.myRegion}).describe_instances(instance_ids: [#{@@myInstanceId}])", MU::WARN
      sleep 10
    end
  end
  @@myAZ_var
end
myCloud() click to toggle source

Figure out what cloud provider we're in, if any. @return [String]: Google, AWS, etc. Returns nil if we don't seem to be in a cloud.

# File modules/mu.rb, line 828
def self.myCloud
  if MU::Cloud::Google.hosted?
    @@myInstanceId = MU::Cloud::Google.getGoogleMetaData("instance/name")
    return "Google"
  elsif MU::Cloud::AWS.hosted?
    @@myInstanceId = MU::Cloud::AWS.getAWSMetaData("instance-id")
    return "AWS"
  elsif MU::Cloud::Azure.hosted?
    metadata = MU::Cloud::Azure.get_metadata()["compute"]
    @@myInstanceId = MU::Cloud::Azure::Id.new("/subscriptions/"+metadata["subscriptionId"]+"/resourceGroups/"+metadata["resourceGroupName"]+"/providers/Microsoft.Compute/virtualMachines/"+metadata["name"])
    return "Azure"
  end
  nil
end
myCloudDescriptor() click to toggle source

If our Mu master is hosted in a cloud provider, we can use this to get its cloud API descriptor.

# File modules/mu.rb, line 862
def self.myCloudDescriptor;
  @@myCloudDescriptor
end
myInstanceId() click to toggle source

The cloud instance identifier of this Mu master

# File modules/mu.rb, line 855
def self.myInstanceId
  return nil if MU.myCloud.nil?
  @@myInstanceId # MU.myCloud will have set this, since it's our test variable
end
myRegion() click to toggle source

Find the cloud provider region where this master resides, if any

# File modules/mu.rb, line 809
def self.myRegion
  if MU::Cloud::Google.hosted?
    zone = MU::Cloud::Google.getGoogleMetaData("instance/zone")
    @@myRegion_var = zone.gsub(/^.*?\/|\-\d+$/, "")
  elsif MU::Cloud::AWS.hosted?
    @@myRegion_var ||= MU::Cloud::AWS.myRegion
  elsif MU::Cloud::Azure.hosted?
    @@myRegion_var ||= MU::Cloud::Azure.myRegion
  else
    @@myRegion_var = nil
  end
  @@myRegion_var
end
myRoot() click to toggle source

Mu's installation directory. @return [String]

# File modules/mu.rb, line 381
def self.myRoot;
  @@myRoot
end
mySSLDir() click to toggle source

Mu's SSL certificate directory @return [String]

# File modules/mu.rb, line 998
def self.mySSLDir
  @@mySSLDir
end
myVPC() click to toggle source

The VPC/Network in which this Mu master resides

# File modules/mu.rb, line 985
def self.myVPC
  return nil if MU.myCloud.nil?
  return @@myVPC_var if @@myVPC_var
  my_vpc_desc = MU.myVPCObj
  @@myVPC_var ||= my_vpc_desc.cloud_id if my_vpc_desc
  @@myVPC_var
end
myVPCObj() click to toggle source

The VPC/Network in which this Mu master resides

# File modules/mu.rb, line 976
def self.myVPCObj
  return nil if MU.myCloud.nil?
  return @@myVPCObj_var if @@myVPCObj_var
  @@myVPCObj_var ||= MU::Cloud.cloudClass(MU.myCloud).myVPCObj
  @@myVPCObj_var
end
my_private_ip() click to toggle source

This machine's private IP address

# File modules/mu.rb, line 723
def self.my_private_ip;
  @@my_private_ip
end
my_public_ip() click to toggle source

This machine's public IP address

# File modules/mu.rb, line 728
def self.my_public_ip;
  @@my_public_ip
end
purgeGlobals() click to toggle source

Expunge all global variables.

# File modules/mu.rb, line 489
def self.purgeGlobals
  @@globals.delete(Thread.current.object_id)
end
retrier(catchme = nil, wait: 30, max: 0, ignoreme: [], on_retry: nil, always: nil, loop_if: nil, loop_msg: nil, logmsg_interval: 3) { |retries, wait| ... } click to toggle source

Boilerplate retry block executor, for making cloud API calls which might fail transiently.

@param catchme [Array<Exception>]: Exception classes which should be caught and retried @param wait [Integer]: Number of seconds to wait between retries @param max [Integer]: Maximum number of retries; if less than 1, will retry indefinitely @param ignoreme [Array<Exception>]: Exception classes which can be silently treated as success. This will override any loop_if block and return automatically (after invoking always, if the latter was specified). @param on_retry [Proc]: Optional block of code to invoke during retries @param always [Proc]: Optional block of code to invoke before returning or failing, a bit like ensure @param loop_if [Proc]: Optional block of code to invoke which will cause our block to be rerun until true @param loop_msg [String]: Message to display every third attempt

# File modules/mu.rb, line 321
def self.retrier(catchme = nil, wait: 30, max: 0, ignoreme: [], on_retry: nil, always: nil, loop_if: nil, loop_msg: nil, logmsg_interval: 3)

  loop_if ||= Proc.new { false }

  retries = 0
  begin
    retries += 1
    loglevel = (logmsg_interval > 0 and (retries % logmsg_interval) == 0) ? MU::NOTICE : MU::DEBUG
    log_attempts = retries.to_s
    log_attempts += (max > 0 ? "/"+max.to_s : "")
    yield(retries, wait) if block_given?
    if loop_if.call
      MU.log loop_msg, loglevel, details: log_attempts if loop_msg
      sleep wait
    end
  rescue StandardError => e
    if catchme and catchme.include?(e.class)
      if max > 0 and retries >= max
        always.call if always and always.is_a?(Proc)
        if ignoreme.include?(e.class)
          return
        else
          raise e
        end
      end

      if on_retry and on_retry.is_a?(Proc)
        on_retry.call(e)
      end

      if retries == max-1
        MU.log e.message, MU::WARN, details: caller
        sleep wait # wait extra on the final attempt
      else
        MU.log e.message, loglevel, details: log_attempts
      end

      sleep wait
      retry
    elsif ignoreme and ignoreme.include?(e.class)
      always.call if always and always.is_a?(Proc)
      return
    else
      always.call if always and always.is_a?(Proc)
      raise e
    end
  end while loop_if.call and (max < 1 or retries < max)

  always.call if always and always.is_a?(Proc)
end
seed() click to toggle source

Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.

# File modules/mu.rb, line 524
def self.seed;
  @@globals[Thread.current.object_id] ||= {}
  @@globals[Thread.current.object_id]['seed']
end
setLogging(verbosity, webify_logs = false, handle = STDOUT, color = true) click to toggle source

Set parameters parameters for calls to {MU#log}

# File modules/mu.rb, line 595
def self.setLogging(verbosity, webify_logs = false, handle = STDOUT, color = true)
  @@logger ||= MU::Logger.new(verbosity, webify_logs, handle, color)
  @@logger.html = webify_logs
  @@logger.verbosity = verbosity
  @@logger.handle = handle
  @@logger.color = color
end
setVar(name, value, target_thread: Thread.current) click to toggle source

Set one of our global per-thread variables.

# File modules/mu.rb, line 471
def self.setVar(name, value, target_thread: Thread.current)
  @@global_var_semaphore.synchronize {
    @@globals[target_thread.object_id] ||= Hash.new
    @@globals[target_thread.object_id][name] ||= Hash.new
    @@globals[target_thread.object_id][name] = value
  }
end
strToSym(obj) click to toggle source

Given a hash, or an array that might contain a hash, change all of the keys to symbols. Useful for formatting option parameters to some APIs.

# File modules/mu.rb, line 1050
def self.strToSym(obj)
  if obj.is_a?(Hash)
    newhash = {}
    obj.each_pair { |k, v|
      if v.is_a?(Hash) or v.is_a?(Array)
        newhash[k.to_sym] = MU.strToSym(v)
      else
        newhash[k.to_sym] = v
      end
    }
    newhash
  elsif obj.is_a?(Array)
    newarr = []
    obj.each { |v|
      if v.is_a?(Hash) or v.is_a?(Array)
        newarr << MU.strToSym(v)
      else
        newarr << v
      end
    }
    newarr
  end
end
structToHash(struct, stringify_keys: false) click to toggle source

Recursively turn a Ruby OpenStruct into a Hash @param struct [OpenStruct] @param stringify_keys [Boolean] @return [Hash]

# File modules/mu.rb, line 888
def self.structToHash(struct, stringify_keys: false)
  return nil if struct.nil?

  google_struct = false
  begin
    google_struct = struct.class.ancestors.include?(::Google::Apis::Core::Hashable)
  rescue NameError
  rescue TypeError
    return struct
  end

  aws_struct = false
  begin
    aws_struct = struct.class.ancestors.include?(::Seahorse::Client::Response)
  rescue NameError
  rescue TypeError
    return struct
  end

  azure_struct = false
  begin
    azure_struct = struct.class.ancestors.include?(::MsRestAzure) or struct.class.name.match(/Azure::.*?::Mgmt::.*?::Models::/)
  rescue NameError
  rescue TypeError
    return struct
  end

  if struct.is_a?(Struct) or struct.class.ancestors.include?(Struct) or
     google_struct or aws_struct or azure_struct

    hash = if azure_struct
      MU::Cloud::Azure.respToHash(struct)
    else
      struct.to_h
    end

    if stringify_keys
      newhash = {}
      hash.each_pair { |k, v|
        newhash[k.to_s] = v
      }
      hash = newhash 
    end

    hash.each_pair { |key, value|
      hash[key] = self.structToHash(value, stringify_keys: stringify_keys)
    }
    return hash
  elsif struct.is_a?(MU::Config::Ref)
    struct = struct.to_h
  elsif struct.is_a?(MU::Cloud::Azure::Id)
    struct = struct.to_s
  elsif struct.is_a?(Hash)
    if stringify_keys
      newhash = {}
      struct.each_pair { |k, v|
        newhash[k.to_s] = v
      }
      struct = newhash 
    end
    struct.each_pair { |key, value|
      struct[key] = self.structToHash(value, stringify_keys: stringify_keys)
    }
    return struct
  elsif struct.is_a?(Array)
    struct.map! { |elt|
      self.structToHash(elt, stringify_keys: stringify_keys)
    }
  elsif struct.is_a?(String)
    # Cleanse weird encoding problems
    return struct.dup.to_s.force_encoding("ASCII-8BIT").encode('UTF-8', invalid: :replace, undef: :replace, replace: '?')
  else
    return struct
  end
end
summary() click to toggle source

Shortcut to get SUMMARY messages from the global MU::Logger instance @return [Array<String>]

# File modules/mu.rb, line 607
def self.summary
  @@logger.summary
end
supportedGroomers() click to toggle source

XXX these guys to move into mu/groomer List of known/supported grooming agents (configuration management tools)

# File modules/mu.rb, line 786
def self.supportedGroomers
  ["Chef", "Ansible"]
end
syncLitterThread() click to toggle source

Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.

# File modules/mu.rb, line 566
def self.syncLitterThread;
  @@globals[Thread.current.object_id] ||= {}
  @@globals[Thread.current.object_id]['syncLitterThread']
end
timestamp() click to toggle source

Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.

# File modules/mu.rb, line 518
def self.timestamp;
  @@globals[Thread.current.object_id] ||= {}
  @@globals[Thread.current.object_id]['timestamp']
end
userEmail(user = MU.mu_user) click to toggle source

Fetch the email address of a given Mu user

# File modules/mu.rb, line 753
def self.userEmail(user = MU.mu_user)
  @userlist ||= MU::Master.listUsers
  user = "mu" if user == "root"
  if Dir.exist?("#{MU.mainDataDir}/users/#{user}") and
     File.readable?("#{MU.mainDataDir}/users/#{user}/email") and
     File.size?("#{MU.mainDataDir}/users/#{user}/email")
    return File.read("#{MU.mainDataDir}/users/#{user}/email").chomp
  elsif @userlist.has_key?(user)
    return @userlist[user]['email']
  else
    MU.log "Attempted to load nonexistent user #{user}", MU::ERR
    return nil
  end
end
userName(user = MU.mu_user) click to toggle source

Fetch the real-world name of a given Mu user

# File modules/mu.rb, line 769
def self.userName(user = MU.mu_user)
  @userlist ||= MU::Master.listUsers
  if Dir.exist?("#{MU.mainDataDir}/users/#{user}") and
     File.readable?("#{MU.mainDataDir}/users/#{user}/realname") and
     File.size?("#{MU.mainDataDir}/users/#{user}/realname")
    return File.read("#{MU.mainDataDir}/users/#{user}/realname").chomp
  elsif @userlist.has_key?(user)
    return @userlist[user]['email']
  else
    MU.log "Attempted to load nonexistent user #{user}", MU::ERR
    return nil
  end
end
verbosity() click to toggle source

Return the verbosity setting of the default @@logger object

# File modules/mu.rb, line 590
def self.verbosity
  @@logger ? @@logger.verbosity : MU::Logger::NORMAL
end
version_sort(a, b) click to toggle source

utility routine for sorting semantic versioning strings

# File modules/mu.rb, line 386
def self.version_sort(a, b)
  a_parts = a.split(/[^a-z0-9]/)
  b_parts = b.split(/[^a-z0-9]/)
  for i in 0..a_parts.size
    matchval = if a_parts[i] and b_parts[i] and
                  a_parts[i].match(/^\d+/) and b_parts[i].match(/^\d+/)
      a_parts[i].to_i <=> b_parts[i].to_i
    elsif a_parts[i] and !b_parts[i]
      1
    elsif !a_parts[i] and b_parts[i]
      -1
    else
      a_parts[i] <=> b_parts[i]
    end
    return matchval if matchval != 0
  end
  0
end