C++ Mathematical Expression Library (ExprTk)  https://www.partow.net/programming/exprtk/index.html
diff --git a/Makefile b/Makefile
index a8d7d28..ebc72fd 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
 # **************************************************************
 # *         C++ Mathematical Expression Toolkit Library        *
 # *                                                            *
-# * Author: Arash Partow (1999-2024)                           *
+# * Author: Arash Partow (1999-2025)                           *
 # * URL: https://www.partow.net/programming/exprtk/index.html  *
 # *                                                            *
 # * Copyright notice:                                          *
diff --git a/exprtk.hpp b/exprtk.hpp
index d53048a..e28a96d 100644
--- a/exprtk.hpp
+++ b/exprtk.hpp
@@ -2,7 +2,7 @@
  ******************************************************************
  *           C++ Mathematical Expression Toolkit Library          *
  *                                                                *
- * Author: Arash Partow (1999-2024)                               *
+ * Author: Arash Partow (1999-2025)                               *
  * URL: https://www.partow.net/programming/exprtk/index.html      *
  *                                                                *
  * Copyright notice:                                              *
@@ -1020,7 +1020,7 @@
                   return (v1 == trunc_impl(v1, real_type_tag())) &&
                          (modulus_impl(v1, T(2), real_type_tag()) != T(0)) ?
                          -std::pow(abs_impl(v0, real_type_tag()), T(1) / v1) :
-                          std::numeric_limits<double>::quiet_NaN();
+                          std::numeric_limits<T>::quiet_NaN();
                }
 
                return std::pow(v0, T(1) / v1);
@@ -1873,7 +1873,7 @@
                case 4 : exprtk_process_digit
                case 3 : exprtk_process_digit
                case 2 : exprtk_process_digit
-               case 1 : if ((digit = (*itr - zero))>= 10)
+               case 1 : if ((digit = (*itr - zero)) >= 10)
                         {
                            digit = 0;
                            return_result = false;
@@ -2081,7 +2081,8 @@
                   {
                      if (end == ++itr)
                         return false;
-                     else if (('I' <= (*itr)) && ((*itr) <= 'n'))
+
+                     if (('I' <= (*itr)) && ((*itr) <= 'n'))
                      {
                         if (('i' == (*itr)) || ('I' == (*itr)))
                         {
@@ -2690,6 +2691,14 @@
 
             while (!is_end(s_itr_))
             {
+               if (details::is_invalid(*s_itr_))
+               {
+                  token_t t;
+                  t.set_error(token::e_error, s_itr_, s_itr_ + 1, base_itr_);
+                  token_list_.push_back(t);
+                  return;
+               }
+
                if ((1 == mode) && test::comment_end(*s_itr_, 0, mode))
                {
                   ++s_itr_;
@@ -3237,6 +3246,8 @@
                                  }
                               }
                               break;
+
+                     default: continue;
                   }
                }
             }
@@ -4646,6 +4657,8 @@
 
       inline void rebase(data_ptr_t data)
       {
+         assert(data);
+
          data_ = data;
 
          if (!data_ref_.empty())
@@ -4657,6 +4670,17 @@
          }
       }
 
+      inline bool rebase(data_ptr_t data, const std::size_t new_size)
+      {
+         if (set_size(new_size))
+         {
+            rebase(data);
+            return true;
+         }
+
+         return false;
+      }
+
       inline data_ptr_t data() const
       {
          return data_;
@@ -4692,6 +4716,14 @@
                        static_cast<int>(data_ref_.size())));
       }
 
+      void set_size_ref(std::size_t* size_ref)
+      {
+         size_ref_.push_back(size_ref);
+         exprtk_debug(("vector_view::set_size_ref() - size_ref: %p size_ref_.size(): %d\n",
+                       reinterpret_cast<void*>(size_ref),
+                       static_cast<int>(size_ref_.size())));
+      }
+
       void remove_ref(data_ptr_t* data_ref)
       {
          data_ref_.erase(
@@ -4702,6 +4734,16 @@
                        static_cast<int>(data_ref_.size())));
       }
 
+      void remove_size_ref(std::size_t* size_ref)
+      {
+         size_ref_.erase(
+            std::remove(size_ref_.begin(), size_ref_.end(), size_ref),
+            size_ref_.end());
+         exprtk_debug(("vector_view::remove_size_ref() - size_ref: %p size_ref_.size(): %d\n",
+                       reinterpret_cast<void*>(size_ref),
+                       static_cast<int>(size_ref_.size())));
+      }
+
       bool set_size(const std::size_t new_size)
       {
          if ((new_size > 0) && (new_size <= base_size_))
@@ -4710,6 +4752,15 @@
             exprtk_debug(("vector_view::set_size() - data_: %p size: %lu\n",
                           reinterpret_cast<void*>(data_),
                           size_));
+
+            if (!size_ref_.empty())
+            {
+               for (std::size_t i = 0; i < size_ref_.size(); ++i)
+               {
+                  (*size_ref_[i]) = new_size;
+               }
+            }
+
             return true;
          }
 
@@ -4725,6 +4776,7 @@
       std::size_t size_;
       data_ptr_t  data_;
       std::vector<data_ptr_t*> data_ref_;
+      std::vector<std::size_t*> size_ref_;
    };
 
    template <typename T>
@@ -4742,6 +4794,7 @@
    }
 
    template <typename T> class results_context;
+   namespace  details { template <typename T> class vector_interface; }
 
    template <typename T>
    struct type_store
@@ -4758,6 +4811,7 @@
       : data(0)
       , size(0)
       , type(e_unknown)
+      , ivec(0)
       {}
 
       union
@@ -4766,8 +4820,11 @@
          T*    vec_data;
       };
 
+      typedef details::vector_interface<T>* ivec_t;
+
       std::size_t size;
       store_type  type;
+      ivec_t      ivec;
 
       class parameter_list
       {
@@ -4817,6 +4874,26 @@
             return parameter_list_.back();
          }
 
+         inline typename std::vector<type_store>::const_iterator begin() const
+         {
+            return parameter_list_.begin();
+         }
+
+         inline typename std::vector<type_store>::const_iterator end() const
+         {
+            return parameter_list_.end();
+         }
+
+         inline typename std::vector<type_store>::iterator begin()
+         {
+            return parameter_list_.begin();
+         }
+
+         inline typename std::vector<type_store>::iterator end()
+         {
+            return parameter_list_.end();
+         }
+
       private:
 
          std::vector<type_store>& parameter_list_;
@@ -5849,6 +5926,24 @@
       }
 
       template <typename T>
+      inline bool amalgamated_vecop(const expression_node<T>* node)
+      {
+         if (node)
+         {
+            switch (node->type())
+            {
+               case details::expression_node<T>::e_vecvecarith :
+               case details::expression_node<T>::e_vecvalarith :
+               case details::expression_node<T>::e_valvecarith :
+               case details::expression_node<T>::e_vecunaryop  : return true;
+               default                                         : return false;
+            }
+         }
+         else
+            return false;
+      }
+
+      template <typename T>
       inline bool is_constant_node(const expression_node<T>* node)
       {
          return node &&
@@ -6382,6 +6477,12 @@
             virtual void remove_ref(value_ptr*)
             {}
 
+            virtual void set_size_ref(std::size_t*)
+            {}
+
+            virtual void remove_size_ref(std::size_t*)
+            {}
+
             virtual vector_view<Type>* rebaseable_instance()
             {
                return reinterpret_cast<vector_view<Type>*>(0);
@@ -6635,6 +6736,14 @@
             }
          }
 
+         void set_size_ref(std::size_t* ref)
+         {
+            if (rebaseable())
+            {
+               vector_holder_base_->set_size_ref(ref);
+            }
+         }
+
          void remove_ref(value_ptr* ref)
          {
             if (rebaseable())
@@ -6643,6 +6752,14 @@
             }
          }
 
+         void remove_size_ref(std::size_t* ref)
+         {
+            if (rebaseable())
+            {
+               vector_holder_base_->remove_size_ref(ref);
+            }
+         }
+
          bool rebaseable() const
          {
             return vector_holder_base_->rebaseable();
@@ -7454,8 +7571,9 @@
             }
 
             loop_runtime_check::violation_context ctxt;
-            ctxt.loop      = loop_type_;
-            ctxt.violation = loop_runtime_check::e_iteration_count;
+            ctxt.loop            = loop_type_;
+            ctxt.violation       = loop_runtime_check::e_iteration_count;
+            ctxt.iteration_count = iteration_count_;
 
             loop_runtime_check_->handle_runtime_violation(ctxt);
 
@@ -8368,9 +8486,23 @@
       template <typename T>
       struct range_pack
       {
-         typedef expression_node<T>*           expression_node_ptr;
+         typedef expression_node<T>*                expression_node_ptr;
          typedef std::pair<std::size_t,std::size_t> cached_range_t;
 
+         struct size_holder_t
+         {
+            std::size_t size_;
+
+            size_holder_t(const std::size_t sz = std::numeric_limits<std::size_t>::max())
+            : size_(sz)
+            {}
+
+            std::size_t size() const
+            {
+               return size_;
+            }
+         };
+
          range_pack()
          : n0_e (std::make_pair(false,expression_node_ptr(0)))
          , n1_e (std::make_pair(false,expression_node_ptr(0)))
@@ -8429,8 +8561,8 @@
                   (!n0_c.first && !n1_c.first);
          }
 
-         bool operator() (std::size_t& r0, std::size_t& r1,
-                          const std::size_t& size = std::numeric_limits<std::size_t>::max()) const
+         template <typename StrBaseType>
+         bool operator() (std::size_t& r0, std::size_t& r1, const StrBaseType& str_base) const
          {
             if (n0_c.first)
                r0 = n0_c.second;
@@ -8450,6 +8582,8 @@
             else
                return false;
 
+            const std::size_t size = str_base.size();
+
             if (
                  (std::numeric_limits<std::size_t>::max() != size) &&
                  (std::numeric_limits<std::size_t>::max() == r1  )
@@ -8461,10 +8595,10 @@
             cache.first  = r0;
             cache.second = r1;
 
-            #ifndef exprtk_enable_range_runtime_checks
-            return (r0 <= r1);
-            #else
+            #ifdef exprtk_enable_range_runtime_checks
             return range_runtime_check(r0, r1, size);
+            #else
+            return (r0 <= r1) && (r1 <= size);
             #endif
          }
 
@@ -8948,10 +9082,12 @@
 
             assert(vec_rt_chk_);
 
+            const _uint64_t base_address = reinterpret_cast<_uint64_t>(vector_base_);
+
             vector_access_runtime_check::violation_context context;
-            context.base_ptr   = reinterpret_cast<void*>(vector_base_);
-            context.end_ptr    = reinterpret_cast<void*>(vector_base_ + vector_holder_->size());
-            context.access_ptr = reinterpret_cast<void*>(vector_base_ + index);
+            context.base_ptr   = reinterpret_cast<void*>(base_address);
+            context.end_ptr    = reinterpret_cast<void*>(base_address + vector_holder_->size() * sizeof(T));
+            context.access_ptr = reinterpret_cast<void*>(base_address + index * sizeof(T));
             context.type_size  = sizeof(T);
 
             return vec_rt_chk_->handle_runtime_violation(context) ?
@@ -9049,10 +9185,12 @@
 
             assert(vec_rt_chk_);
 
+            const _uint64_t base_address = reinterpret_cast<_uint64_t>(vector_base_);
+
             vector_access_runtime_check::violation_context context;
-            context.base_ptr   = reinterpret_cast<void*>(vector_base_);
-            context.end_ptr    = reinterpret_cast<void*>(vector_base_ + vector_holder_->size());
-            context.access_ptr = reinterpret_cast<void*>(vector_base_ + index_);
+            context.base_ptr   = reinterpret_cast<void*>(base_address);
+            context.end_ptr    = reinterpret_cast<void*>(base_address + vector_holder_->size() * sizeof(T));
+            context.access_ptr = reinterpret_cast<void*>(base_address + index_ * sizeof(T));
             context.type_size  = sizeof(T);
 
             return vec_rt_chk_->handle_runtime_violation(context) ?
@@ -9309,10 +9447,12 @@
 
             assert(vec_rt_chk_);
 
+            const _uint64_t base_address = reinterpret_cast<_uint64_t>(vector_holder_->data());
+
             vector_access_runtime_check::violation_context context;
-            context.base_ptr   = reinterpret_cast<void*>(vector_holder_->data());
-            context.end_ptr    = reinterpret_cast<void*>(vector_holder_->data() + vector_holder_->size());
-            context.access_ptr = reinterpret_cast<void*>(vector_holder_->data() + index);
+            context.base_ptr   = reinterpret_cast<void*>(base_address);
+            context.end_ptr    = reinterpret_cast<void*>(base_address + vector_holder_->size() * sizeof(T));
+            context.access_ptr = reinterpret_cast<void*>(base_address + index * sizeof(T));
             context.type_size  = sizeof(T);
 
             return vec_rt_chk_->handle_runtime_violation(context) ?
@@ -9407,10 +9547,12 @@
 
             assert(vec_rt_chk_);
 
+            const _uint64_t base_address = reinterpret_cast<_uint64_t>(vector_base_);
+
             vector_access_runtime_check::violation_context context;
-            context.base_ptr   = reinterpret_cast<void*>(vector_base_);
-            context.end_ptr    = reinterpret_cast<void*>(vector_base_ + vector_holder_->size());
-            context.access_ptr = reinterpret_cast<void*>(vector_base_ + index_);
+            context.base_ptr   = reinterpret_cast<void*>(base_address);
+            context.end_ptr    = reinterpret_cast<void*>(base_address + vector_holder_->size() * sizeof(T));
+            context.access_ptr = reinterpret_cast<void*>(base_address + index_ * sizeof(T));
             context.type_size  = sizeof(T);
 
             return vec_rt_chk_->handle_runtime_violation(context) ?
@@ -10019,9 +10161,17 @@
 
          swap_generic_node(expression_ptr var0, expression_ptr var1)
          : binary_node<T>(details::e_swap, var0, var1)
-         , var0_(dynamic_cast<ivariable_ptr>(var0))
-         , var1_(dynamic_cast<ivariable_ptr>(var1))
-         {}
+         , var0_(0)
+         , var1_(0)
+         , initialised_(false)
+         {
+            var0_ = dynamic_cast<ivariable_ptr>(var0);
+            var1_ = dynamic_cast<ivariable_ptr>(var1);
+
+            initialised_ = (var0_ && var1_);
+
+            assert(valid());
+         }
 
          inline T value() const exprtk_override
          {
@@ -10034,10 +10184,16 @@
             return expression_node<T>::e_swap;
          }
 
+         inline bool valid() const exprtk_override
+         {
+            return initialised_ && binary_node<T>::valid();
+         }
+
       private:
 
          ivariable_ptr var0_;
          ivariable_ptr var1_;
+         bool          initialised_;
       };
 
       template <typename T>
@@ -10289,7 +10445,7 @@
             return std::numeric_limits<T>::quiet_NaN();
          }
 
-         inline std::string str() const exprtk_override
+         std::string str() const exprtk_override
          {
             return (*value_);
          }
@@ -10428,6 +10584,7 @@
          typedef range_interface<T>   irange_t;
          typedef irange_t*            irange_ptr;
          typedef std::pair<expression_ptr,bool>  branch_t;
+         typedef typename range_t::size_holder_t size_holder_t;
 
          generic_string_range_node(expression_ptr str_branch, const range_t& brange)
          : initialised_(false)
@@ -10479,8 +10636,8 @@
             const std::size_t base_str_size = str_base_ptr_->size();
 
             if (
-                  range      (str_r0, str_r1, base_str_size         ) &&
-                  base_range_(r0    , r1    , base_str_size - str_r0)
+                  range      (str_r0, str_r1, size_holder_t(base_str_size         )) &&
+                  base_range_(r0    , r1    , size_holder_t(base_str_size - str_r0))
                )
             {
                const std::size_t size = r1 - r0;
@@ -10632,8 +10789,8 @@
             const range_t& range1 = str1_range_ptr_->range_ref();
 
             if (
-                  range0(str0_r0, str0_r1, str0_base_ptr_->size()) &&
-                  range1(str1_r0, str1_r1, str1_base_ptr_->size())
+                  range0(str0_r0, str0_r1, *str0_base_ptr_) &&
+                  range1(str1_r0, str1_r1, *str1_base_ptr_)
                )
             {
                const std::size_t size0 = (str0_r1 - str0_r0);
@@ -10861,8 +11018,8 @@
             const range_t& range1 = (*str1_range_ptr_);
 
             if (
-                  range0(str0_r0, str0_r1, str0_base_ptr_->size()) &&
-                  range1(str1_r0, str1_r1, str1_base_ptr_->size())
+                  range0(str0_r0, str0_r1, *str0_base_ptr_) &&
+                  range1(str1_r0, str1_r1, *str1_base_ptr_)
                )
             {
                const std::size_t size0    = range0.cache_size();
@@ -11110,7 +11267,7 @@
 
             const range_t& range = (*str1_range_ptr_);
 
-            if (range(r0, r1, str1_base_ptr_->size()))
+            if (range(r0, r1, *str1_base_ptr_))
             {
                AssignmentProcess::execute(
                   str0_node_ptr_->ref(),
@@ -11247,8 +11404,8 @@
             const range_t& range1 = (*str1_range_ptr_);
 
             if (
-                  range0(s0_r0, s0_r1, str0_base_ptr_->size()) &&
-                  range1(s1_r0, s1_r1, str1_base_ptr_->size())
+                  range0(s0_r0, s0_r1, *str0_base_ptr_) &&
+                  range1(s1_r0, s1_r1, *str1_base_ptr_)
                )
             {
                const std::size_t size = std::min((s0_r1 - s0_r0), (s1_r1 - s1_r0));
@@ -11386,7 +11543,7 @@
 
                const range_t& range = str0_range_ptr_->range_ref();
 
-               if (range(r0, r1, str0_base_ptr_->size()))
+               if (range(r0, r1, *str0_base_ptr_))
                {
                   const std::size_t size = (r1 - r0);
 
@@ -11404,7 +11561,7 @@
 
                const range_t& range = str1_range_ptr_->range_ref();
 
-               if (range(r0, r1, str1_base_ptr_->size()))
+               if (range(r0, r1, *str1_base_ptr_))
                {
                   const std::size_t size = (r1 - r0);
 
@@ -11550,27 +11707,27 @@
             return std::numeric_limits<T>::quiet_NaN();
          }
 
-         std::string str() const
+         std::string str() const exprtk_override
          {
             return value_;
          }
 
-         char_cptr base() const
+         char_cptr base() const exprtk_override
          {
             return &value_[0];
          }
 
-         std::size_t size() const
+         std::size_t size() const exprtk_override
          {
             return value_.size();
          }
 
-         range_t& range_ref()
+         range_t& range_ref() exprtk_override
          {
             return range_;
          }
 
-         const range_t& range_ref() const
+         const range_t& range_ref() const exprtk_override
          {
             return range_;
          }
@@ -11751,7 +11908,7 @@
          assert_node(expression_ptr   assert_condition_node,
                      expression_ptr   assert_message_node,
                      assert_check_ptr assert_check,
-                     assert_context_t context)
+                     const assert_context_t& context)
          : assert_message_str_base_(0)
          , assert_check_(assert_check)
          , context_(context)
@@ -13749,9 +13906,10 @@
 
          std::size_t size() const exprtk_override
          {
-            return std::min(
+            return std::min(vds().size(),
+               std::min(
                vec0_node_ptr_->vec_holder().size(),
-               vec1_node_ptr_->vec_holder().size());
+               vec1_node_ptr_->vec_holder().size()));
          }
 
          std::size_t base_size() const exprtk_override
@@ -13919,7 +14077,7 @@
 
          std::size_t size() const exprtk_override
          {
-            return vec0_node_ptr_->size();
+            return std::min(vec0_node_ptr_->size(), vds().size());
          }
 
          std::size_t base_size() const exprtk_override
@@ -14084,7 +14242,7 @@
 
          std::size_t size() const exprtk_override
          {
-            return vec1_node_ptr_->vec_holder().size();
+            return std::min(vec1_node_ptr_->size(), vds().size());
          }
 
          std::size_t base_size() const exprtk_override
@@ -14243,7 +14401,7 @@
 
          std::size_t size() const exprtk_override
          {
-            return vec0_node_ptr_->vec_holder().size();
+            return std::min(vds().size(),vec0_node_ptr_->vec_holder().size());
          }
 
          std::size_t base_size() const exprtk_override
@@ -14281,7 +14439,7 @@
          typedef vector_holder   <T>  vector_holder_t;
          typedef vector_holder_t*     vector_holder_ptr;
          typedef vec_data_store  <T>  vds_t;
-         typedef memory_context_t<T> memory_context;
+         typedef memory_context_t<T>  memory_context;
          typedef std::pair<expression_ptr,bool> branch_t;
 
          conditional_vector_node(expression_ptr condition,
@@ -14360,7 +14518,9 @@
                result_vec_size_ = alternative_node_ptr_->size();
             }
 
-            for (std::size_t i = 0; i < result_vec_size_; ++i)
+            const std::size_t copy_size = std::min(result_vec_size_, vds().size());
+
+            for (std::size_t i = 0; i < copy_size; ++i)
             {
                result_vector[i] = source_vector[i];
             }
@@ -14959,9 +15119,14 @@
             for (std::size_t i = 0; i < vv_list_.size(); ++i)
             {
                vecview_t& vv = vv_list_[i];
-               if (vv && typestore_list_[i].vec_data)
+               if (vv)
                {
-                  vv->remove_ref(&typestore_list_[i].vec_data);
+                  if (typestore_list_[i].vec_data)
+                  {
+                     vv->remove_ref(&typestore_list_[i].vec_data);
+                  }
+
+                  vv->remove_size_ref(&typestore_list_[i].size);
                   typestore_list_[i].vec_data = 0;
                }
             }
@@ -15001,6 +15166,12 @@
                   ts.size = vi->size();
                   ts.data = vi->vds().data();
                   ts.type = type_store_t::e_vector;
+                  ts.ivec = vi;
+
+                  if (expression_node<T>::e_vecondition == arg_list_[i]->type())
+                  {
+                     vec_size_refresh_list_.push_back(i);
+                  }
 
                   if (
                        vi->vec()->vec_holder().rebaseable() &&
@@ -15008,7 +15179,12 @@
                      )
                   {
                      vv_list_[i] = vi->vec()->vec_holder().rebaseable_instance();
-                     vv_list_[i]->set_ref(&ts.vec_data);
+                     vv_list_[i]->set_size_ref(&ts.size);
+
+                     if (!amalgamated_vecop(arg_list_[i]))
+                     {
+                        vv_list_[i]->set_ref(&ts.vec_data);
+                     }
                   }
                }
                #ifndef exprtk_disable_string_capabilities
@@ -15106,11 +15282,23 @@
 
          inline virtual bool populate_value_list() const
          {
+            assert(branch_.size() == typestore_list_.size());
+
             for (std::size_t i = 0; i < branch_.size(); ++i)
             {
                expr_as_vec1_store_[i] = branch_[i].first->value();
             }
 
+            if (!vec_size_refresh_list_.empty())
+            {
+               for (std::size_t i = 0; i < vec_size_refresh_list_.size(); ++i)
+               {
+                  const std::size_t index = vec_size_refresh_list_[i];
+                  type_store_t&     ts    = typestore_list_[index];
+                  ts.size = ts.ivec->size();
+               }
+            }
+
             if (!range_param_list_.empty())
             {
                assert(range_param_list_.size() <= branch_.size());
@@ -15131,7 +15319,7 @@
                      rdt.size;
                   #endif
 
-                  if (!rp(r0, r1, data_size))
+                  if (!rp(r0, r1, typename range_t::size_holder_t(data_size)))
                   {
                      return false;
                   }
@@ -15162,6 +15350,7 @@
          mutable tmp_vs_t            expr_as_vec1_store_;
          mutable range_list_t        range_list_;
          std::vector<std::size_t>    range_param_list_;
+         std::vector<std::size_t>    vec_size_refresh_list_;
       };
 
       #ifndef exprtk_disable_string_capabilities
@@ -15391,6 +15580,8 @@
          {
             if (gen_function_t::populate_value_list())
             {
+               prepare_typestore_list();
+
                typedef typename type_store<T>::parameter_list parameter_list_t;
 
                results_context_->
@@ -15414,6 +15605,19 @@
 
       private:
 
+         void prepare_typestore_list() const
+         {
+            for (std::size_t i = 0; i < gen_function_t::typestore_list_.size(); ++i)
+            {
+               typename gen_function_t::type_store_t& ts = gen_function_t::typestore_list_[i];
+
+               if (ts.ivec)
+               {
+                  ts.size = ts.ivec->size();
+               }
+            }
+         }
+
          results_context_t* results_context_;
       };
 
@@ -18427,8 +18631,8 @@
             std::size_t r0 = 0;
             std::size_t r1 = 0;
 
-            if (rp0_(r0, r1, s0_.size()))
-               return Operation::process(s0_.substr(r0, (r1 - r0) + 1), s1_);
+            if (rp0_(r0, r1, s0_))
+               return Operation::process(s0_.substr(r0, (r1 - r0)), s1_);
             else
                return T(0);
          }
@@ -18491,12 +18695,12 @@
             std::size_t r0 = 0;
             std::size_t r1 = 0;
 
-            if (rp1_(r0, r1, s1_.size()))
+            if (rp1_(r0, r1, s1_))
             {
                return Operation::process
                       (
                          s0_,
-                         s1_.substr(r0, (r1 - r0) + 1)
+                         s1_.substr(r0, (r1 - r0))
                       );
             }
             else
@@ -18566,14 +18770,14 @@
             std::size_t r1_1 = 0;
 
             if (
-                 rp0_(r0_0, r1_0, s0_.size()) &&
-                 rp1_(r0_1, r1_1, s1_.size())
+                 rp0_(r0_0, r1_0, s0_) &&
+                 rp1_(r0_1, r1_1, s1_)
                )
             {
                return Operation::process
                       (
-                         s0_.substr(r0_0, (r1_0 - r0_0) + 1),
-                         s1_.substr(r0_1, (r1_1 - r0_1) + 1)
+                         s0_.substr(r0_0, (r1_0 - r0_0)),
+                         s1_.substr(r0_1, (r1_1 - r0_1))
                       );
             }
             else
@@ -18691,8 +18895,8 @@
             const range_t& range1 = (*str1_range_ptr_);
 
             if (
-                 range0(str0_r0, str0_r1, str0_base_ptr_->size()) &&
-                 range1(str1_r0, str1_r1, str1_base_ptr_->size())
+                 range0(str0_r0, str0_r1, *str0_base_ptr_) &&
+                 range1(str1_r0, str1_r1, *str1_base_ptr_)
                )
             {
                return Operation::process
@@ -19813,6 +20017,32 @@
 
       std::string parameter_sequence;
       return_type rtrn_type;
+
+      static inline std::string generate_prefix_args(const std::string& prefix_args, std::size_t start = 0, std::size_t end = 10)
+      {
+         std::string result;
+
+         for (std::size_t i = start; i <= end; ++i)
+         {
+            result += prefix_args + std::string(i,'?');
+            result += (i != end) ? "|" : "";
+         }
+
+         return result;
+      }
+
+      static inline std::string generate_suffix_args(const std::string& suffix_args, std::size_t start = 0, std::size_t end = 10)
+      {
+         std::string result;
+
+         for (std::size_t i = start; i <= end; ++i)
+         {
+            result += std::string(i,'?') + suffix_args;
+            result += (i != end) ? "|" : "";
+         }
+
+         return result;
+      }
    };
 
    #ifndef exprtk_disable_string_capabilities
@@ -19936,7 +20166,7 @@
          ff04_functor f;
       };
 
-      struct freefunc05 : public exprtk::ifunction<T>
+      struct freefunc05 exprtk_final : public exprtk::ifunction<T>
       {
          using exprtk::ifunction<T>::operator();
 
@@ -20362,10 +20592,10 @@
          {
             struct init_type
             {
-               static inline double set(double)           { return (0.0);           }
-               static inline double set(long double)      { return (0.0);           }
-               static inline float  set(float)            { return (0.0f);          }
-               static inline std::string set(std::string) { return std::string(""); }
+               static inline double set(double)            { return (0.0);           }
+               static inline double set(long double)       { return (0.0);           }
+               static inline float  set(float)             { return (0.0f);          }
+               static inline std::string set(std::string&) { return std::string(""); }
             };
 
             static RawType null_type = init_type::set(RawType());
@@ -21882,7 +22112,11 @@
 
       inline bool return_invoked() const
       {
-         return (*control_block_->return_invoked);
+         assert(control_block_);
+
+         return control_block_                 &&
+                control_block_->return_invoked &&
+                (*control_block_->return_invoked);
       }
 
    private:
@@ -24063,7 +24297,7 @@
 
          bool arithmetic_enabled(const details::operator_type& arithmetic_operation) const
          {
-            if (disabled_logic_set_.empty())
+            if (disabled_arithmetic_set_.empty())
                return true;
             else
                return disabled_arithmetic_set_.end() == disabled_arithmetic_set_
@@ -24704,6 +24938,7 @@
             dec_.clear    ();
             sem_.cleanup  ();
             return_cleanup();
+            expr = expression_t();
 
             return false;
          }
@@ -25180,7 +25415,7 @@
          inline void set(const precedence_level& l,
                          const precedence_level& r,
                          const details::operator_type& o,
-                         const token_t tkn = token_t())
+                         const token_t& tkn = token_t())
          {
             left      = l;
             right     = r;
@@ -27375,6 +27610,8 @@
                   "ERR101 - Expected ':' for case of [*] statement",
                   exprtk_error_location));
 
+               free_node(node_allocator_, condition);
+
                return error_node();
             }
 
@@ -27384,7 +27621,10 @@
                parse_expression();
 
             if (0 == consequent)
+            {
+               free_node(node_allocator_, condition);
                return error_node();
+            }
 
             if (!token_is(token_t::e_eof))
             {
@@ -27394,6 +27634,9 @@
                   "ERR102 - Expected ';' at end of case for [*] statement",
                   exprtk_error_location));
 
+               free_node(node_allocator_, condition );
+               free_node(node_allocator_, consequent);
+
                return error_node();
             }
 
@@ -27998,7 +28241,7 @@
 
             try
             {
-               rp_result = rp(r0, r1);
+               rp_result = rp(r0, r1, typename range_t::size_holder_t());
             }
             catch (std::runtime_error&)
             {}
@@ -28164,13 +28407,13 @@
 
             if (rp.n1_c.first && (rp.n1_c.second == std::numeric_limits<std::size_t>::max()))
             {
-               rp.n1_c.second  = const_str.size() - 1;
+               rp.n1_c.second  = const_str.size();
                rp.cache.second = rp.n1_c.second;
             }
 
             if (
                  (rp.n0_c.first && (rp.n0_c.second >= const_str.size())) ||
-                 (rp.n1_c.first && (rp.n1_c.second >= const_str.size()))
+                 (rp.n1_c.first && (rp.n1_c.second >  const_str.size()))
                )
             {
                set_error(make_error(
@@ -28305,8 +28548,8 @@
          return error_node();
       }
 
-      inline expression_node_ptr synthesize_vector_element(const std::string& vector_name,
-                                                           vector_holder_ptr vec,
+      inline expression_node_ptr synthesize_vector_element(const std::string&  vector_name,
+                                                           vector_holder_ptr   vec,
                                                            expression_node_ptr vec_node,
                                                            expression_node_ptr index_expr)
       {
@@ -30960,7 +31203,11 @@
             }
 
             if (!post_variable_process(symbol))
+            {
+               free_node(node_allocator_, result_variable);
+
                return error_node();
+            }
 
             lodge_symbol(symbol, e_st_variable);
 
@@ -31216,7 +31463,10 @@
                            lodge_symbol(symbol, e_st_variable);
 
                            if (!post_variable_process(symbol))
+                           {
+                              free_node(node_allocator_, var);
                               return error_node();
+                           }
 
                            next_token();
 
@@ -31892,10 +32142,26 @@
             }
             else if (details::is_break_node(branch[0]))
             {
+               parser_->set_error(parser_error::make_error(
+                  parser_error::e_syntax,
+                  parser_->current_state().token,
+                  "ERR249 - Invalid use of break statement",
+                  exprtk_error_location));
+
+               parser_->node_allocator_.free(branch[0]);
+
                return error_node();
             }
             else if (details::is_continue_node(branch[0]))
             {
+               parser_->set_error(parser_error::make_error(
+                  parser_error::e_syntax,
+                  parser_->current_state().token,
+                  "ERR250 - Invalid use of continue statement",
+                  exprtk_error_location));
+
+               parser_->node_allocator_.free(branch[0]);
+
                return error_node();
             }
             else if (details::is_constant_node(branch[0]))
@@ -32333,40 +32599,48 @@
          {
             if ((0 == branch[0]) || (0 == branch[1]))
             {
+               details::free_all_nodes(*node_allocator_, branch);
+
                parser_->set_error(parser_error::make_error(
                   parser_error::e_syntax,
                   parser_->current_state().token,
-                  "ERR249 - Invalid branches received for operator '" + details::to_str(operation) + "'",
+                  "ERR251 - Invalid branches received for operator '" + details::to_str(operation) + "'",
                   exprtk_error_location));
 
                return error_node();
             }
             else if (is_invalid_string_op(operation,branch))
             {
+               details::free_all_nodes(*node_allocator_, branch);
+
                parser_->set_error(parser_error::make_error(
                   parser_error::e_syntax,
                   parser_->current_state().token,
-                  "ERR250 - Invalid branch pair for string operator '" + details::to_str(operation) + "'",
+                  "ERR252 - Invalid branch pair for string operator '" + details::to_str(operation) + "'",
                   exprtk_error_location));
 
                return error_node();
             }
             else if (is_invalid_assignment_op(operation,branch))
             {
+               details::free_all_nodes(*node_allocator_, branch);
+
                parser_->set_error(parser_error::make_error(
                   parser_error::e_syntax,
                   parser_->current_state().token,
-                  "ERR251 - Invalid branch pair for assignment operator '" + details::to_str(operation) + "'",
+                  "ERR253 - Invalid branch pair for assignment operator '" + details::to_str(operation) + "'",
                   exprtk_error_location));
 
                return error_node();
             }
             else if (is_invalid_break_continue_op(branch))
             {
+               details::free_all_nodes(*node_allocator_, branch);
+
                parser_->set_error(parser_error::make_error(
                   parser_error::e_syntax,
                   parser_->current_state().token,
-                  "ERR252 - Invalid branch pair for break/continue operator '" + details::to_str(operation) + "'",
+                  "ERR254 - Invalid branch pair for break/continue operator '" + details::to_str(operation) + "'",
                   exprtk_error_location));
 
                return error_node();
@@ -32490,17 +32764,19 @@
                parser_->set_error(parser_error::make_error(
                   parser_error::e_syntax,
                   parser_->current_state().token,
-                  "ERR253 - Invalid branches operator '" + details::to_str(operation) + "'",
+                  "ERR255 - Invalid branches operator '" + details::to_str(operation) + "'",
                   exprtk_error_location));
 
                return error_node();
             }
             else if (is_invalid_string_op(operation, branch))
             {
+               details::free_all_nodes(*node_allocator_,branch);
+
                parser_->set_error(parser_error::make_error(
                   parser_error::e_syntax,
                   parser_->current_state().token,
-                  "ERR254 - Invalid branches for string operator '" + details::to_str(operation) + "'",
+                  "ERR256 - Invalid branches for string operator '" + details::to_str(operation) + "'",
                   exprtk_error_location));
 
                return error_node();
@@ -32556,7 +32832,7 @@
                parser_->set_error(parser_error::make_error(
                   parser_error::e_parser,
                   parser_->current_state().token,
-                  "ERR255 - Invalid " + invalid_branches + " for conditional statement",
+                  "ERR257 - Invalid " + invalid_branches + " for conditional statement",
                   exprtk_error_location));
 
                return error_node();
@@ -32607,7 +32883,7 @@
             parser_->set_error(parser_error::make_error(
                parser_error::e_parser,
                token_t(),
-               "ERR256 - Failed to synthesize node: " + node_name,
+               "ERR258 - Failed to synthesize node: " + node_name,
                exprtk_error_location));
 
             details::free_node(*node_allocator_, result);
@@ -32632,7 +32908,7 @@
                parser_->set_error(parser_error::make_error(
                   parser_error::e_parser,
                   parser_->current_state().token,
-                  "ERR257 - Invalid " + invalid_branches + " for string conditional statement",
+                  "ERR259 - Invalid " + invalid_branches + " for string conditional statement",
                   exprtk_error_location));
 
                return error_node();
@@ -32674,7 +32950,7 @@
                parser_->set_error(parser_error::make_error(
                   parser_error::e_parser,
                   token_t(),
-                  "ERR258 - Failed to synthesize node: conditional_string_node_t",
+                  "ERR260 - Failed to synthesize node: conditional_string_node_t",
                   exprtk_error_location));
 
                details::free_node(*node_allocator_, result);
@@ -32708,7 +32984,7 @@
                parser_->set_error(parser_error::make_error(
                   parser_error::e_parser,
                   parser_->current_state().token,
-                  "ERR259 - Invalid " + invalid_branches + " for vector conditional statement",
+                  "ERR261 - Invalid " + invalid_branches + " for vector conditional statement",
                   exprtk_error_location));
 
                return error_node();
@@ -32782,7 +33058,7 @@
                   parser_->set_error(parser_error::make_error(
                      parser_error::e_parser,
                      parser_->current_state().token,
-                     "ERR260 - Infinite loop condition without 'break' or 'return' not allowed in while-loops",
+                     "ERR262 - Infinite loop condition without 'break' or 'return' not allowed in while-loops",
                      exprtk_error_location));
 
                   result = error_node();
@@ -32903,7 +33179,7 @@
                   parser_->set_error(parser_error::make_error(
                      parser_error::e_parser,
                      parser_->current_state().token,
-                     "ERR261 - Infinite loop condition without 'break' or 'return' not allowed in for-loop",
+                     "ERR263 - Infinite loop condition without 'break' or 'return' not allowed in for-loop",
                      exprtk_error_location));
 
                   result = error_node();
@@ -33654,7 +33930,7 @@
                parser_->set_error(parser_error::make_error(
                   parser_error::e_synthesis,
                   token_t(),
-                  "ERR262 - Failed to synthesize node: str_vararg_node<vararg_multi_op>",
+                  "ERR264 - Failed to synthesize node: str_vararg_node<vararg_multi_op>",
                   exprtk_error_location));
 
                details::free_node(*node_allocator_, result);
@@ -33691,7 +33967,7 @@
                parser_->set_error(parser_error::make_error(
                   parser_error::e_synthesis,
                   token_t(),
-                  "ERR263 - Failed to synthesize node: vararg_node",
+                  "ERR265 - Failed to synthesize node: vararg_node",
                   exprtk_error_location));
 
                details::free_node(*node_allocator_, result);
@@ -33746,7 +34022,7 @@
                parser_->set_error(parser_error::make_error(
                   parser_error::e_synthesis,
                   token_t(),
-                  "ERR264 - Failed to synthesize node: function_N_node_t",
+                  "ERR266 - Failed to synthesize node: function_N_node_t",
                   exprtk_error_location));
 
                details::free_node(*node_allocator_, result);
@@ -33795,7 +34071,7 @@
             parser_->set_error(parser_error::make_error(
                parser_error::e_synthesis,
                token_t(),
-               "ERR265 - Failed to synthesize node: vararg_function_node<ivararg_function_t>",
+               "ERR267 - Failed to synthesize node: vararg_function_node<ivararg_function_t>",
                exprtk_error_location));
 
             details::free_node(*node_allocator_, result);
@@ -33861,7 +34137,7 @@
                parser_->set_error(parser_error::make_error(
                   parser_error::e_synthesis,
                   token_t(),
-                  "ERR266 - Failed to synthesize node: " + node_name,
+                  "ERR268 - Failed to synthesize node: " + node_name,
                   exprtk_error_location));
 
                details::free_node(*node_allocator_, result);
@@ -33935,7 +34211,7 @@
                parser_->set_error(parser_error::make_error(
                   parser_error::e_synthesis,
                   token_t(),
-                  "ERR267 - Failed to synthesize node: " + node_name,
+                  "ERR269 - Failed to synthesize node: " + node_name,
                   exprtk_error_location));
 
                details::free_node(*node_allocator_, result);
@@ -33980,7 +34256,7 @@
                parser_->set_error(parser_error::make_error(
                   parser_error::e_synthesis,
                   token_t(),
-                  "ERR268 - Failed to synthesize node: return_node",
+                  "ERR270 - Failed to synthesize node: return_node",
                   exprtk_error_location));
 
                details::free_node(*node_allocator_, result);
@@ -34041,7 +34317,7 @@
                   parser_->set_error(parser_error::make_error(
                      parser_error::e_parser,
                      token_t(),
-                     "ERR269 - Index of " + details::to_str(vec_index) + " out of range for "
+                     "ERR271 - Index of " + details::to_str(vec_index) + " out of range for "
                      "vector '" + symbol + "' of size " + details::to_str(vector_base->size()),
                      exprtk_error_location));
 
@@ -34070,7 +34346,7 @@
                   parser_->set_error(parser_error::make_error(
                      parser_error::e_synthesis,
                      token_t(),
-                     "ERR270 - Failed to synthesize node: " + node_name + " for vector: " + symbol,
+                     "ERR272 - Failed to synthesize node: " + node_name + " for vector: " + symbol,
                      exprtk_error_location));
 
                   details::free_node(*node_allocator_, result);
@@ -34096,7 +34372,7 @@
                   parser_->set_error(parser_error::make_error(
                      parser_error::e_synthesis,
                      token_t(),
-                     "ERR271 - Failed to synthesize node: " + node_name + " for vector: " + symbol,
+                     "ERR273 - Failed to synthesize node: " + node_name + " for vector: " + symbol,
                      exprtk_error_location));
 
                   details::free_node(*node_allocator_, result);
@@ -34177,7 +34453,7 @@
             parser_->set_error(parser_error::make_error(
                parser_error::e_synthesis,
                token_t(),
-               "ERR272 - Failed to synthesize node: " + node_name,
+               "ERR274 - Failed to synthesize node: " + node_name,
                exprtk_error_location));
 
             details::free_node(*node_allocator_, result);
@@ -34276,28 +34552,28 @@
                      return reinterpret_cast<const void*>(&static_cast<variable_node_t*>(node)->ref());
 
                   case details::expression_node<T>::e_vecelem:
-                     return reinterpret_cast<const void*>(&static_cast<vector_elem_node_t*>(node)->ref());
+                     return reinterpret_cast<const void*>(static_cast<vector_elem_node_t*>(node)->vec_holder().data());
 
                   case details::expression_node<T>::e_veccelem:
-                     return reinterpret_cast<const void*>(&static_cast<vector_celem_node_t*>(node)->ref());
+                     return reinterpret_cast<const void*>(static_cast<vector_celem_node_t*>(node)->vec_holder().data());
 
                   case details::expression_node<T>::e_vecelemrtc:
-                     return reinterpret_cast<const void*>(&static_cast<vector_elem_rtc_node_t*>(node)->ref());
+                     return reinterpret_cast<const void*>(static_cast<vector_elem_rtc_node_t*>(node)->vec_holder().data());
 
                   case details::expression_node<T>::e_veccelemrtc:
-                     return reinterpret_cast<const void*>(&static_cast<vector_celem_rtc_node_t*>(node)->ref());
+                     return reinterpret_cast<const void*>(static_cast<vector_celem_rtc_node_t*>(node)->vec_holder().data());
 
                   case details::expression_node<T>::e_rbvecelem:
-                     return reinterpret_cast<const void*>(&static_cast<rebasevector_elem_node_t*>(node)->ref());
+                     return reinterpret_cast<const void*>(static_cast<rebasevector_elem_node_t*>(node)->vec_holder().data());
 
                   case details::expression_node<T>::e_rbvecelemrtc:
-                     return reinterpret_cast<const void*>(&static_cast<rebasevector_elem_rtc_node_t*>(node)->ref());
+                     return reinterpret_cast<const void*>(static_cast<rebasevector_elem_rtc_node_t*>(node)->vec_holder().data());
 
                   case details::expression_node<T>::e_rbveccelem:
-                     return reinterpret_cast<const void*>(&static_cast<rebasevector_celem_node_t*>(node)->ref());
+                     return reinterpret_cast<const void*>(static_cast<rebasevector_celem_node_t*>(node)->vec_holder().data());
 
                   case details::expression_node<T>::e_rbveccelemrtc:
-                     return reinterpret_cast<const void*>(&static_cast<rebasevector_celem_rtc_node_t*>(node)->ref());
+                     return reinterpret_cast<const void*>(static_cast<rebasevector_celem_rtc_node_t*>(node)->vec_holder().data());
 
                   case details::expression_node<T>::e_vector:
                      return reinterpret_cast<const void*>(static_cast<vector_node_t*>(node)->vec_holder().data());
@@ -34333,7 +34609,7 @@
                   parser_->set_error(parser_error::make_error(
                      parser_error::e_parser,
                      token,
-                     "ERR273 - Symbol '" + token.value + "' cannot be assigned-to as it is immutable.",
+                     "ERR275 - Symbol '" + token.value + "' cannot be assigned-to as it is immutable.",
                      exprtk_error_location));
                }
                else
@@ -34407,7 +34683,7 @@
                parser_->set_error(parser_error::make_error(
                   parser_error::e_syntax,
                   parser_->current_state().token,
-                  "ERR274 - Cannot assign value to const variable",
+                  "ERR276 - Cannot assign value to const variable",
                   exprtk_error_location));
 
                return error_node();
@@ -34417,7 +34693,7 @@
                parser_->set_error(parser_error::make_error(
                   parser_error::e_syntax,
                   parser_->current_state().token,
-                  "ERR275 - Invalid branches for assignment operator '" + details::to_str(operation) + "'",
+                  "ERR277 - Invalid branches for assignment operator '" + details::to_str(operation) + "'",
                   exprtk_error_location));
 
                return error_node();
@@ -34675,7 +34951,7 @@
                parser_->set_error(parser_error::make_error(
                   parser_error::e_syntax,
                   parser_->current_state().token,
-                  "ERR276 - Invalid branches for assignment operator '" + details::to_str(operation) + "'",
+                  "ERR278 - Invalid branches for assignment operator '" + details::to_str(operation) + "'",
                   exprtk_error_location));
 
                return error_node();
@@ -34689,7 +34965,7 @@
             parser_->set_error(parser_error::make_error(
                parser_error::e_synthesis,
                token_t(),
-               "ERR277 - Failed to synthesize node: " + node_name,
+               "ERR279 - Failed to synthesize node: " + node_name,
                exprtk_error_location));
 
             details::free_node(*node_allocator_, result);
@@ -34779,7 +35055,7 @@
             parser_->set_error(parser_error::make_error(
                parser_error::e_synthesis,
                token_t(),
-               "ERR278 - Failed to synthesize node: " + node_name,
+               "ERR280 - Failed to synthesize node: " + node_name,
                exprtk_error_location));
 
             details::free_node(*node_allocator_, result);
@@ -34865,7 +35141,7 @@
             parser_->set_error(parser_error::make_error(
                parser_error::e_synthesis,
                token_t(),
-               "ERR279 - Failed to synthesize node: " + node_name,
+               "ERR281 - Failed to synthesize node: " + node_name,
                exprtk_error_location));
 
             details::free_node(*node_allocator_, result);
@@ -34948,7 +35224,7 @@
             parser_->set_error(parser_error::make_error(
                parser_error::e_synthesis,
                token_t(),
-               "ERR280 - Failed to synthesize node: " + node_name,
+               "ERR282 - Failed to synthesize node: " + node_name,
                exprtk_error_location));
 
             details::free_node(*node_allocator_, result);
@@ -41447,7 +41723,10 @@
                return node_allocator_->allocate_type<inrange_t, std::string, std::string&, std::string&>(s0, s1, s2);
             }
             else
+            {
+               details::free_all_nodes(*node_allocator_,branch);
                return error_node();
+            }
          }
          #else
          inline expression_node_ptr synthesize_string_expression(const details::operator_type&, expression_node_ptr (&branch)[3])
@@ -41593,7 +41872,7 @@
                parser_->set_error(parser_error::make_error(
                   parser_error::e_parser,
                   token_t(),
-                  "ERR281 - Failed to synthesize node: NodeType",
+                  "ERR283 - Failed to synthesize node: NodeType",
                   exprtk_error_location));
 
                details::free_node(*node_allocator_, expression_point);
@@ -41751,6 +42030,7 @@
          register_unary_op(details::e_acosh , details::acosh_op)
          register_unary_op(details::e_asin  , details::asin_op )
          register_unary_op(details::e_asinh , details::asinh_op)
+         register_unary_op(details::e_atan  , details::atan_op )
          register_unary_op(details::e_atanh , details::atanh_op)
          register_unary_op(details::e_ceil  , details::ceil_op )
          register_unary_op(details::e_cos   , details::cos_op  )
@@ -41898,7 +42178,7 @@
          register_sf4ext(24) register_sf4ext(25) register_sf4ext(26) register_sf4ext(27)
          register_sf4ext(28) register_sf4ext(29) register_sf4ext(30) register_sf4ext(31)
          register_sf4ext(32) register_sf4ext(33) register_sf4ext(34) register_sf4ext(35)
-         register_sf4ext(36) register_sf4ext(36) register_sf4ext(38) register_sf4ext(39)
+         register_sf4ext(36) register_sf4ext(37) register_sf4ext(38) register_sf4ext(39)
          register_sf4ext(40) register_sf4ext(41) register_sf4ext(42) register_sf4ext(43)
          register_sf4ext(44) register_sf4ext(45) register_sf4ext(46) register_sf4ext(47)
          register_sf4ext(48) register_sf4ext(49) register_sf4ext(50) register_sf4ext(51)
@@ -41939,7 +42219,7 @@
          {
             set_error(make_error(
                parser_error::e_parser,
-               "ERR282 - Max local vector size of " + details::to_str(max_local_vector_size_bytes) + " bytes "
+               "ERR284 - Max local vector size of " + details::to_str(max_local_vector_size_bytes) + " bytes "
                "is larger than max total local symbol size of " + details::to_str(settings_.max_total_local_symbol_size_bytes()) + " bytes",
                exprtk_error_location));
 
@@ -43575,7 +43855,7 @@
                parser_error::make_error(
                   parser_error::e_parser,
                   lexer::token(),
-                  "ERR283 - Function '" + name + "' is an invalid overload",
+                  "ERR285 - Function '" + name + "' is an invalid overload",
                   exprtk_error_location);
 
             error_list_.push_back(error);
@@ -44268,7 +44548,7 @@
          #ifdef _MSC_VER
          #pragma warning(pop)
          #endif
-         assert(sizeof(T) <= sizeof(void*));
+         assert(sizeof(T) >= sizeof(void*));
       }
 
    } // namespace exprtk::rtl::io::file::details
@@ -44562,6 +44842,17 @@
             return false;
       }
 
+      template <typename Vector>
+      inline bool invalid_shift(const Vector& v, const std::size_t& r1, const std::size_t& s)
+      {
+         return s >= (v.size() - r1);
+      }
+
+      inline bool invalid_stride(const std::size_t& stride)
+      {
+         return 0 == stride;
+      }
+
       template <typename T>
       struct load_vector_range
       {
@@ -45333,6 +45624,13 @@
             return std::numeric_limits<T>::quiet_NaN();
          }
 
+         const std::size_t dist = r1 - r0 + 1;
+
+         if (n > dist)
+         {
+            return T(0);
+         }
+
          std::nth_element(
             vec.begin() + r0,
             vec.begin() + r0 + n ,
@@ -45374,6 +45672,11 @@
          const std::size_t step_size = (2 != ps_index) ? 1 :
                                        static_cast<std::size_t>(scalar_t(parameters.back())());
 
+         if (helper::invalid_stride(step_size))
+         {
+            return T(0);
+         }
+
          std::size_t r0 = 0;
          std::size_t r1 = vec.size() - 1;
 
@@ -45484,6 +45787,11 @@
          const std::size_t stride = (2 != ps_index) ? 1 :
                                     static_cast<std::size_t>(scalar_t(parameters[3])());
 
+         if (helper::invalid_stride(stride))
+         {
+            return std::numeric_limits<T>::quiet_NaN();
+         }
+
          std::size_t r0 = 0;
          std::size_t r1 = vec.size() - 1;
 
@@ -45744,6 +46052,11 @@
 
          const std::size_t s = static_cast<std::size_t>(scalar_t(parameters[3])());
 
+         if (helper::invalid_shift(y, r1, s))
+         {
+            return std::numeric_limits<T>::quiet_NaN();
+         }
+
          for (std::size_t i = r0; i <= r1; ++i)
          {
             y[i] = (a * x[i]) + (b * y[i + s]);
@@ -45797,6 +46110,11 @@
 
          const std::size_t s = static_cast<std::size_t>(scalar_t(parameters[3])());
 
+         if (helper::invalid_shift(y, r1, s))
+         {
+            return std::numeric_limits<T>::quiet_NaN();
+         }
+
          for (std::size_t i = r0; i <= r1; ++i)
          {
             z[i] = (a * x[i]) + (b * y[i + s]);
@@ -46114,6 +46432,196 @@
    };
 
    template <typename T>
+   class min_elemwise exprtk_final : public exprtk::igeneric_function<T>
+   {
+   public:
+
+      typedef typename exprtk::igeneric_function<T> igfun_t;
+      typedef typename igfun_t::parameter_list_t    parameter_list_t;
+      typedef typename igfun_t::generic_type        generic_type;
+      typedef typename generic_type::scalar_view    scalar_t;
+      typedef typename generic_type::vector_view    vector_t;
+
+      using igfun_t::operator();
+
+      min_elemwise()
+      : exprtk::igeneric_function<T>("VT|VVT|VTTT|VVTTT")
+      /*
+         Overloads:
+         0. VT    - vector, T
+         0. VVT   - vector, vector, T
+         0. VTTT  - vector, r0, r1, T
+         0. VVTTT - vector, vector, r0, r1, T
+      */
+      {}
+
+      inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) exprtk_override
+      {
+         std::size_t out_vec_index = 0;
+         std::size_t in_vec_index  = (ps_index & 1) ? 1 : 0;
+         std::size_t scalar_index  = parameters.size() - 1;
+
+         vector_t out_vec(parameters[out_vec_index]);
+         vector_t in_vec (parameters[in_vec_index ]);
+
+         const T s = scalar_t(parameters[scalar_index ])();
+
+         std::size_t r0 = 0;
+         std::size_t r1 = in_vec.size() - 1;
+
+         if ((2 == ps_index) || (3 == ps_index))
+         {
+            std::size_t rng_idx0 = 0;
+            std::size_t rng_idx1 = 0;
+
+            switch (ps_index)
+            {
+               case 2 : { rng_idx0 = 1; rng_idx1 = 2; }; break;
+               case 3 : { rng_idx0 = 2; rng_idx1 = 3; }; break;
+            }
+
+            if (!helper::load_vector_range<T>::process(parameters, r0, r1, rng_idx0, rng_idx1, 0))
+            {
+               return T(0);
+            }
+         }
+
+         r1 = std::min(r1, std::min(out_vec.size(), in_vec.size()) - 1);
+
+         for (std::size_t i = r0; i <= r1; ++i)
+         {
+            out_vec[i] = exprtk::details::numeric::min(in_vec[i], s);
+         }
+
+         return T(1);
+      }
+   };
+
+   template <typename T>
+   class max_elemwise exprtk_final : public exprtk::igeneric_function<T>
+   {
+   public:
+
+      typedef typename exprtk::igeneric_function<T> igfun_t;
+      typedef typename igfun_t::parameter_list_t    parameter_list_t;
+      typedef typename igfun_t::generic_type        generic_type;
+      typedef typename generic_type::scalar_view    scalar_t;
+      typedef typename generic_type::vector_view    vector_t;
+
+      using igfun_t::operator();
+
+      max_elemwise()
+      : exprtk::igeneric_function<T>("VT|VVT|VTTT|VVTTT")
+      /*
+         Overloads:
+         0. VT    - vector, T
+         1. VVT   - vector, vector, T
+         2. VTTT  - vector, r0, r1, T
+         3. VVTTT - vector, vector, r0, r1, T
+      */
+      {}
+
+      inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) exprtk_override
+      {
+         std::size_t out_vec_index = 0;
+         std::size_t in_vec_index  = (ps_index & 1) ? 1 : 0;
+         std::size_t scalar_index  = parameters.size() - 1;
+
+         vector_t out_vec(parameters[out_vec_index]);
+         vector_t in_vec (parameters[in_vec_index ]);
+
+         const T s = scalar_t(parameters[scalar_index ])();
+
+         std::size_t r0 = 0;
+         std::size_t r1 = in_vec.size() - 1;
+
+         if ((2 == ps_index) || (3 == ps_index))
+         {
+            std::size_t rng_idx0 = 0;
+            std::size_t rng_idx1 = 0;
+
+            switch (ps_index)
+            {
+               case 2 : { rng_idx0 = 1; rng_idx1 = 2; }; break;
+               case 3 : { rng_idx0 = 2; rng_idx1 = 3; }; break;
+            }
+
+            if (!helper::load_vector_range<T>::process(parameters, r0, r1, rng_idx0, rng_idx1, 0))
+            {
+               return T(0);
+            }
+         }
+
+         r1 = std::min(r1, std::min(out_vec.size(), in_vec.size()) - 1);
+
+         for (std::size_t i = r0; i <= r1; ++i)
+         {
+            out_vec[i] = exprtk::details::numeric::max(in_vec[i], s);
+         }
+
+         return T(1);
+      }
+   };
+
+   template <typename T>
+   class select exprtk_final : public exprtk::igeneric_function<T>
+   {
+   public:
+
+      typedef typename exprtk::igeneric_function<T> igfun_t;
+      typedef typename igfun_t::parameter_list_t    parameter_list_t;
+      typedef typename igfun_t::generic_type        generic_type;
+      typedef typename generic_type::vector_view    vector_t;
+
+      using igfun_t::operator();
+
+      select()
+      : exprtk::igeneric_function<T>("VVVV|VVVVTT")
+      /*
+         Overloads:
+         0. VVVV  - out vector, mask, vector 0, vector 1
+         1. VVVV  - out vector, mask, vector 0, vector 1, r0, r1
+      */
+      {}
+
+      inline T operator() (const std::size_t& ps_index, parameter_list_t parameters) exprtk_override
+      {
+               vector_t out (parameters[0]);
+         const vector_t mask(parameters[1]);
+         const vector_t vec0(parameters[2]);
+         const vector_t vec1(parameters[3]);
+
+         std::size_t r0 = 0;
+         std::size_t r1 = std::min(out.size(),
+                          std::min(mask.size(),
+                          std::min(vec0.size(), vec1.size()))) - 1;
+
+         if (1 == ps_index)
+         {
+            std::size_t rng_idx0 = 4;
+            std::size_t rng_idx1 = 5;
+
+            if (!helper::load_vector_range<T>::process(parameters, r0, r1, rng_idx0, rng_idx1, 0))
+            {
+               return T(0);
+            }
+
+            if (helper::invalid_range(out , r0, r1)) return T(0);
+            if (helper::invalid_range(mask, r0, r1)) return T(0);
+            if (helper::invalid_range(vec0, r0, r1)) return T(0);
+            if (helper::invalid_range(vec1, r0, r1)) return T(0);
+         }
+
+         for (std::size_t i = r0; i <= r1; ++i)
+         {
+            out[i] = (mask[i] != T(0)) ? vec0[i] : vec1[i];
+         }
+
+         return T(1);
+      }
+   };
+
+   template <typename T>
    struct package
    {
       all_true       <T> at;
@@ -46144,6 +46652,9 @@
       dotk           <T> dtk;
       threshold_above<T> ta;
       threshold_below<T> tb;
+      min_elemwise<T>    miew;
+      max_elemwise<T>    maew;
+      select<T>          slct;
 
       bool register_package(exprtk::symbol_table<T>& symtab)
       {
@@ -46186,6 +46697,10 @@
          exprtk_register_function("dotk"            , dtk       )
          exprtk_register_function("threshold_above" , ta        )
          exprtk_register_function("threshold_below" , tb        )
+         exprtk_register_function("min_elemwise"    , miew      )
+         exprtk_register_function("max_elemwise"    , maew      )
+         exprtk_register_function("select"          , slct      )
+
          #undef exprtk_register_function
 
          return true;
@@ -46204,11 +46719,11 @@
       using ::exprtk::details::char_cptr;
 
       static char_cptr library = "Mathematical Expression Toolkit";
-      static char_cptr version = "2.718281828459045235360287471352662497757"
-                                 "24709369995957496696762772407663035354759"
-                                 "45713821785251664274274663919320030599218"
-                                 "17413596629043572900334295260595630738132";
-      static char_cptr date    = "20240101";
+      static char_cptr version = "2.71828182845904523536028747135266249775724"
+                                 "7093699959574966967627724076630353547594571"
+                                 "3821785251664274274663919320030599218174135"
+                                 "9662904357290033429526059563073813232862794";
+      static char_cptr date    = "20250101";
       static char_cptr min_cpp = "199711L";
 
       static inline std::string data()
diff --git a/exprtk_benchmark.cpp b/exprtk_benchmark.cpp
index c989954..31ee6db 100644
--- a/exprtk_benchmark.cpp
+++ b/exprtk_benchmark.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * ExprTk vs Native Benchmarks                                *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
@@ -404,7 +404,6 @@
 
    std::string buffer;
    buffer.reserve(1024);
-   std::size_t line_count = 0;
 
    while (std::getline(stream,buffer))
    {
@@ -413,11 +412,10 @@
       else if ('#' == buffer[0])
          continue;
 
-      ++line_count;
       expression_list.push_back(buffer);
    }
 
-   return line_count;
+   return expression_list.size();
 }
 
 void perform_file_based_benchmark(const std::string& file_name, const std::size_t& rounds)
diff --git a/exprtk_functional_test.txt b/exprtk_functional_test.txt
index 2bb2a91..fecc608 100644
--- a/exprtk_functional_test.txt
+++ b/exprtk_functional_test.txt
@@ -9267,57 +9267,86 @@
 equal('abc'       ilike 'xyzw'  ,false)
 equal('abcd'      ilike 'ab?'   ,false)
 equal('abcd'      ilike 'a?'    ,false)
-equal(true, ~{var xx := 'abcdefgh'; xx[1:4]     == 'bcde'     })
-equal(true, ~{var xx := 'abcdefgh'; xx[ :8 / 2] == 'abcde'    })
-equal(true, ~{var xx := 'abcdefgh'; xx[ :4]     == 'abcde'    })
-equal(true, ~{var xx := 'abcdefgh'; xx[ :4]     == xx[:8 / 2] })
-equal(true, ~{var xx := 'abcdefgh'; xx[2 + 1: ] =='defgh'     })
-equal(true, ~{var xx := 'abcdefgh'; xx[ : ]     == 'abcdefgh' })
-equal(true, ~{var xx := 'abcdefgh'; xx[:]       == 'abcdefgh' })
-equal(true, ~{var xx := 'abcdefgh'; xx[4/2:3+1] == 'cde'      })
-equal(true, ~{var xx := 'abcdefgh'; xx[2:4]     == 'cde'      })
-equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]-1] == 'abcdefgh'})
-equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]-2] == 'abcdefg' })
-equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]-3] == 'abcdef'  })
-equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]-4] == 'abcde'   })
-equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]-5] == 'abcd'    })
-equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]-6] == 'abc'     })
-equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]-7] == 'ab'      })
-equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]-8] == 'a'       })
-equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]  ] == 'abcdefgh'})
-equal(true, ~{var xx := 'abcdefgh'; xx[1:xx[]  ] == 'bcdefgh' })
-equal(true, ~{var xx := 'abcdefgh'; xx[2:xx[]  ] == 'cdefgh'  })
-equal(true, ~{var xx := 'abcdefgh'; xx[3:xx[]  ] == 'defgh'   })
-equal(true, ~{var xx := 'abcdefgh'; xx[4:xx[]  ] == 'efgh'    })
-equal(true, ~{var xx := 'abcdefgh'; xx[5:xx[]  ] == 'fgh'     })
-equal(true, ~{var xx := 'abcdefgh'; xx[6:xx[]  ] == 'gh'      })
-equal(true, ~{var xx := 'abcdefgh'; xx[7:xx[]  ] == 'h'       })
-equal(true, ~{var xx := 'abcdefgh'; xx[8:xx[]  ] == ''        })
-equal(true, ~{var xx := 'abcdefgh'; xx[1:xx[]-2] == 'bcdefg'  })
-equal(true, ~{var xx := 'abcdefgh'; xx[2:xx[]-3] == 'cdef'    })
-equal(true, ~{var xx := 'abcdefgh'; xx[3:xx[]-4] == 'de'      })
-equal(true, ~{var xx := 'abcdefgh'; 'cde'      == xx[4/2:3+1] })
-equal(true, ~{var xx := 'abcdefgh'; 'cde'      == xx[2:4]     })
-equal(true, ~{var xx := 'abcdefgh'; 'abcdefgh' == xx[0:xx[]-1]})
-equal(true, ~{var xx := 'abcdefgh'; 'abcdefg'  == xx[0:xx[]-2]})
-equal(true, ~{var xx := 'abcdefgh'; 'abcdef'   == xx[0:xx[]-3]})
-equal(true, ~{var xx := 'abcdefgh'; 'abcde'    == xx[0:xx[]-4]})
-equal(true, ~{var xx := 'abcdefgh'; 'abcd'     == xx[0:xx[]-5]})
-equal(true, ~{var xx := 'abcdefgh'; 'abc'      == xx[0:xx[]-6]})
-equal(true, ~{var xx := 'abcdefgh'; 'ab'       == xx[0:xx[]-7]})
-equal(true, ~{var xx := 'abcdefgh'; 'a'        == xx[0:xx[]-8]})
-equal(true, ~{var xx := 'abcdefgh'; 'abcdefgh' == xx[0:xx[]  ]})
-equal(true, ~{var xx := 'abcdefgh'; 'bcdefgh'  == xx[1:xx[]  ]})
-equal(true, ~{var xx := 'abcdefgh'; 'cdefgh'   == xx[2:xx[]  ]})
-equal(true, ~{var xx := 'abcdefgh'; 'defgh'    == xx[3:xx[]  ]})
-equal(true, ~{var xx := 'abcdefgh'; 'efgh'     == xx[4:xx[]  ]})
-equal(true, ~{var xx := 'abcdefgh'; 'fgh'      == xx[5:xx[]  ]})
-equal(true, ~{var xx := 'abcdefgh'; 'gh'       == xx[6:xx[]  ]})
-equal(true, ~{var xx := 'abcdefgh'; 'h'        == xx[7:xx[]  ]})
-equal(true, ~{var xx := 'abcdefgh'; ''         == xx[8:xx[]  ]})
-equal(true, ~{var xx := 'abcdefgh'; 'bcdefg'   == xx[1:xx[]-2]})
-equal(true, ~{var xx := 'abcdefgh'; 'cdef'     == xx[2:xx[]-3]})
-equal(true, ~{var xx := 'abcdefgh'; 'de'       == xx[3:xx[]-4]})
+equal(true, ~{var xx := 'abcdefgh'; xx[1:5]       == 'bcde'     })
+equal(true, ~{var xx := 'abcdefgh'; xx[ :8 / 2 + 1] == 'abcde'  })
+equal(true, ~{var xx := 'abcdefgh'; xx[ :5]       == 'abcde'    })
+equal(true, ~{var xx := 'abcdefgh'; xx[ :5]       == xx[:8 / 2 + 1]})
+equal(true, ~{var xx := 'abcdefgh'; xx[2 + 1: ]   =='defgh'     })
+equal(true, ~{var xx := 'abcdefgh'; xx[ : ]       == 'abcdefgh' })
+equal(true, ~{var xx := 'abcdefgh'; xx[:]         == 'abcdefgh' })
+equal(true, ~{var xx := 'abcdefgh'; xx[4/2:3+1+1] == 'cde'      })
+equal(true, ~{var xx := 'abcdefgh'; xx[2:5]       == 'cde'      })
+equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]-0] == 'abcdefgh'  })
+equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]-1] == 'abcdefg'   })
+equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]-2] == 'abcdef'    })
+equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]-3] == 'abcde'     })
+equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]-4] == 'abcd'      })
+equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]-5] == 'abc'       })
+equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]-6] == 'ab'        })
+equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]-7] == 'a'         })
+equal(true, ~{var xx := 'abcdefgh'; xx[0:xx[]  ] == 'abcdefgh'  })
+equal(true, ~{var xx := 'abcdefgh'; xx[1:xx[]  ] == 'bcdefgh'   })
+equal(true, ~{var xx := 'abcdefgh'; xx[2:xx[]  ] == 'cdefgh'    })
+equal(true, ~{var xx := 'abcdefgh'; xx[3:xx[]  ] == 'defgh'     })
+equal(true, ~{var xx := 'abcdefgh'; xx[4:xx[]  ] == 'efgh'      })
+equal(true, ~{var xx := 'abcdefgh'; xx[5:xx[]  ] == 'fgh'       })
+equal(true, ~{var xx := 'abcdefgh'; xx[6:xx[]  ] == 'gh'        })
+equal(true, ~{var xx := 'abcdefgh'; xx[7:xx[]  ] == 'h'         })
+equal(true, ~{var xx := 'abcdefgh'; xx[8:xx[]  ] == ''          })
+equal(true, ~{var xx := 'abcdefgh'; xx[1:xx[]-1] == 'bcdefg'    })
+equal(true, ~{var xx := 'abcdefgh'; xx[2:xx[]-2] == 'cdef'      })
+equal(true, ~{var xx := 'abcdefgh'; xx[3:xx[]-3] == 'de'        })
+equal(true, ~{var xx := 'abcdefgh'; 'cde'      == xx[4/2:3+1+1] })
+equal(true, ~{var xx := 'abcdefgh'; 'cde'      == xx[2:5]       })
+equal(true, ~{var xx := 'abcdefgh'; 'abcdefgh' == xx[0:xx[]-0]  })
+equal(true, ~{var xx := 'abcdefgh'; 'abcdefg'  == xx[0:xx[]-1]  })
+equal(true, ~{var xx := 'abcdefgh'; 'abcdef'   == xx[0:xx[]-2]  })
+equal(true, ~{var xx := 'abcdefgh'; 'abcde'    == xx[0:xx[]-3]  })
+equal(true, ~{var xx := 'abcdefgh'; 'abcd'     == xx[0:xx[]-4]  })
+equal(true, ~{var xx := 'abcdefgh'; 'abc'      == xx[0:xx[]-5]  })
+equal(true, ~{var xx := 'abcdefgh'; 'ab'       == xx[0:xx[]-6]  })
+equal(true, ~{var xx := 'abcdefgh'; 'a'        == xx[0:xx[]-7]  })
+equal(true, ~{var xx := 'abcdefgh'; 'abcdefgh' == xx[0:xx[]  ]  })
+equal(true, ~{var xx := 'abcdefgh'; 'bcdefgh'  == xx[1:xx[]  ]  })
+equal(true, ~{var xx := 'abcdefgh'; 'cdefgh'   == xx[2:xx[]  ]  })
+equal(true, ~{var xx := 'abcdefgh'; 'defgh'    == xx[3:xx[]  ]  })
+equal(true, ~{var xx := 'abcdefgh'; 'efgh'     == xx[4:xx[]  ]  })
+equal(true, ~{var xx := 'abcdefgh'; 'fgh'      == xx[5:xx[]  ]  })
+equal(true, ~{var xx := 'abcdefgh'; 'gh'       == xx[6:xx[]  ]  })
+equal(true, ~{var xx := 'abcdefgh'; 'h'        == xx[7:xx[]  ]  })
+equal(true, ~{var xx := 'abcdefgh'; ''         == xx[8:xx[]  ]  })
+equal(true, ~{var xx := 'abcdefgh'; 'bcdefg'   == xx[1:xx[]-1]  })
+equal(true, ~{var xx := 'abcdefgh'; 'cdef'     == xx[2:xx[]-2]  })
+equal(true, ~{var xx := 'abcdefgh'; 'de'       == xx[3:xx[]-3]  })
+equal(true, ~{ var ss := '0123456789'; var tt := 'XXXXXXXXXXXXXXXXXXXX'; ss[0 : ~{ss<=>tt; ss[] - 1}] := 'AAAA'; ss == 'AAAAXXXXXXXXXXXXXXXX'})
+equal(true, ~{ var ss := '0123456789'; var tt := 'XXXXXXXXXXXXXXXXXXXX'; ss[1 : ~{ss<=>tt; ss[] - 1}] := 'AAAA'; ss == 'XAAAAXXXXXXXXXXXXXXX'})
+equal(true, ~{ var ss := '0123456789'; var tt := 'XXXXXXXXXXXXXXXXXXXX'; ss[2 : ~{ss<=>tt; ss[] - 1}] := 'AAAA'; ss == 'XXAAAAXXXXXXXXXXXXXX'})
+equal(true, ~{ var ss := '0123456789'; var tt := 'XXXXXXXXXXXXXXXXXXXX'; ss[3 : ~{ss<=>tt; ss[] - 1}] := 'AAAA'; ss == 'XXXAAAAXXXXXXXXXXXXX'})
+equal(true, ~{ var ss := '0123456789'; var tt := 'XXXXXXXXXXXXXXXXXXXX'; ss[4 : ~{ss<=>tt; ss[] - 1}] := 'AAAA'; ss == 'XXXXAAAAXXXXXXXXXXXX'})
+equal(true, ~{ var ss := '012345'; ss[0:0+1] == '0'})
+equal(true, ~{ var ss := '012345'; ss[1:1+1] == '1'})
+equal(true, ~{ var ss := '012345'; ss[2:2+1] == '2'})
+equal(true, ~{ var ss := '012345'; ss[3:3+1] == '3'})
+equal(true, ~{ var ss := '012345'; ss[4:4+1] == '4'})
+equal(true, ~{ var ss := '012345'; ss[5:5+1] == '5'})
+equal(true, ~{ var ss := '012345'; var r0 := 0; ss[r0:r0+1] == '0'})
+equal(true, ~{ var ss := '012345'; var r0 := 1; ss[r0:r0+1] == '1'})
+equal(true, ~{ var ss := '012345'; var r0 := 2; ss[r0:r0+1] == '2'})
+equal(true, ~{ var ss := '012345'; var r0 := 3; ss[r0:r0+1] == '3'})
+equal(true, ~{ var ss := '012345'; var r0 := 4; ss[r0:r0+1] == '4'})
+equal(true, ~{ var ss := '012345'; var r0 := 5; ss[r0:r0+1] == '5'})
+equal(true, ~{ var ss := '012345'; var r0 := 0; var r1 := 0; ss[r0:r1+1] == '0'})
+equal(true, ~{ var ss := '012345'; var r0 := 1; var r1 := 1; ss[r0:r1+1] == '1'})
+equal(true, ~{ var ss := '012345'; var r0 := 2; var r1 := 2; ss[r0:r1+1] == '2'})
+equal(true, ~{ var ss := '012345'; var r0 := 3; var r1 := 3; ss[r0:r1+1] == '3'})
+equal(true, ~{ var ss := '012345'; var r0 := 4; var r1 := 4; ss[r0:r1+1] == '4'})
+equal(true, ~{ var ss := '012345'; var r0 := 5; var r1 := 5; ss[r0:r1+1] == '5'})
+equal(true, ~{ var ss := '012345'; var r0 := 0; var r1 := 1; ss[r0:r1]   == '0'})
+equal(true, ~{ var ss := '012345'; var r0 := 1; var r1 := 2; ss[r0:r1]   == '1'})
+equal(true, ~{ var ss := '012345'; var r0 := 2; var r1 := 3; ss[r0:r1]   == '2'})
+equal(true, ~{ var ss := '012345'; var r0 := 3; var r1 := 4; ss[r0:r1]   == '3'})
+equal(true, ~{ var ss := '012345'; var r0 := 4; var r1 := 5; ss[r0:r1]   == '4'})
+equal(true, ~{ var ss := '012345'; var r0 := 5; var r1 := 6; ss[r0:r1]   == '5'})
 equal(true, ~{var s := ~{var n := 1; var m := 2; if (n < m) 'n < m';  else 'n >= m'; }; (s == 'n < m')})
 equal(true, ~{var s := ~{var n := 1; var m := 2; if (n > m) 'n <= m'; else 'n > m'; }; (s == 'n > m')})
 equal(true, ~{var s := ~{var n := 1; var m := 2; if (n < m) 'n < m';  else 'n >' + '= m'; }; (s == 'n < m')})
@@ -10266,6 +10295,22 @@
 equal(true,~{const var xx := 2; const var n := 111; var v[n] := [xx - 1 : 4 / xx]; equal(sum(v),v[]^2)})
 equal(true,~{const var xx := 2; const var n := 1101; var v[n] := [xx - 1 : 4 / xx]; equal(sum(v),v[]^2)})
 equal(true,~{const var xx := 2; const var n := 11001; var v[n] := [xx - 1 : 4 / xx]; equal(sum(v),v[]^2)})
+equal(true, ~{ var aa[3] := { 1, 2, 3 }; var bb[2] := { 0 , 0 }; var cc[2] := { 2 , 3 }; bb := aa + 1; (bb == cc) });
+equal(true, ~{ var aa[3] := { 1, 2, 3 }; var bb[2] := { 0 , 0 }; var cc[2] := { 2 , 3 }; bb := 1 + aa; (bb == cc) });
+equal(true, ~{ var aa[3] := { 1, 2, 3 }; var bb[2] := { 0 , 0 }; var cc[2] := { 2 , 3 }; var n := 1; bb := aa + n; (bb == cc) });
+equal(true, ~{ var aa[3] := { 1, 2, 3 }; var bb[2] := { 0 , 0 }; var cc[2] := { 2 , 3 }; var n := 1; bb := n + aa; (bb == cc) });
+equal(true, ~{ var aa[3] := { 1, 2, 3 }; var bb[2] := { 0 , 0 }; var cc[2] := { 2 , 3 }; const var n := 1; bb := aa + n; (bb == cc) });
+equal(true, ~{ var aa[3] := { 1, 2, 3 }; var bb[2] := { 0 , 0 }; var cc[2] := { 2 , 3 }; const var n := 1; bb := n + aa; (bb == cc) });
+equal(true, ~{ var aa[3] := { 1, 2, 3 }; var bb[2] := { 0 , 0 }; var cc[2] := { 2 , 3 }; var n[2] := { 1 , 1 }; bb := aa + n[1]; (bb == cc) });
+equal(true, ~{ var aa[3] := { 1, 2, 3 }; var bb[2] := { 0 , 0 }; var cc[2] := { 2 , 3 }; var n[2] := { 1 , 1 }; bb := n[1] + aa; (bb == cc) });
+equal(true, ~{ var aa[3] := { 1, 2, 3 }; var bb[2] := { 0 , 0 }; var cc[2] := { 1 , 0 }; bb := aa == 1; (bb == cc) });
+equal(true, ~{ var aa[3] := { 1, 2, 3 }; var bb[2] := { 0 , 0 }; var cc[2] := { 1 , 0 }; bb := 1 == aa; (bb == cc) });
+equal(true, ~{ var aa[3] := { 1, 2, 3 }; var bb[2] := { 0 , 0 }; var cc[2] := { 1 , 0 }; var n := 1; bb := aa == n; (bb == cc) });
+equal(true, ~{ var aa[3] := { 1, 2, 3 }; var bb[2] := { 0 , 0 }; var cc[2] := { 1 , 0 }; var n := 1; bb := n == aa; (bb == cc) });
+equal(true, ~{ var aa[3] := { 1, 2, 3 }; var bb[2] := { 0 , 0 }; var cc[2] := { 1 , 0 }; const var n := 1; bb := aa == n; (bb == cc) });
+equal(true, ~{ var aa[3] := { 1, 2, 3 }; var bb[2] := { 0 , 0 }; var cc[2] := { 1 , 0 }; const var n := 1; bb := n == aa; (bb == cc) });
+equal(true, ~{ var aa[3] := { 1, 2, 3 }; var bb[2] := { 0 , 0 }; var cc[2] := { 1 , 0 }; var n[2] := { 1 , 1 }; bb := aa == n[1]; (bb == cc) });
+equal(true, ~{ var aa[3] := { 1, 2, 3 }; var bb[2] := { 0 , 0 }; var cc[2] := { 1 , 0 }; var n[2] := { 1 , 1 }; bb := n[1] == aa; (bb == cc) });
 equal(true,~{var zz := for (var i := 0; i < 10; i+=1) { var yy := if (i % 2) { const var xx := 3; i + xx; } else if (i % 2 == 0) { const var xx := 2; i + xx; } }; zz == 12})
 equal(true,~{var zz := for (var i := 0; i < 10; i+=1) { var yy := if (i % 2 == true) { const var xx := 3; i + xx; } else if (i % 2 == false) { const var xx := 2; i + xx; } }; zz == 12})
 equal(true,~{var result := 0; if (true) { result := 2 }; if (true) { result := 3 }; result == 3})
@@ -10511,4 +10556,20 @@
 equal(~{ var xx[1000   ] := [1:1]; sqrt(sum([xx - avg(xx)]^2) / xx[]) } , 000288.67499025720950043826670416494563681823480183371010816)
 equal(~{ var xx[10000  ] := [1:1]; sqrt(sum([xx - avg(xx)]^2) / xx[]) } , 002886.75133151437205672070778500749723447196977023066362870)
 equal(~{ var xx[100000 ] := [1:1]; sqrt(sum([xx - avg(xx)]^2) / xx[]) } , 028867.51345803791255244729022199884500125204178136741699959)
-equal(~{ var xx[1000000] := [1:1]; sqrt(sum([xx - avg(xx)]^2) / xx[]) } , 288675.13459466854468727694772545961625902290853716567468578)
\ No newline at end of file
+equal(~{ var xx[1000000] := [1:1]; sqrt(sum([xx - avg(xx)]^2) / xx[]) } , 288675.13459466854468727694772545961625902290853716567468578)
+equal(true, ~{ const var n := 1; var v[n] := [1:1]; var o[n] := [0]; max_elemwise(o, v, 0); v == o});
+equal(true, ~{ const var n := 2; var v[n] := [1:1]; var o[n] := [0]; max_elemwise(o, v, 0); v == o});
+equal(true, ~{ const var n := 3; var v[n] := [1:1]; var o[n] := [0]; max_elemwise(o, v, 0); v == o});
+equal(true, ~{ const var n := 4; var v[n] := [1:1]; var o[n] := [0]; max_elemwise(o, v, 0); v == o});
+equal(true, ~{ const var n := 5; var v[n] := [1:1]; var o[n] := [0]; max_elemwise(o, v, 0); v == o});
+equal(true, ~{ const var n := 1; var v[n] := [1:1]; var o[n] := [n + 1]; min_elemwise(o, v, n + 1); v == o});
+equal(true, ~{ const var n := 2; var v[n] := [1:1]; var o[n] := [n + 1]; min_elemwise(o, v, n + 1); v == o});
+equal(true, ~{ const var n := 3; var v[n] := [1:1]; var o[n] := [n + 1]; min_elemwise(o, v, n + 1); v == o});
+equal(true, ~{ const var n := 4; var v[n] := [1:1]; var o[n] := [n + 1]; min_elemwise(o, v, n + 1); v == o});
+equal(true, ~{ const var n := 5; var v[n] := [1:1]; var o[n] := [n + 1]; min_elemwise(o, v, n + 1); v == o});
+equal(true, ~{ const var n := 10; var v[n] := [1:1]; var o[n] := [0]; var p[n] := { 0, 0, 0, 4, 5, 6, 7, 8, 0,  0}; max_elemwise(o, v, 3, 7, 0) == 1 and all_true((o == p)) })
+equal(true, ~{ const var n := 10; var v[n] := [1:1]; var o[n] := [0]; var p[n] := { 1, 2, 3, 4, 5, 0, 0, 0, 0,  0}; max_elemwise(o, v, 0, 4, 0) == 1 and all_true((o == p)) })
+equal(true, ~{ const var n := 10; var v[n] := [1:1]; var o[n] := [0]; var p[n] := { 0, 0, 0, 0, 5, 6, 7, 8, 9, 10}; max_elemwise(o, v, 4, 9, 0) == 1 and all_true((o == p)) })
+equal(true, ~{ const var n := 10; var q := n + 10; var v[n] := [1:1]; var o[n] := [n + 10]; var p[n] := { q, q, q, 4, 5, 6, 7, 8, q,  q }; min_elemwise(o, v, 3, 7, q) == 1 and all_true((o == p)) })
+equal(true, ~{ const var n := 10; var q := n + 10; var v[n] := [1:1]; var o[n] := [n + 10]; var p[n] := { 1, 2, 3, 4, 5, q, q, q, q,  q }; min_elemwise(o, v, 0, 4, q) == 1 and all_true((o == p)) })
+equal(true, ~{ const var n := 10; var q := n + 10; var v[n] := [1:1]; var o[n] := [n + 10]; var p[n] := { q, q, q, q, 5, 6, 7, 8, 9, 10 }; min_elemwise(o, v, 4, 9, q) == 1 and all_true((o == p)) })
diff --git a/exprtk_simple_example_01.cpp b/exprtk_simple_example_01.cpp
index 52c5565..a4c7839 100644
--- a/exprtk_simple_example_01.cpp
+++ b/exprtk_simple_example_01.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 01                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_02.cpp b/exprtk_simple_example_02.cpp
index 279046a..5dc9f64 100644
--- a/exprtk_simple_example_02.cpp
+++ b/exprtk_simple_example_02.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 02                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_03.cpp b/exprtk_simple_example_03.cpp
index 3b8ad07..35c4d6b 100644
--- a/exprtk_simple_example_03.cpp
+++ b/exprtk_simple_example_03.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 03                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_04.cpp b/exprtk_simple_example_04.cpp
index 04a4b3f..532c8f9 100644
--- a/exprtk_simple_example_04.cpp
+++ b/exprtk_simple_example_04.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 04                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_05.cpp b/exprtk_simple_example_05.cpp
index 3eb4a4f..99fb156 100644
--- a/exprtk_simple_example_05.cpp
+++ b/exprtk_simple_example_05.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 05                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_06.cpp b/exprtk_simple_example_06.cpp
index dbb805d..62b0905 100644
--- a/exprtk_simple_example_06.cpp
+++ b/exprtk_simple_example_06.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 06                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_07.cpp b/exprtk_simple_example_07.cpp
index 85e94f1..872188a 100644
--- a/exprtk_simple_example_07.cpp
+++ b/exprtk_simple_example_07.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 07                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_08.cpp b/exprtk_simple_example_08.cpp
index f82b992..b39cda8 100644
--- a/exprtk_simple_example_08.cpp
+++ b/exprtk_simple_example_08.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 08                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_09.cpp b/exprtk_simple_example_09.cpp
index f7cd0f2..327f174 100644
--- a/exprtk_simple_example_09.cpp
+++ b/exprtk_simple_example_09.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 09                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_10.cpp b/exprtk_simple_example_10.cpp
index 67add61..eeab3d1 100644
--- a/exprtk_simple_example_10.cpp
+++ b/exprtk_simple_example_10.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 10                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_11.cpp b/exprtk_simple_example_11.cpp
index 8a26fb5..dc15ef7 100644
--- a/exprtk_simple_example_11.cpp
+++ b/exprtk_simple_example_11.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 11                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_12.cpp b/exprtk_simple_example_12.cpp
index 8045de4..07df710 100644
--- a/exprtk_simple_example_12.cpp
+++ b/exprtk_simple_example_12.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 12                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_13.cpp b/exprtk_simple_example_13.cpp
index cebdf73..46916d6 100644
--- a/exprtk_simple_example_13.cpp
+++ b/exprtk_simple_example_13.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 13                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_14.cpp b/exprtk_simple_example_14.cpp
index 56208e1..57d90ac 100644
--- a/exprtk_simple_example_14.cpp
+++ b/exprtk_simple_example_14.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 14                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_15.cpp b/exprtk_simple_example_15.cpp
index 3dc6d4d..74338aa 100644
--- a/exprtk_simple_example_15.cpp
+++ b/exprtk_simple_example_15.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 15                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_16.cpp b/exprtk_simple_example_16.cpp
index 8970072..9e816eb 100644
--- a/exprtk_simple_example_16.cpp
+++ b/exprtk_simple_example_16.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 16                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_17.cpp b/exprtk_simple_example_17.cpp
index 2c2221c..d6000ab 100644
--- a/exprtk_simple_example_17.cpp
+++ b/exprtk_simple_example_17.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 17                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_18.cpp b/exprtk_simple_example_18.cpp
index f4c714b..2233cf1 100644
--- a/exprtk_simple_example_18.cpp
+++ b/exprtk_simple_example_18.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 18                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_19.cpp b/exprtk_simple_example_19.cpp
index bcf4593..6544968 100644
--- a/exprtk_simple_example_19.cpp
+++ b/exprtk_simple_example_19.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 19                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_20.cpp b/exprtk_simple_example_20.cpp
index 8baa7f1..136a6ee 100644
--- a/exprtk_simple_example_20.cpp
+++ b/exprtk_simple_example_20.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 20                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_21.cpp b/exprtk_simple_example_21.cpp
index 8838ff4..633139b 100644
--- a/exprtk_simple_example_21.cpp
+++ b/exprtk_simple_example_21.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 21                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_22.cpp b/exprtk_simple_example_22.cpp
index c3a2f19..941b66e 100644
--- a/exprtk_simple_example_22.cpp
+++ b/exprtk_simple_example_22.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 22                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
@@ -33,40 +33,40 @@
    typedef typename compositor_t::function function_t;
 
    const std::string option_implied_volatility_program =
-      " const var epsilon   := 0.0000001;                               "
-      " const var max_iters := 1000;                                    "
-      "                                                                 "
-      " var v   := 0.5; /* Initial volatility guess */                  "
-      " var itr := 0;                                                   "
-      "                                                                 "
-      " while ((itr += 1) <= max_iters)                                 "
-      " {                                                               "
-      "    var price :=                                                 "
-      "       switch                                                    "
-      "       {                                                         "
-      "          case callput_flag == 'call' : bsm_call(s, k, r, t, v); "
-      "          case callput_flag == 'put'  : bsm_put (s, k, r, t, v); "
-      "       };                                                        "
-      "                                                                 "
-      "    var price_diff := price - target_price;                      "
-      "                                                                 "
-      "    if (abs(price_diff) <= epsilon)                              "
-      "    {                                                            "
-      "       break;                                                    "
-      "    };                                                           "
-      "                                                                 "
-      "    var vega := bsm_vega(s, k, r, t, v);                         "
-      "                                                                 "
-      "    if (vega < epsilon)                                          "
-      "    {                                                            "
-      "       itr := max_iters + 1;                                     "
-      "       break;                                                    "
-      "    };                                                           "
-      "                                                                 "
-      "    v -= price_diff / vega;                                      "
-      " };                                                              "
-      "                                                                 "
-      " itr <= max_iters ? v : null;                                    ";
+      " const var epsilon   := 0.0000001;                                  "
+      " const var max_iters := 1000;                                       "
+      "                                                                    "
+      " var vola := 0.5; /* Initial volatility guess */                    "
+      " var itr  := 0;                                                     "
+      "                                                                    "
+      " while ((itr += 1) <= max_iters)                                    "
+      " {                                                                  "
+      "    var price :=                                                    "
+      "       switch                                                       "
+      "       {                                                            "
+      "          case callput_flag == 'call' : bsm_call(s, k, r, t, vola); "
+      "          case callput_flag == 'put'  : bsm_put (s, k, r, t, vola); "
+      "       };                                                           "
+      "                                                                    "
+      "    var price_diff := price - target_price;                         "
+      "                                                                    "
+      "    if (abs(price_diff) <= epsilon)                                 "
+      "    {                                                               "
+      "       break;                                                       "
+      "    };                                                              "
+      "                                                                    "
+      "    var vega := bsm_vega(s, k, r, t, vola);                         "
+      "                                                                    "
+      "    if (vega < epsilon)                                             "
+      "    {                                                               "
+      "       itr := max_iters + 1;                                        "
+      "       break;                                                       "
+      "    };                                                              "
+      "                                                                    "
+      "    vola -= price_diff / vega;                                      "
+      " };                                                                 "
+      "                                                                    "
+      " itr <= max_iters ? vola : null;                                    ";
 
    T s            = T(100.00); // Spot / Stock / Underlying / Base price
    T k            = T(110.00); // Strike price
@@ -126,22 +126,22 @@
       callput_flag = "call";
       target_price = T(18.339502);
 
-      const T call_option_implied_vol = expression.value();
+      const T call_option_implied_vola = expression.value();
 
       printf("Call Option(s: %5.3f, k: %5.3f, t: %5.3f, r: %5.3f) "
              "@ $%8.6f Implied volatility = %10.8f\n",
-             s, k, t, r, target_price, call_option_implied_vol);
+             s, k, t, r, target_price, call_option_implied_vola);
    }
 
    {
       callput_flag = "put";
       target_price = T(16.782764);
 
-      const T put_option_implied_vol = expression.value();
+      const T put_option_implied_vola = expression.value();
 
       printf("Put  Option(s: %5.3f, k: %5.3f, t: %5.3f, r: %5.3f) "
              "@ $%8.6f Implied volatility = %10.8f\n",
-             s, k, t, r, target_price, put_option_implied_vol);
+             s, k, t, r, target_price, put_option_implied_vola);
    }
 }
 
diff --git a/exprtk_simple_example_23.cpp b/exprtk_simple_example_23.cpp
index f81a2fe..00cb835 100644
--- a/exprtk_simple_example_23.cpp
+++ b/exprtk_simple_example_23.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 23                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_simple_example_24.cpp b/exprtk_simple_example_24.cpp
index d9eba7d..32c8943 100644
--- a/exprtk_simple_example_24.cpp
+++ b/exprtk_simple_example_24.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Simple Example 24                                          *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
diff --git a/exprtk_test.cpp b/exprtk_test.cpp
index 8262a7f..4ff4f75 100644
--- a/exprtk_test.cpp
+++ b/exprtk_test.cpp
@@ -3,7 +3,7 @@
  *         C++ Mathematical Expression Toolkit Library        *
  *                                                            *
  * Examples and Unit-Tests                                    *
- * Author: Arash Partow (1999-2024)                           *
+ * Author: Arash Partow (1999-2025)                           *
  * URL: https://www.partow.net/programming/exprtk/index.html  *
  *                                                            *
  * Copyright notice:                                          *
@@ -2201,174 +2201,174 @@
       test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{x == (x != (x + '2') ? x : y)  }}","","",T(1.0)),
       test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{'xxx1' == (x < y ? x + '1' : y)}}","","",T(1.0)),
       test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{'yyy2' == (x > y ? x : y + '2')}}","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[0:9] == '0123456789'    ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[:] ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[0:]","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[:9]","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[:9]  == '0123456789'[:9]","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[10:] == '0123456789'[:] ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[0:9] != '123456789'     ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[0:9] != '123456789'[:]  ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[0:9] != '123456789'[0:] ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[0:9] != '123456789'[:8] ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[:9]  != '123456789'[:8] ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[10:] != '123456789'[:]  ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[2*6:10+6] == '23456'    ","","",T(1.0)),
-      test_ab<T>("'0123456789'     == '01234567890123456789'[0:9]","","",T(1.0)),
-      test_ab<T>("'0123456789'[:]  == '01234567890123456789'[0:9]","","",T(1.0)),
-      test_ab<T>("'0123456789'[0:] == '01234567890123456789'[0:9]","","",T(1.0)),
-      test_ab<T>("'0123456789'[:9] == '01234567890123456789'[0:9]","","",T(1.0)),
-      test_ab<T>("'0123456789'[:9] == '01234567890123456789'[:9] ","","",T(1.0)),
-      test_ab<T>("'0123456789'[:]  == '01234567890123456789'[10:]","","",T(1.0)),
-      test_ab<T>("'0123456789'[3:3] == '3'[:]                    ","","",T(1.0)),
-      test_ab<T>("'0123456789'[3:3] == '3'[0:0]                  ","","",T(1.0)),
-      test_ab<T>("'123456789'      != '01234567890123456789'[0:9]","","",T(1.0)),
-      test_ab<T>("'123456789'[:]   != '01234567890123456789'[0:9]","","",T(1.0)),
-      test_ab<T>("'123456789'[0:]  != '01234567890123456789'[0:9]","","",T(1.0)),
-      test_ab<T>("'123456789'[:8]  != '01234567890123456789'[0:9]","","",T(1.0)),
-      test_ab<T>("'123456789'[:8]  != '01234567890123456789'[:9] ","","",T(1.0)),
-      test_ab<T>("'123456789'[:]   != '01234567890123456789'[10:]","","",T(1.0)),
-      test_ab<T>("'23456' == '01234567890123456789'[2*6:10+6]    ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[r0: 6]   == '23456'              ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[2: r1]   == '23456'              ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[r0:3*2]  == '23456'              ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[1+1:r1]  == '23456'              ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[r0:  ]   == '234567890123456789' ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[:  r1]   == '0123456'            ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[r0:r1]   == '23456'              ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[r0:r1+2] == '2345678'            ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[r0+2:r1] == '456'                ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[r1-r0:]  == '4567890123456789'   ","","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[:r1-r0]  == '01234'              ","","",T(1.0)),
-      test_ab<T>("'23456'              == '01234567890123456789'[r0: 6]   ","","",T(1.0)),
-      test_ab<T>("'23456'              == '01234567890123456789'[2: r1]   ","","",T(1.0)),
-      test_ab<T>("'23456'              == '01234567890123456789'[r0:3*2]  ","","",T(1.0)),
-      test_ab<T>("'23456'              == '01234567890123456789'[1+1:r1]  ","","",T(1.0)),
-      test_ab<T>("'234567890123456789' == '01234567890123456789'[r0:  ]   ","","",T(1.0)),
-      test_ab<T>("'0123456'            == '01234567890123456789'[:  r1]   ","","",T(1.0)),
-      test_ab<T>("'23456'              == '01234567890123456789'[r0:r1]   ","","",T(1.0)),
-      test_ab<T>("'2345678'            == '01234567890123456789'[r0:r1+2] ","","",T(1.0)),
-      test_ab<T>("'456'                == '01234567890123456789'[r0+2:r1] ","","",T(1.0)),
-      test_ab<T>("'4567890123456789'   == '01234567890123456789'[r1-r0:]  ","","",T(1.0)),
-      test_ab<T>("'01234'              == '01234567890123456789'[:r1-r0]  ","","",T(1.0)),
-      test_ab<T>("a[r0: 6]   == '23456'              ","01234567890123456789","",T(1.0)),
-      test_ab<T>("a[2: r1]   == '23456'              ","01234567890123456789","",T(1.0)),
-      test_ab<T>("a[r0:3*2]  == '23456'              ","01234567890123456789","",T(1.0)),
-      test_ab<T>("a[1+1:r1]  == '23456'              ","01234567890123456789","",T(1.0)),
-      test_ab<T>("a[r0:  ]   == '234567890123456789' ","01234567890123456789","",T(1.0)),
-      test_ab<T>("a[:  r1]   == '0123456'            ","01234567890123456789","",T(1.0)),
-      test_ab<T>("a[r0:r1]   == '23456'              ","01234567890123456789","",T(1.0)),
-      test_ab<T>("a[r0:r1+2] == '2345678'            ","01234567890123456789","",T(1.0)),
-      test_ab<T>("a[r0+2:r1] == '456'                ","01234567890123456789","",T(1.0)),
-      test_ab<T>("a[r1-r0:]  == '4567890123456789'   ","01234567890123456789","",T(1.0)),
-      test_ab<T>("a[:r1-r0]  == '01234'              ","01234567890123456789","",T(1.0)),
-      test_ab<T>("'23456'              == a[r0: 6]   ","01234567890123456789","",T(1.0)),
-      test_ab<T>("'23456'              == a[2: r1]   ","01234567890123456789","",T(1.0)),
-      test_ab<T>("'23456'              == a[r0:3*2]  ","01234567890123456789","",T(1.0)),
-      test_ab<T>("'23456'              == a[1+1:r1]  ","01234567890123456789","",T(1.0)),
-      test_ab<T>("'234567890123456789' == a[r0:  ]   ","01234567890123456789","",T(1.0)),
-      test_ab<T>("'0123456'            == a[:  r1]   ","01234567890123456789","",T(1.0)),
-      test_ab<T>("'23456'              == a[r0:r1]   ","01234567890123456789","",T(1.0)),
-      test_ab<T>("'2345678'            == a[r0:r1+2] ","01234567890123456789","",T(1.0)),
-      test_ab<T>("'456'                == a[r0+2:r1] ","01234567890123456789","",T(1.0)),
-      test_ab<T>("'4567890123456789'   == a[r1-r0:]  ","01234567890123456789","",T(1.0)),
-      test_ab<T>("'01234'              == a[:r1-r0]  ","01234567890123456789","",T(1.0)),
-      test_ab<T>("a[r0: 6]   == b                    ","01234567890123456789","23456",T(1.0)),
-      test_ab<T>("a[2: r1]   == b                    ","01234567890123456789","23456",T(1.0)),
-      test_ab<T>("a[r0:3*2]  == b                    ","01234567890123456789","23456",T(1.0)),
-      test_ab<T>("a[1+1:r1]  == b                    ","01234567890123456789","23456",T(1.0)),
-      test_ab<T>("a[r0:  ]   == b                    ","01234567890123456789","234567890123456789",T(1.0)),
-      test_ab<T>("a[:  r1]   == b                    ","01234567890123456789","0123456",T(1.0)),
-      test_ab<T>("a[r0:r1]   == b                    ","01234567890123456789","23456",T(1.0)),
-      test_ab<T>("a[r0:r1+2] == b                    ","01234567890123456789","2345678",T(1.0)),
-      test_ab<T>("a[r0+2:r1] == b                    ","01234567890123456789","456",T(1.0)),
-      test_ab<T>("a[r1-r0:]  == b                    ","01234567890123456789","4567890123456789",T(1.0)),
-      test_ab<T>("a[:r1-r0]  == b                    ","01234567890123456789","01234",T(1.0)),
-      test_ab<T>("b == a[r0: 6]                      ","01234567890123456789","23456",T(1.0)),
-      test_ab<T>("b == a[2: r1]                      ","01234567890123456789","23456",T(1.0)),
-      test_ab<T>("b == a[r0:3*2]                     ","01234567890123456789","23456",T(1.0)),
-      test_ab<T>("b == a[1+1:r1]                     ","01234567890123456789","23456",T(1.0)),
-      test_ab<T>("b == a[r0:  ]                      ","01234567890123456789","234567890123456789",T(1.0)),
-      test_ab<T>("b == a[:  r1]                      ","01234567890123456789","0123456",T(1.0)),
-      test_ab<T>("b == a[r0:r1]                      ","01234567890123456789","23456",T(1.0)),
-      test_ab<T>("b == a[r0:r1+2]                    ","01234567890123456789","2345678",T(1.0)),
-      test_ab<T>("b == a[r0+2:r1]                    ","01234567890123456789","456",T(1.0)),
-      test_ab<T>("b == a[r1-r0:]                     ","01234567890123456789","4567890123456789",T(1.0)),
-      test_ab<T>("b == a[:r1-r0]                     ","01234567890123456789","01234",T(1.0)),
-      test_ab<T>("'01234567890123456789'[0:9] == a     ","0123456789","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[0:9] == a[:]  ","0123456789","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[0:9] == a[0:] ","0123456789","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[0:9] == a[:9] ","0123456789","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[:9]  == a[:9] ","0123456789","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[10:] == a[:]  ","0123456789","",T(1.0)),
-      test_ab<T>("'01234567890123456789'[0:9] != a     ","123456789" ,"",T(1.0)),
-      test_ab<T>("'01234567890123456789'[0:9] != a[:]  ","123456789" ,"",T(1.0)),
-      test_ab<T>("'01234567890123456789'[0:9] != a[0:] ","123456789" ,"",T(1.0)),
-      test_ab<T>("'01234567890123456789'[0:9] != a[:8] ","123456789" ,"",T(1.0)),
-      test_ab<T>("'01234567890123456789'[:9]  != a[:8] ","123456789" ,"",T(1.0)),
-      test_ab<T>("'01234567890123456789'[10:] != a[:]  ","123456789" ,"",T(1.0)),
-      test_ab<T>("'01234567890123456789'[2*6:10+6] == a","23456"     ,"",T(1.0)),
-      test_ab<T>("'23456' == a[:]                      ","23456"     ,"",T(1.0)),
-      test_ab<T>("a     == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
-      test_ab<T>("a[:]  == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
-      test_ab<T>("a[0:] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
-      test_ab<T>("a[:9] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
-      test_ab<T>("a[:9] == '01234567890123456789'[:9]  ","0123456789","",T(1.0)),
-      test_ab<T>("a[:]  == '01234567890123456789'[10:] ","0123456789","",T(1.0)),
-      test_ab<T>("a     != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
-      test_ab<T>("a[:]  != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
-      test_ab<T>("a[0:] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
-      test_ab<T>("a[:8] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
-      test_ab<T>("a[:8] != '01234567890123456789'[:9]  ","123456789" ,"",T(1.0)),
-      test_ab<T>("a[:]  != '01234567890123456789'[10:] ","123456789" ,"",T(1.0)),
-      test_ab<T>("a == '01234567890123456789'[2*6:10+6]","23456"     ,"",T(1.0)),
-      test_ab<T>("a[:] == '23456'                      ","23456"     ,"",T(1.0)),
-      test_ab<T>("a[0:9] == b      ","01234567890123456789","0123456789",T(1.0)),
-      test_ab<T>("a[0:9] == b[:]   ","01234567890123456789","0123456789",T(1.0)),
-      test_ab<T>("a[0:9] == b[0:]  ","01234567890123456789","0123456789",T(1.0)),
-      test_ab<T>("a[0:9] == b[:9]  ","01234567890123456789","0123456789",T(1.0)),
-      test_ab<T>("a[:9]  == b[:9]  ","01234567890123456789","0123456789",T(1.0)),
-      test_ab<T>("a[10:] == b[:]   ","01234567890123456789","0123456789",T(1.0)),
-      test_ab<T>("a[0:9] != b      ","01234567890123456789","123456789" ,T(1.0)),
-      test_ab<T>("a[0:9] != b[:]   ","01234567890123456789","123456789" ,T(1.0)),
-      test_ab<T>("a[0:9] != b[0:]  ","01234567890123456789","123456789" ,T(1.0)),
-      test_ab<T>("a[0:9] != b[:8]  ","01234567890123456789","123456789" ,T(1.0)),
-      test_ab<T>("a[:9]  != b[:8]  ","01234567890123456789","123456789" ,T(1.0)),
-      test_ab<T>("a[10:] != b[:]   ","01234567890123456789","123456789" ,T(1.0)),
-      test_ab<T>("a[2*6:10+6] == b ","01234567890123456789","23456"     ,T(1.0)),
-      test_ab<T>("b     == a[0:9]  ","01234567890123456789","0123456789",T(1.0)),
-      test_ab<T>("b[:]  == a[0:9]  ","01234567890123456789","0123456789",T(1.0)),
-      test_ab<T>("b[0:] == a[0:9]  ","01234567890123456789","0123456789",T(1.0)),
-      test_ab<T>("b[:9] == a[0:9]  ","01234567890123456789","0123456789",T(1.0)),
-      test_ab<T>("b[:9] == a[:9]   ","01234567890123456789","0123456789",T(1.0)),
-      test_ab<T>("b[:]  == a[10:]  ","01234567890123456789","0123456789",T(1.0)),
-      test_ab<T>("b     != a[0:9]  ","01234567890123456789","123456789" ,T(1.0)),
-      test_ab<T>("b[:]  != a[0:9]  ","01234567890123456789","123456789" ,T(1.0)),
-      test_ab<T>("b[0:] != a[0:9]  ","01234567890123456789","123456789" ,T(1.0)),
-      test_ab<T>("b[:8] != a[0:9]  ","01234567890123456789","123456789" ,T(1.0)),
-      test_ab<T>("b[:8] != a[:9]   ","01234567890123456789","123456789" ,T(1.0)),
-      test_ab<T>("b[:]  != a[10:]  ","01234567890123456789","123456789" ,T(1.0)),
-      test_ab<T>("b == a[2*6:10+6] ","01234567890123456789","23456"     ,T(1.0)),
-      test_ab<T>("a[2:6] == b"         ,"0123456789","23456"  ,T(1.0)),
-      test_ab<T>("a == b[2:6]"         ,"23456","0123456789"  ,T(1.0)),
-      test_ab<T>("a[1+1:2*3] == b"     ,"0123456789","23456"  ,T(1.0)),
-      test_ab<T>("a == b[4/2:sqrt(36)]","23456","0123456789"  ,T(1.0)),
-      test_ab<T>("a[0:6] == b"         ,"0123456789","0123456",T(1.0)),
-      test_ab<T>("a[:6] == b"          ,"0123456789","0123456",T(1.0)),
-      test_ab<T>("a[4/2-2:2+4] == b"   ,"0123456789","0123456",T(1.0)),
-      test_ab<T>("a[:12/2] == b"       ,"0123456789","0123456",T(1.0)),
-      test_ab<T>("a[0:] == b"          ,"0123456","0123456"   ,T(1.0)),
-      test_ab<T>("a[:] == b"           ,"0123456","0123456"   ,T(1.0)),
-      test_ab<T>("a == b[0:6]"         ,"0123456","0123456789",T(1.0)),
-      test_ab<T>("a == b[:6]"          ,"0123456","0123456789",T(1.0)),
-      test_ab<T>("a == b[4/2-2:2+4]"   ,"0123456","0123456789",T(1.0)),
-      test_ab<T>("a == b[:12/2]"       ,"0123456","0123456789",T(1.0)),
-      test_ab<T>("a == b[0:]"          ,"0123456","0123456"   ,T(1.0)),
-      test_ab<T>("a == b[:]"           ,"0123456","0123456"   ,T(1.0)),
-      test_ab<T>("a[:9] == b[0:9]"     ,"0123456789","01234567890123456789",T(1.0)),
-      test_ab<T>("a[0:9] == b[0:9]"    ,"0123456789","01234567890123456789",T(1.0)),
-      test_ab<T>("a[0:] == b[0:9]"     ,"0123456789","01234567890123456789",T(1.0)),
-      test_ab<T>("a[:] == b[0:9]"      ,"0123456789","01234567890123456789",T(1.0)),
+      test_ab<T>("'01234567890123456789'[0:9] == '012345678'      ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[0:9] == '012345678'[:]   ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[0:9] == '012345678'[0:]  ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[0:9] == '012345678'[:9]  ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[:9]  == '0123456789'[:9] ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[10:] == '0123456789'[:]  ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[0:9] != '123456789'      ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[0:9] != '123456789'[:]   ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[0:9] != '123456789'[0:]  ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[0:9] != '123456789'[:8]  ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[:9]  != '123456789'[:8]  ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[10:] != '123456789'[:]   ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[2*6:10+7] == '23456'     ","","",T(1.0)),
+      test_ab<T>("'0123456789'     == '01234567890123456789'[0:10]","","",T(1.0)),
+      test_ab<T>("'0123456789'[:]  == '01234567890123456789'[0:10]","","",T(1.0)),
+      test_ab<T>("'0123456789'[0:] == '01234567890123456789'[0:10]","","",T(1.0)),
+      test_ab<T>("'0123456789'[:9] == '01234567890123456789'[0:9] ","","",T(1.0)),
+      test_ab<T>("'0123456789'[:9] == '01234567890123456789'[:9]  ","","",T(1.0)),
+      test_ab<T>("'0123456789'[:]  == '01234567890123456789'[10:] ","","",T(1.0)),
+      test_ab<T>("'0123456789'[3:4] == '3'[:]                     ","","",T(1.0)),
+      test_ab<T>("'0123456789'[3:4] == '3'[0:1]                   ","","",T(1.0)),
+      test_ab<T>("'123456789'      != '01234567890123456789'[0:9] ","","",T(1.0)),
+      test_ab<T>("'123456789'[:]   != '01234567890123456789'[0:9] ","","",T(1.0)),
+      test_ab<T>("'123456789'[0:]  != '01234567890123456789'[0:9] ","","",T(1.0)),
+      test_ab<T>("'123456789'[:8]  != '01234567890123456789'[0:9] ","","",T(1.0)),
+      test_ab<T>("'123456789'[:8]  != '01234567890123456789'[:9]  ","","",T(1.0)),
+      test_ab<T>("'123456789'[:]   != '01234567890123456789'[10:] ","","",T(1.0)),
+      test_ab<T>("'23456' == '01234567890123456789'[2*6:10+7]     ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[r0: 7]   == '23456'                ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[2: r1 + 1] == '23456'              ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[r0:3*2 + 1]  == '23456'            ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[1+1:r1 + 1]  == '23456'            ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[r0:  ]   == '234567890123456789'   ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[:  r1 + 1]   == '0123456'          ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[r0:r1 + 1]   == '23456'            ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[r0:r1+2+1] == '2345678'            ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[r0+2:r1+1] == '456'                ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[r1-r0:]  == '4567890123456789'     ","","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[:r1-r0 + 1]  == '01234'            ","","",T(1.0)),
+      test_ab<T>("'23456'              == '01234567890123456789'[r0: 7]     ","","",T(1.0)),
+      test_ab<T>("'23456'              == '01234567890123456789'[2: r1+1]   ","","",T(1.0)),
+      test_ab<T>("'23456'              == '01234567890123456789'[r0:3*2+1]  ","","",T(1.0)),
+      test_ab<T>("'23456'              == '01234567890123456789'[1+1:r1+1]  ","","",T(1.0)),
+      test_ab<T>("'234567890123456789' == '01234567890123456789'[r0:  ]     ","","",T(1.0)),
+      test_ab<T>("'0123456'            == '01234567890123456789'[:  1+r1]   ","","",T(1.0)),
+      test_ab<T>("'23456'              == '01234567890123456789'[r0:r1+1]   ","","",T(1.0)),
+      test_ab<T>("'2345678'            == '01234567890123456789'[r0:r1+3]   ","","",T(1.0)),
+      test_ab<T>("'456'                == '01234567890123456789'[r0+2:r1+1] ","","",T(1.0)),
+      test_ab<T>("'4567890123456789'   == '01234567890123456789'[r1-r0:]    ","","",T(1.0)),
+      test_ab<T>("'01234'              == '01234567890123456789'[:r1-r0+1]  ","","",T(1.0)),
+      test_ab<T>("a[r0: 7]    == '23456'                 ","01234567890123456789","",T(1.0)),
+      test_ab<T>("a[2: r1+1]  == '23456'                 ","01234567890123456789","",T(1.0)),
+      test_ab<T>("a[r0:3*2+1] == '23456'                 ","01234567890123456789","",T(1.0)),
+      test_ab<T>("a[1+1:r1+1] == '23456'                 ","01234567890123456789","",T(1.0)),
+      test_ab<T>("a[r0:  ]    == '234567890123456789'    ","01234567890123456789","",T(1.0)),
+      test_ab<T>("a[:1+r1]    == '0123456'               ","01234567890123456789","",T(1.0)),
+      test_ab<T>("a[r0:1+r1]  == '23456'                 ","01234567890123456789","",T(1.0)),
+      test_ab<T>("a[r0:r1+3]  == '2345678'               ","01234567890123456789","",T(1.0)),
+      test_ab<T>("a[r0+2:r1+1]== '456'                   ","01234567890123456789","",T(1.0)),
+      test_ab<T>("a[r1-r0:]   == '4567890123456789'      ","01234567890123456789","",T(1.0)),
+      test_ab<T>("a[:r1-r0+1] == '01234'                 ","01234567890123456789","",T(1.0)),
+      test_ab<T>("'23456'              == a[r0: 7]       ","01234567890123456789","",T(1.0)),
+      test_ab<T>("'23456'              == a[2: r1+1]     ","01234567890123456789","",T(1.0)),
+      test_ab<T>("'23456'              == a[r0:3*2+1]    ","01234567890123456789","",T(1.0)),
+      test_ab<T>("'23456'              == a[1+1:r1+1]    ","01234567890123456789","",T(1.0)),
+      test_ab<T>("'234567890123456789' == a[r0:  ]       ","01234567890123456789","",T(1.0)),
+      test_ab<T>("'0123456'            == a[:1+r1]       ","01234567890123456789","",T(1.0)),
+      test_ab<T>("'23456'              == a[r0:r1+1]     ","01234567890123456789","",T(1.0)),
+      test_ab<T>("'2345678'            == a[r0:r1+3]     ","01234567890123456789","",T(1.0)),
+      test_ab<T>("'456'                == a[r0+2:r1+1]   ","01234567890123456789","",T(1.0)),
+      test_ab<T>("'4567890123456789'   == a[r1-r0:]      ","01234567890123456789","",T(1.0)),
+      test_ab<T>("'01234'              == a[:r1-r0+1]    ","01234567890123456789","",T(1.0)),
+      test_ab<T>("a[r0: 7]     == b                      ","01234567890123456789","23456",T(1.0)),
+      test_ab<T>("a[2: r1+1]   == b                      ","01234567890123456789","23456",T(1.0)),
+      test_ab<T>("a[r0:3*2+1]  == b                      ","01234567890123456789","23456",T(1.0)),
+      test_ab<T>("a[1+1:r1+1]  == b                      ","01234567890123456789","23456",T(1.0)),
+      test_ab<T>("a[r0:  ]     == b                      ","01234567890123456789","234567890123456789",T(1.0)),
+      test_ab<T>("a[:  r1+1]   == b                      ","01234567890123456789","0123456",T(1.0)),
+      test_ab<T>("a[r0:r1+1]   == b                      ","01234567890123456789","23456",T(1.0)),
+      test_ab<T>("a[r0:r1+3]   == b                      ","01234567890123456789","2345678",T(1.0)),
+      test_ab<T>("a[r0+2:r1+1] == b                      ","01234567890123456789","456",T(1.0)),
+      test_ab<T>("a[r1-r0:]    == b                      ","01234567890123456789","4567890123456789",T(1.0)),
+      test_ab<T>("a[:r1-r0+1]  == b                      ","01234567890123456789","01234",T(1.0)),
+      test_ab<T>("b == a[r0: 7]                          ","01234567890123456789","23456",T(1.0)),
+      test_ab<T>("b == a[2: r1+1]                        ","01234567890123456789","23456",T(1.0)),
+      test_ab<T>("b == a[r0:3*2+1]                       ","01234567890123456789","23456",T(1.0)),
+      test_ab<T>("b == a[1+1:r1+1]                       ","01234567890123456789","23456",T(1.0)),
+      test_ab<T>("b == a[r0:  ]                          ","01234567890123456789","234567890123456789",T(1.0)),
+      test_ab<T>("b == a[:  r1+1]                        ","01234567890123456789","0123456",T(1.0)),
+      test_ab<T>("b == a[r0:r1+1]                        ","01234567890123456789","23456",T(1.0)),
+      test_ab<T>("b == a[r0:r1+3]                        ","01234567890123456789","2345678",T(1.0)),
+      test_ab<T>("b == a[r0+2:r1+1]                      ","01234567890123456789","456",T(1.0)),
+      test_ab<T>("b == a[r1-r0:]                         ","01234567890123456789","4567890123456789",T(1.0)),
+      test_ab<T>("b == a[:r1-r0+1]                       ","01234567890123456789","01234",T(1.0)),
+      test_ab<T>("'01234567890123456789'[0:10] == a      ","0123456789","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[0:10] == a[:]   ","0123456789","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[0:10] == a[0:]  ","0123456789","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[0:10] == a[:10] ","0123456789","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[:10]  == a[:10] ","0123456789","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[10:] == a[:]    ","0123456789","",T(1.0)),
+      test_ab<T>("'01234567890123456789'[0:10] != a      ","123456789" ,"",T(1.0)),
+      test_ab<T>("'01234567890123456789'[0:10] != a[:]   ","123456789" ,"",T(1.0)),
+      test_ab<T>("'01234567890123456789'[0:10] != a[0:]  ","123456789" ,"",T(1.0)),
+      test_ab<T>("'01234567890123456789'[0:10] != a[:8]  ","123456789" ,"",T(1.0)),
+      test_ab<T>("'01234567890123456789'[:10]  != a[:8]  ","123456789" ,"",T(1.0)),
+      test_ab<T>("'01234567890123456789'[10:] != a[:]    ","123456789" ,"",T(1.0)),
+      test_ab<T>("'01234567890123456789'[2*6:10+7] == a  ","23456"     ,"",T(1.0)),
+      test_ab<T>("'23456' == a[:]                        ","23456"     ,"",T(1.0)),
+      test_ab<T>("a     == '01234567890123456789'[0:10]  ","0123456789","",T(1.0)),
+      test_ab<T>("a[:]  == '01234567890123456789'[0:10]  ","0123456789","",T(1.0)),
+      test_ab<T>("a[0:] == '01234567890123456789'[0:10]  ","0123456789","",T(1.0)),
+      test_ab<T>("a[:9] == '01234567890123456789'[0:9]   ","0123456789","",T(1.0)),
+      test_ab<T>("a[:9] == '01234567890123456789'[:9]    ","0123456789","",T(1.0)),
+      test_ab<T>("a[:]  == '01234567890123456789'[10:]   ","0123456789","",T(1.0)),
+      test_ab<T>("a     != '01234567890123456789'[0:9]   ","123456789" ,"",T(1.0)),
+      test_ab<T>("a[:]  != '01234567890123456789'[0:9]   ","123456789" ,"",T(1.0)),
+      test_ab<T>("a[0:] != '01234567890123456789'[0:9]   ","123456789" ,"",T(1.0)),
+      test_ab<T>("a[:8] != '01234567890123456789'[0:9]   ","123456789" ,"",T(1.0)),
+      test_ab<T>("a[:8] != '01234567890123456789'[:9]    ","123456789" ,"",T(1.0)),
+      test_ab<T>("a[:]  != '01234567890123456789'[10:]   ","123456789" ,"",T(1.0)),
+      test_ab<T>("a == '01234567890123456789'[2*6:10+7]  ","23456"     ,"",T(1.0)),
+      test_ab<T>("a[:] == '23456'                        ","23456"     ,"",T(1.0)),
+      test_ab<T>("a[0:10] == b        ","01234567890123456789","0123456789",T(1.0)),
+      test_ab<T>("a[0:10] == b[:]     ","01234567890123456789","0123456789",T(1.0)),
+      test_ab<T>("a[0:10] == b[0:]    ","01234567890123456789","0123456789",T(1.0)),
+      test_ab<T>("a[0:10] == b[:10]   ","01234567890123456789","0123456789",T(1.0)),
+      test_ab<T>("a[:9]  == b[:9]     ","01234567890123456789","0123456789",T(1.0)),
+      test_ab<T>("a[10:] == b[:]      ","01234567890123456789","0123456789",T(1.0)),
+      test_ab<T>("a[0:9] != b         ","01234567890123456789","123456789" ,T(1.0)),
+      test_ab<T>("a[0:9] != b[:]      ","01234567890123456789","123456789" ,T(1.0)),
+      test_ab<T>("a[0:9] != b[0:]     ","01234567890123456789","123456789" ,T(1.0)),
+      test_ab<T>("a[0:9] != b[:8]     ","01234567890123456789","123456789" ,T(1.0)),
+      test_ab<T>("a[:9]  != b[:8]     ","01234567890123456789","123456789" ,T(1.0)),
+      test_ab<T>("a[10:] != b[:]      ","01234567890123456789","123456789" ,T(1.0)),
+      test_ab<T>("a[2*6:10+7] == b    ","01234567890123456789","23456"     ,T(1.0)),
+      test_ab<T>("b     == a[0:10]    ","01234567890123456789","0123456789",T(1.0)),
+      test_ab<T>("b[:]  == a[0:10]    ","01234567890123456789","0123456789",T(1.0)),
+      test_ab<T>("b[0:] == a[0:10]    ","01234567890123456789","0123456789",T(1.0)),
+      test_ab<T>("b[:9] == a[0:9]     ","01234567890123456789","0123456789",T(1.0)),
+      test_ab<T>("b[:9] == a[:9]      ","01234567890123456789","0123456789",T(1.0)),
+      test_ab<T>("b[:]  == a[10:]     ","01234567890123456789","0123456789",T(1.0)),
+      test_ab<T>("b     != a[0:9]     ","01234567890123456789","123456789" ,T(1.0)),
+      test_ab<T>("b[:]  != a[0:9]     ","01234567890123456789","123456789" ,T(1.0)),
+      test_ab<T>("b[0:] != a[0:9]     ","01234567890123456789","123456789" ,T(1.0)),
+      test_ab<T>("b[:8] != a[0:9]     ","01234567890123456789","123456789" ,T(1.0)),
+      test_ab<T>("b[:8] != a[:9]      ","01234567890123456789","123456789" ,T(1.0)),
+      test_ab<T>("b[:]  != a[10:]     ","01234567890123456789","123456789" ,T(1.0)),
+      test_ab<T>("b == a[2*6:10+7]    ","01234567890123456789","23456"     ,T(1.0)),
+      test_ab<T>("a[2:7] == b"         ,"0123456789","23456"               ,T(1.0)),
+      test_ab<T>("a == b[2:7]"         ,"23456","0123456789"               ,T(1.0)),
+      test_ab<T>("a[1+1:2*3+1] == b"   ,"0123456789","23456"               ,T(1.0)),
+      test_ab<T>("a == b[4/2:sqrt(49)]","23456","0123456789"               ,T(1.0)),
+      test_ab<T>("a[0:7] == b"         ,"0123456789","0123456"             ,T(1.0)),
+      test_ab<T>("a[:7] == b"          ,"0123456789","0123456"             ,T(1.0)),
+      test_ab<T>("a[4/2-2:2+5] == b"   ,"0123456789","0123456"             ,T(1.0)),
+      test_ab<T>("a[:12/2+1] == b"     ,"0123456789","0123456"             ,T(1.0)),
+      test_ab<T>("a[0:] == b"          ,"0123456","0123456"                ,T(1.0)),
+      test_ab<T>("a[:] == b"           ,"0123456","0123456"                ,T(1.0)),
+      test_ab<T>("a == b[0:7]"         ,"0123456","0123456789"             ,T(1.0)),
+      test_ab<T>("a == b[:7]"          ,"0123456","0123456789"             ,T(1.0)),
+      test_ab<T>("a == b[4/2-2:2+5]"   ,"0123456","0123456789"             ,T(1.0)),
+      test_ab<T>("a == b[:12/2+1]"     ,"0123456","0123456789"             ,T(1.0)),
+      test_ab<T>("a == b[0:]"          ,"0123456","0123456"                ,T(1.0)),
+      test_ab<T>("a == b[:]"           ,"0123456","0123456"                ,T(1.0)),
+      test_ab<T>("a[:10] == b[0:10]"   ,"0123456789","01234567890123456789",T(1.0)),
+      test_ab<T>("a[0:10] == b[0:10]"  ,"0123456789","01234567890123456789",T(1.0)),
+      test_ab<T>("a[0:] == b[0:10]"    ,"0123456789","01234567890123456789",T(1.0)),
+      test_ab<T>("a[:] == b[0:10]"     ,"0123456789","01234567890123456789",T(1.0)),
       test_ab<T>("a[:] == b[10:]"      ,"0123456789","01234567890123456789",T(1.0)),
       test_ab<T>("'!@#$%^&*([{}])-=' != ')]}{[(*&^%$#@!'","","",T(1.0)),
       test_ab<T>("('!@#$%^&*([{}])-=') != (')]}{[(*&^%$#@!')","","",T(1.0)),
@@ -10395,6 +10395,8 @@
    typedef exprtk::parser<T>       parser_t;
    typedef exprtk::parser_error::type error_type;
 
+   bool error_found = false;
+
    {
       T x = T(1.1);
       T y = T(2.2);
@@ -10448,8 +10450,6 @@
 
       static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
 
-      bool error_found = false;
-
       for (std::size_t i = 0; i < expression_list_size; ++i)
       {
          expression_t expression;
@@ -10542,8 +10542,6 @@
 
       static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
 
-      bool error_found = false;
-
       for (std::size_t i = 0; i < expression_list_size; ++i)
       {
          expression_t expression;
@@ -10823,8 +10821,6 @@
 
       const std::size_t expressions_size = sizeof(expressions) / sizeof(local_test_t);
 
-      bool error_found = false;
-
       for (std::size_t i = 0; i < expressions_size; ++i)
       {
          const std::string expression_str   = expressions[i].first;
@@ -11014,8 +11010,6 @@
       symbol_table.add_variable("b", b);
       symbol_table.add_variable("c", c);
 
-      bool error_found = false;
-
       for (std::size_t e = 0; e < expressions_size; ++e)
       {
          const std::string& expression_string = invalid_expressions[e];
@@ -11323,8 +11317,6 @@
          "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(x + vv8))[i / x] == i + x; }; successes == vv8[]",
       };
 
-      bool error_found = false;
-
       for (std::size_t e = 0; e < sizeof(expressions)/sizeof(std::string); ++e)
       {
          T vs8[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
@@ -11424,21 +11416,30 @@
          "sum(vv0 * 2) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
          "sum(2vv0 + 1) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
          "sum(1 + 2vv0) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
+         "sum((2 * vv0) + 1) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
+         "sum(1 + (2 * vv0)) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
+         "sum((vv0 * 2) + 1) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
+         "sum(1 + (vv0 * 2)) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
          "var x := 1; sum(2vv0 + x) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
          "var x := 1; sum(x + 2vv0) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
+         "var x := 1; sum((2 * vv0) + x) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
+         "var x := 1; sum(x + (2 * vv0)) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
+         "var x := 1; sum((vv0 * 2) + x) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
+         "var x := 1; sum(x + (vv0 * 2)) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
          "sum(vv0 += 1) == (vv0[] * (vv0[] + 1) / 2 + vv0[]) and (vv0[] == vv0_size)",
          "var x:= 1; sum(vv0 += x) == (vv0[] * (vv0[] + 1) / 2 + x * vv0[]) and (vv0[] == vv0_size)",
          "var x:= 1; sum(vv0 -= x) == (vv0[] * (vv0[] + 1 - 2x) / 2) and (vv0[] == vv0_size)",
          "(sum(2vv0) == 2 * sum(vv0)) and (vv0[] == vv0_size)",
+         "(sum(2 * vv0) == 2 * sum(vv0)) and (vv0[] == vv0_size)",
          "(sum(vv0 * 2) == 2 * sum(vv0)) and (vv0[] == vv0_size)",
          "var x:= 1; sum(2vv0) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
+         "var x:= 1; sum(2 * vv0) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
+         "var x:= 1; sum(vv0 * 2) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
          "var x := 2; sum(if (x > 1) { vv0 } else { vv1 }) == sum(vv0)",
          "dot(2 * vv0,vv1 - 1) + dot(2 * vv0,vv1 - 1) == 2sum(2vv0 * (vv1 - 1))",
          "(0 * dot(2 * vv0,vv1 - 1)) == 0"
       };
 
-      bool error_found = false;
-
       for (std::size_t e = 0; e < sizeof(expressions) / sizeof(std::string); ++e)
       {
          const T vanilla[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
@@ -11490,6 +11491,8 @@
                       error.diagnostic.c_str());
             }
 
+            error_found = true;
+
             continue;
          }
 
@@ -11510,6 +11513,8 @@
                       static_cast<unsigned int>(i),
                       result,
                       expression_string.c_str());
+
+               error_found = true;
             }
          }
 
@@ -11599,6 +11604,7 @@
       if (expression.value() != T(1))
       {
          printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (1)\n", value0);
+         error_found = true;
       }
 
       vv.rebase(v1.data());
@@ -11609,6 +11615,7 @@
       if (expression.value() != T(1))
       {
          printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (1)\n", value1);
+         error_found = true;
       }
 
       vv.rebase(v0.data());
@@ -11686,6 +11693,7 @@
       if (expression.value() != T(1))
       {
          printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (2)\n", value0);
+         error_found = true;
       }
 
       vv.rebase(v1.data());
@@ -11696,6 +11704,7 @@
       if (expression.value() != T(1))
       {
          printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (2)\n", value1);
+         error_found = true;
       }
 
       vv.rebase(v0.data());
@@ -11704,6 +11713,390 @@
       expression.release();
    }
 
+   {
+      const std::size_t max_vector_size = 10;
+
+      std::vector<T> vec1(max_vector_size, 1);
+      std::vector<T> vec2(max_vector_size, 2);
+      std::vector<T> vec3(max_vector_size, 3);
+
+      const std::string expressions[] =
+      {
+         "return [x + 10]",
+         "return [10 + x]",
+         "return [2x + 10]",
+         "return [10 + 2x]",
+         "return [(x * 2) + 10]",
+         "return [10 + (x * 2)]",
+         "return [(2 * x) + 10]",
+         "return [10 + (2 * x)]",
+         "return [x + k]",
+         "return [k + x]",
+         "return [2x + k]",
+         "return [k + 2x]",
+         "return [(x * 2) + k]",
+         "return [k + (x * 2)]",
+         "return [(2 * x) + k]",
+         "return [k + (2 * x)]",
+         "return [x + y]" ,
+         "return [y + x]" ,
+         "return [2x + y]",
+         "return [y + 2x]",
+         "return [2x + 2y]",
+         "return [2y + 2x]",
+         "return [(2 * x) + y]",
+         "return [y + (2 * x)]",
+         "return [(x * 2) + y]",
+         "return [y + (x * 2)]",
+         "return [(2 * x) + (2 * y)]",
+         "return [(2 * y) + (2 * x)]",
+         "return [(x * 2) + (y * 2)]",
+         "return [(y * 2) + (x * 2)]",
+      };
+
+      const T expected_values[] =
+      {
+         T(2 + 10),
+         T(2 + 10),
+         T(2 * 2 + 10),
+         T(2 * 2 + 10),
+         T(2 * 2 + 10),
+         T(2 * 2 + 10),
+         T(2 * 2 + 10),
+         T(2 * 2 + 10),
+         T(2 + 10),
+         T(2 + 10),
+         T(2 * 2 + 10),
+         T(2 * 2 + 10),
+         T(2 * 2 + 10),
+         T(2 * 2 + 10),
+         T(2 * 2 + 10),
+         T(2 * 2 + 10),
+         T(2 + 3),
+         T(3 + 2),
+         T(2 * 2 + 3),
+         T(3 + 2 * 2),
+         T(2 * 2 + 2 * 3),
+         T(2 * 3 + 2 * 2),
+         T(2 * 2 + 3),
+         T(3 + (2 * 2)),
+         T(2 * 2 + 3),
+         T(3 + 2 * 2),
+         T(2 * 2 + 2 * 3),
+         T(2 * 3 + 2 * 2),
+         T(2 * 2 + 3 * 2),
+         T(3 * 2 + 2 * 2),
+      };
+
+      const std::size_t expressions_size = sizeof(expressions) / sizeof(std::string);
+
+      for (std::size_t i = 0; i < expressions_size; ++i)
+      {
+         const std::string& expression_string = expressions[i];
+
+         exprtk::vector_view<T> x_view = exprtk::make_vector_view(vec1, vec1.size());
+
+         for (std::size_t vector_size = 1; vector_size <= 10; ++vector_size)
+         {
+            symbol_table_t symbol_table;
+            expression_t   expression;
+            parser_t       parser;
+
+            T k = T(10);
+
+            symbol_table.add_variable("k", k     );
+            symbol_table.add_vector  ("x", x_view);
+            symbol_table.add_vector  ("y", vec3  );
+
+            expression.register_symbol_table(symbol_table);
+
+            if (!parser.compile(expression_string, expression))
+            {
+               printf("run_test21() - Error: %s\tExpression: %s\n",
+                     parser.error().c_str(),
+                     expression_string.c_str());
+
+               error_found = true;
+
+               continue;
+            }
+
+            x_view.rebase(vec2.data());
+
+            x_view.set_size(vector_size);
+
+            expression.value();
+
+            if (!expression.return_invoked())
+            {
+               printf("run_test21() - Error: expected return_invoked for expression: %s\n",
+                      expression_string.c_str());
+
+               error_found = true;
+
+               continue;
+            }
+
+            const exprtk::results_context<T>& results = expression.results();
+
+            if (results.count() != 1)
+            {
+               printf("run_test21() - Error: expected 1 return value, instead got: %d for expression: %s\n",
+                      static_cast<int>(results.count()),
+                      expression_string.c_str());
+
+               error_found = true;
+
+               continue;
+            }
+
+            if (results[0].type != exprtk::results_context<T>::type_store_t::e_vector)
+            {
+               printf("run_test21() - Error: expected vector type for return value for expression: %s\n",
+                      expression_string.c_str());
+
+               error_found = true;
+
+               continue;
+            }
+
+            typename exprtk::type_store<T>::vector_view vector(results[0]);
+
+            if (vector.size() != vector_size)
+            {
+               printf("run_test21() - Error: expected vector size %d instead got: %d for expression: %s\n",
+                      static_cast<int>(vector_size),
+                      static_cast<int>(vector.size()),
+                      expression_string.c_str());
+
+               error_found = true;
+
+               continue;
+            }
+
+            for (std::size_t j = 0; j < vector.size(); ++j)
+            {
+               if (vector[j] != expected_values[i])
+               {
+                  printf("run_test21() - Error: expected vector[%d] expected %f instead got: %f for expression: %s\n",
+                         static_cast<int>(j),
+                         expected_values[i],
+                         vector[j],
+                         expression_string.c_str());
+
+                  error_found = true;
+               }
+            }
+         }
+      }
+   }
+
+   {
+      expression_t expression;
+      parser_t     parser;
+
+      std::string expressions[] =
+      {
+         "1 + 2"         ,
+         "return [1 + 2]",
+         "z + 2"         ,
+         "1 + 2"         ,
+         "z + 2"
+      };
+
+      typedef std::pair<T,bool> return_test_t;
+
+      return_test_t expected_results[] =
+      {
+         return_test_t(3                                   , false ),
+         return_test_t(std::numeric_limits<T>::quiet_NaN() , true  ),
+         return_test_t(std::numeric_limits<T>::quiet_NaN() , false ),
+         return_test_t(3                                   , false ),
+         return_test_t(std::numeric_limits<T>::quiet_NaN() , false )
+      };
+
+      const std::size_t expressions_size = sizeof(expressions) / sizeof(std::string);
+
+      for (std::size_t i = 0; i < expressions_size; ++i)
+      {
+         const std::string& expression_string = expressions[i];
+
+         parser.compile(expression_string, expression);
+
+         return_test_t& expected_result = expected_results[i];
+
+         const T    result      = expression.value();
+         const bool ret_invoked = expression.return_invoked();
+
+         const bool result_check = std::isnan(result) ? std::isnan(expected_result.first) : result == expected_result.first;
+
+         if (!result_check || (ret_invoked != expected_result.second))
+         {
+            printf("run_test21() - Error: Expression: %s result: %f ret_invoked: %c  "
+                   "expected result: %f ret_invoked: %c \n",
+                   expression_string.c_str(),
+                   result,
+                   ret_invoked ? 'T' : 'F',
+                   expected_result.first,
+                   expected_result.second ? 'T' : 'F');
+
+            error_found = true;
+
+            continue;
+         }
+      }
+
+   }
+
+   {
+      const std::size_t max_vector_size = 10;
+
+      std::vector<T> vec1(max_vector_size, 1);
+      std::vector<T> vec2(max_vector_size, 2);
+
+      std::vector<T> vec3(max_vector_size / 2, 3);
+
+      const std::string expressions[] =
+      {
+         "return [x + y]" ,
+         "return [y + x]" ,
+         "return [2x + y]",
+         "return [y + 2x]",
+         "return [2x + 2y]",
+         "return [2y + 2x]",
+         "return [(2 * x) + y]",
+         "return [y + (2 * x)]",
+         "return [(x * 2) + y]",
+         "return [y + (x * 2)]",
+         "return [(2 * x) + (2 * y)]",
+         "return [(2 * y) + (2 * x)]",
+         "return [(x * 2) + (y * 2)]",
+         "return [(y * 2) + (x * 2)]",
+      };
+
+      const T expected_values[] =
+      {
+         T(2 + 3),
+         T(3 + 2),
+         T(2 * 2 + 3),
+         T(3 + 2 * 2),
+         T(2 * 2 + 2 * 3),
+         T(2 * 3 + 2 * 2),
+         T(2 * 2 + 3),
+         T(3 + (2 * 2)),
+         T(2 * 2 + 3),
+         T(3 + 2 * 2),
+         T(2 * 2 + 2 * 3),
+         T(2 * 3 + 2 * 2),
+         T(2 * 2 + 3 * 2),
+         T(3 * 2 + 2 * 2),
+      };
+
+      const std::size_t expressions_size = sizeof(expressions) / sizeof(std::string);
+
+      for (std::size_t i = 0; i < expressions_size; ++i)
+      {
+         const std::string& expression_string = expressions[i];
+
+         exprtk::vector_view<T> x_view = exprtk::make_vector_view(vec1, vec1.size());
+
+         for (std::size_t vector_size = vec3.size() + 1; vector_size <= 10; ++vector_size)
+         {
+            symbol_table_t symbol_table;
+            expression_t   expression;
+            parser_t       parser;
+
+            symbol_table.add_vector  ("x", x_view);
+            symbol_table.add_vector  ("y", vec3  );
+
+            expression.register_symbol_table(symbol_table);
+
+            if (!parser.compile(expression_string, expression))
+            {
+               printf("run_test21() - Error: %s\tExpression: %s\n",
+                      parser.error().c_str(),
+                      expression_string.c_str());
+
+               error_found = true;
+
+               continue;
+            }
+
+            x_view.rebase(vec2.data());
+
+            x_view.set_size(vector_size);
+
+            expression.value();
+
+            if (!expression.return_invoked())
+            {
+               printf("run_test21() - Error: expected return_invoked for expression: %s\n",
+                      expression_string.c_str());
+
+               error_found = true;
+
+               continue;
+            }
+
+            const exprtk::results_context<T>& results = expression.results();
+
+            if (results.count() != 1)
+            {
+               printf("run_test21() - Error: expected 1 return value, instead got: %d for expression: %s\n",
+                      static_cast<int>(results.count()),
+                      expression_string.c_str());
+
+               error_found = true;
+
+               continue;
+            }
+
+            if (results[0].type != exprtk::results_context<T>::type_store_t::e_vector)
+            {
+               printf("run_test21() - Error: expected vector type for return value for expression: %s\n",
+                      expression_string.c_str());
+
+               error_found = true;
+
+               continue;
+            }
+
+            typename exprtk::type_store<T>::vector_view vector(results[0]);
+
+            if (vector.size() != vec3.size())
+            {
+               printf("run_test21() - Error: expected vector size %d instead got: %d for expression: %s\n",
+                      static_cast<int>(vec3.size()),
+                      static_cast<int>(vector.size()),
+                      expression_string.c_str());
+
+               error_found = true;
+
+               continue;
+            }
+
+            for (std::size_t j = 0; j < vector.size(); ++j)
+            {
+               if (vector[j] != expected_values[i])
+               {
+                  printf("run_test21() - Error: expected vector[%d] expected %f instead got: %f for expression: %s\n",
+                         static_cast<int>(j),
+                         expected_values[i],
+                         vector[j],
+                         expression_string.c_str());
+
+                  error_found = true;
+               }
+            }
+         }
+      }
+   }
+
+   if (error_found)
+   {
+      return false;
+   }
+
    return true;
 }
 
diff --git a/license.txt b/license.txt
index 1135827..7fd57f6 100644
--- a/license.txt
+++ b/license.txt
@@ -1,6 +1,6 @@
 MIT License
 
-Copyright (c) 1999-2024 Arash Partow
+Copyright (c) 1999-2025 Arash Partow
 
 https://www.partow.net/programming/exprtk/index.html
 
diff --git a/readme.txt b/readme.txt
index 6400116..bfc3e39 100644
--- a/readme.txt
+++ b/readme.txt
@@ -122,7 +122,7 @@
 
    (1) https://www.opensource.org/licenses/MIT
    (2) SPDX-License-Identifier: MIT
-   (3) SPDX-FileCopyrightText : Copyright (C) 1999-2024 Arash Partow
+   (3) SPDX-FileCopyrightText : Copyright (C) 1999-2025 Arash Partow
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -439,13 +439,13 @@
 |          | matches respectively.                                   |
 |          | (eg: x ilike y or 'a1B2c3D4e5F6g7H' ilike 'a?d*h')      |
 +----------+---------------------------------------------------------+
-| [r0:r1]  | The closed interval[r0,r1] of the specified string.     |
+| [r0:r1]  | The half-open interval [r0,r1) of the specified string. |
 |          | eg: Given a string x with a value of 'abcdefgh' then:   |
-|          | 1. x[1:4] == 'bcde'                                     |
-|          | 2. x[ :4] == x[:8 / 2] == 'abcde'                       |
+|          | 1. x[1:5] == 'bcde'                                     |
+|          | 2. x[ :5] == x[:8 / 2 + 1] == 'abcde'                   |
 |          | 3. x[2 + 1: ] == x[3:] =='defgh'                        |
 |          | 4. x[ : ] == x[:] == 'abcdefgh'                         |
-|          | 5. x[4/2:3+1] == x[2:4] == 'cde'                        |
+|          | 5. x[4/2:3+2] == x[2:5] == 'cde'                        |
 |          |                                                         |
 |          | Note: Both r0 and r1 are assumed to be integers, where  |
 |          | r0 <= r1. They may also be the result of an expression, |
@@ -821,8 +821,8 @@
 
 
 A compiled expression that references variables from a symbol_table is
-dependent on  that symbol_table  instance and  the variables  it holds
-being valid.
+said to be dependent on  that symbol_table instance and the  variables
+it holds being valid.
 
    typedef exprtk::symbol_table<double> symbol_table_t;
    typedef exprtk::expression<double>   expression_t;
@@ -2612,7 +2612,7 @@
       typedef typename exprtk::igeneric_function<T>::parameter_list_t
                                                      parameter_list_t;
 
-      moo()
+      roo()
       : exprtk::igeneric_function<T>("SVTT|SS|TTV|S?V*S")
       {}
 
@@ -3055,12 +3055,12 @@
    (5) None          x + y + z
 
 
-Note23: In  expression 4,  both variables  'w' and  'z' are denoted as
+Note23: In  Expression 4,  both variables  'w' and  'z' are denoted as
 being assignments even though only one of them can ever be modified at
-the time of evaluation. Furthermore the determination of which of  the
-two variables the modification will occur upon can only be known  with
-certainty at evaluation time and not beforehand, hence both are listed
-as being candidates for assignment.
+the time of  evaluation. Furthermore determining  of which of  the two
+variables the  modification will  occur upon  can only  be known  with
+certainty at evaluation time  (aka runtime) and not  beforehand, hence
+both are listed as being candidates for assignment.
 
 The following builds upon the previous example demonstrating the usage
 of the DEC in determining the 'assignments' of the given expression:
@@ -4408,18 +4408,19 @@
 
 (3) Vector Operations functions:
 
-   (a) all_true     (b) all_false
-   (c) any_true     (d) any_false
-   (e) assign       (f) count
-   (g) copy         (h) reverse
-   (i) rotate-left  (j) rotate-right
-   (k) shift-left   (l) shift-right
-   (m) sort         (n) nth_element
-   (o) iota         (p) sumk
-   (q) axpy         (r) axpby
-   (s) axpyz        (t) axpbyz
-   (u) axpbz        (v) dot
-   (w) dotk         (x) diff
+   (00) all_true     (01) all_false
+   (02) any_true     (03) any_false
+   (04) assign       (05) count
+   (06) copy         (07) reverse
+   (08) rotate-left  (09) rotate-right
+   (10) shift-left   (11) shift-right
+   (12) sort         (13) nth_element
+   (14) iota         (15) sumk
+   (16) axpy         (17) axpby
+   (18) axpyz        (19) axpbyz
+   (20) axpbz        (21) dot
+   (22) dotk         (23) diff
+   (24) select       (25) min/max_elementwise
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -4742,9 +4743,10 @@
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 [SECTION 24 - RUNTIME CHECKS]
-The  ExprTk library   provides the ability  to perform runtime  checks
-during expression evaluation so as  to ensure memory access  violation
-errors  are  caught and  handled  without causing further  issues. The
+The  ExprTk library  provides the  ability to  perform runtime  checks
+during expression evaluation so as to ensure situations such as memory
+access violation, compilation stack-overflow and evaluation time limit
+errors  are caught  and handled  without causing  further issues.  The
 checks typically cover:
 
    1. Vector access and handling
@@ -4965,13 +4967,13 @@
    typedef exprtk::parser<T> parser_t;
    typedef exprtk::loop_runtime_check loop_runtime_check_t;
 
-   my_loop_rtc loop_rtc;
+   my_loop_rtc loop_runtime_check;
    loop_runtime_check.loop_set = loop_runtime_check_t::e_all_loops;
    loop_runtime_check.max_loop_iterations = 100000;
 
    parser_t parser;
 
-   parser.register_loop_runtime_check(loop_rtc);
+   parser.register_loop_runtime_check(loop_runtime_check);
 
 
 The following is an example of how one could derive from and implement
@@ -4987,7 +4989,7 @@
       }
 
       void handle_runtime_violation
-         (const exprtk::violation_context&) override
+         (const violation_context&) override
       {
          throw std::runtime_error("Loop runtime violation.");
       }
@@ -5074,7 +5076,7 @@
    .
    .
    .
-   using std::chrono;
+   using namespace std::chrono;
    const auto max_duration = seconds(25);
 
    try
@@ -5155,7 +5157,8 @@
          return true;
       }
 
-      using time_point_t = std::chrono::time_point<std::chrono::steady_clock>;
+      using namespace std::chrono;
+      using time_point_t = time_point<steady_clock>;
 
       void set_timeout_time(const time_point_t& timeout_tp)
       {
@@ -5183,9 +5186,10 @@
    parser.
       register_compilation_timeout_check(compilation_timeout_check);
 
-   const auto max_duration = std::chrono::seconds(5);
-   const auto timeout_tp   =
-      std::chrono::steady_clock::now() + max_duration;
+   using namespace std::chrono;
+
+   const auto max_duration = seconds(5);
+   const auto timeout_tp   = steady_clock::now() + max_duration;
 
    compilation_timeout_check.set_timeout_time(timeout_tp);
 
@@ -5316,16 +5320,18 @@
    parser.
       register_compilation_timeout_check(compilation_timeout_check);
 
+   using namespace std::chrono;
+
    const auto compile_timeout_tp = []()
    {
-      const auto max_duration = std::chrono::seconds(5);
-      return std::chrono::steady_clock::now() + max_duration;
+      const auto max_duration = seconds(5);
+      return steady_clock::now() + max_duration;
    };
 
    const auto loop_timeout_tp = []()
    {
-      const auto max_duration = std::chrono::seconds(10);
-      return std::chrono::steady_clock::now() + max_duration;
+      const auto max_duration = seconds(10);
+      return steady_clock::now() + max_duration;
    };
 
    const std::vector<std::string> expressions =
@@ -5525,7 +5531,7 @@
 
  (02) Supported types  are float,  double, long  double and MPFR/GMP.
       Generally any user defined numerical type that supports all the
-      basic floating  point arithmetic  operations: -,+,*,/,^,%  etc;
+      basic floating point arithmetic operations: -, +, *,/,^, % etc;
       unary and binary operations: sin,cos,min,max,equal etc and  any
       other ExprTk dependent operations can be used to specialise the
       various components: expression, parser and symbol_table.
@@ -5561,7 +5567,7 @@
       storage capacity.
 
  (09) The  life-time of  objects registered  with or  created from  a
-      specific symbol-table must  span at least  the lifetime of  the
+      specific symbol-table must, at least, span the lifetime of  the
       symbol  table  instance  and  all  compiled  expressions  which
       utilise objects, such as variables, strings, vectors,  function
       compositor  functions  and  functions  of  that   symbol-table,
@@ -5999,63 +6005,65 @@
    (03) exprtk_binomial_coefficient.cpp
    (04) exprtk_bsm_benchmark.cpp
    (05) exprtk_calc.cpp
-   (06) exprtk_collatz.cpp
-   (07) exprtk_compilation_timeout.cpp
-   (08) exprtk_degree_trigonometry_example.cpp
-   (09) exprtk_exprgen.cpp
-   (00) exprtk_extract_dependents.cpp
-   (11) exprtk_e_10kdigits.cpp
-   (12) exprtk_factorize_fermat.cpp
-   (13) exprtk_factorize_pollard.cpp
-   (14) exprtk_fizzbuzz.cpp
-   (15) exprtk_funcall_benchmark.cpp
-   (16) exprtk_game_of_life.cpp
-   (17) exprtk_gcd.cpp
-   (18) exprtk_gnuplot.cpp
-   (19) exprtk_gnuplot_multi.cpp
-   (10) exprtk_groups_examples.cpp
-   (21) exprtk_immutable_symbol_table_example.cpp
-   (22) exprtk_import_packages.cpp
-   (23) exprtk_instruction_primer.cpp
-   (24) exprtk_jump_diffusion_process.cpp
-   (25) exprtk_loop_timeout_rtc.cpp
-   (26) exprtk_magic_square.cpp
-   (27) exprtk_mandelbrot.cpp
-   (28) exprtk_max_subarray_sum.cpp
-   (29) exprtk_maze_generator.cpp
-   (20) exprtk_miller_rabin_primality_test.cpp
-   (31) exprtk_montecarlo_e.cpp
-   (32) exprtk_montecarlo_option_pricing_model.cpp
-   (33) exprtk_montecarlo_pi.cpp
-   (34) exprtk_naive_primes.cpp
-   (35) exprtk_normal_random_marsaglia_method.cpp
-   (36) exprtk_nqueens_problem.cpp
-   (37) exprtk_nthroot_bisection.cpp
-   (38) exprtk_ornstein_uhlenbeck_process.cpp
-   (39) exprtk_pascals_triangle.cpp
-   (30) exprtk_pi_10kdigits.cpp
-   (41) exprtk_prime_sieve.cpp
-   (42) exprtk_prime_sieve_vectorized.cpp
-   (43) exprtk_pyramid.cpp
-   (44) exprtk_pythagorean_triples.cpp
-   (45) exprtk_recursive_fibonacci.cpp
-   (46) exprtk_repl.cpp
-   (47) exprtk_riddle.cpp
-   (48) exprtk_rtc_overhead.cpp
-   (49) exprtk_sudoku_solver.cpp
-   (50) exprtk_sumofprimes.cpp
-   (51) exprtk_symtab_functions.cpp
-   (52) exprtk_testgen.cpp
-   (53) exprtk_tower_of_hanoi.cpp
-   (54) exprtk_truthtable_gen.cpp
-   (55) exprtk_vectorized_binomial_model.cpp
-   (56) exprtk_vectornorm.cpp
-   (57) exprtk_vector_benchmark.cpp
-   (58) exprtk_vector_benchmark_multithreaded.cpp
-   (59) exprtk_vector_resize_example.cpp
-   (60) exprtk_vector_resize_inline_example.cpp
-   (61) exprtk_wiener_process_pi.cpp
-
+   (06) exprtk_chladni_contour.cpp
+   (07) exprtk_collatz.cpp
+   (08) exprtk_compilation_timeout.cpp
+   (09) exprtk_degree_trigonometry_example.cpp
+   (00) exprtk_exprgen.cpp
+   (11) exprtk_extract_dependents.cpp
+   (12) exprtk_e_10kdigits.cpp
+   (13) exprtk_factorize_fermat.cpp
+   (14) exprtk_factorize_pollard.cpp
+   (15) exprtk_fizzbuzz.cpp
+   (16) exprtk_funcall_benchmark.cpp
+   (17) exprtk_game_of_life.cpp
+   (18) exprtk_gcd.cpp
+   (19) exprtk_gnuplot.cpp
+   (10) exprtk_gnuplot_multi.cpp
+   (21) exprtk_groups_examples.cpp
+   (22) exprtk_immutable_symbol_table_example.cpp
+   (23) exprtk_import_packages.cpp
+   (24) exprtk_instruction_primer.cpp
+   (25) exprtk_julia_set_fractal.cpp
+   (26) exprtk_jump_diffusion_process.cpp
+   (27) exprtk_loop_timeout_rtc.cpp
+   (28) exprtk_magic_square.cpp
+   (29) exprtk_mandelbrot.cpp
+   (20) exprtk_max_subarray_sum.cpp
+   (31) exprtk_maze_generator.cpp
+   (32) exprtk_miller_rabin_primality_test.cpp
+   (33) exprtk_montecarlo_e.cpp
+   (34) exprtk_montecarlo_option_pricing_model.cpp
+   (35) exprtk_montecarlo_pi.cpp
+   (36) exprtk_naive_primes.cpp
+   (37) exprtk_normal_random_marsaglia_method.cpp
+   (38) exprtk_nqueens_problem.cpp
+   (39) exprtk_nthroot_bisection.cpp
+   (30) exprtk_ornstein_uhlenbeck_process.cpp
+   (41) exprtk_pascals_triangle.cpp
+   (42) exprtk_pi_10kdigits.cpp
+   (43) exprtk_prime_sieve.cpp
+   (44) exprtk_prime_sieve_vectorized.cpp
+   (45) exprtk_pyramid.cpp
+   (46) exprtk_pythagorean_triples.cpp
+   (47) exprtk_radial_contour.cpp
+   (48) exprtk_recursive_fibonacci.cpp
+   (49) exprtk_repl.cpp
+   (50) exprtk_riddle.cpp
+   (51) exprtk_rtc_overhead.cpp
+   (52) exprtk_sudoku_solver.cpp
+   (53) exprtk_sumofprimes.cpp
+   (54) exprtk_symtab_functions.cpp
+   (55) exprtk_testgen.cpp
+   (56) exprtk_tower_of_hanoi.cpp
+   (57) exprtk_truthtable_gen.cpp
+   (58) exprtk_vectorized_binomial_model.cpp
+   (59) exprtk_vectornorm.cpp
+   (60) exprtk_vector_benchmark.cpp
+   (61) exprtk_vector_benchmark_multithreaded.cpp
+   (62) exprtk_vector_resize_example.cpp
+   (63) exprtk_vector_resize_inline_example.cpp
+   (64) exprtk_wiener_process_pi.cpp
 
 Details for each of the above examples can be found here: