@ -1,10 +1,8 @@ 
			
		
	
		
		
			
				
					
					// [ImGui] this is a slightly modified version of stb_textedit.h 1.9. Those changes would need to be pushed into nothings/stb
 // [ImGui] this is a slightly modified version of stb_textedit.h 1.12. Those changes would need to be pushed into nothings/stb
  
			
				
				
			
		
	
		
		
			
				
					
					// [ImGui] - fixed linestart handler when over last character of multi-line buffer + simplified existing code (#588, #815)
 // [ImGui] - 2018-06: fix in stb_textedit_discard_redo (see https://github.com/nothings/stb/issues/321)
  
			
				
				
			
		
	
		
		
			
				
					
					// [ImGui] - fixed a state corruption/crash bug in stb_text_redo and stb_textedit_discard_redo (#715)
  
			
		
	
		
		
			
				
					
					// [ImGui] - fixed a crash bug in stb_textedit_discard_redo (#681)
  
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					// [ImGui] - fixed some minor warnings
 // [ImGui] - fixed some minor warnings
  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					// stb_textedit.h - v1.9   - public domain - Sean Barrett
 // stb_textedit.h - v1.12   - public domain - Sean Barrett
  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					// Development of this library was sponsored by RAD Game Tools
 // Development of this library was sponsored by RAD Game Tools
  
			
		
	
		
		
			
				
					
					//
 //
  
			
		
	
		
		
			
				
					
					// This C header file implements the guts of a multi-line text-editing
 // This C header file implements the guts of a multi-line text-editing
  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -23,9 +21,7 @@ 
			
		
	
		
		
			
				
					
					//
 //
  
			
		
	
		
		
			
				
					
					// LICENSE
 // LICENSE
  
			
		
	
		
		
			
				
					
					//
 //
  
			
		
	
		
		
			
				
					
					//   This software is dual-licensed to the public domain and under the following
 // See end of file for license information.
  
			
				
				
			
		
	
		
		
			
				
					
					//   license: you are granted a perpetual, irrevocable license to copy, modify,
  
			
		
	
		
		
			
				
					
					//   publish, and distribute this file as you see fit.
  
			
		
	
		
		
	
		
		
			
				
					
					//
 //
  
			
		
	
		
		
			
				
					
					//
 //
  
			
		
	
		
		
			
				
					
					// DEPENDENCIES
 // DEPENDENCIES
  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -37,6 +33,9 @@ 
			
		
	
		
		
			
				
					
					//
 //
  
			
		
	
		
		
			
				
					
					// VERSION HISTORY
 // VERSION HISTORY
  
			
		
	
		
		
			
				
					
					//
 //
  
			
		
	
		
		
			
				
					
					//   1.12 (2018-01-29) user can change STB_TEXTEDIT_KEYTYPE, fix redo to avoid crash
  
			
		
	
		
		
			
				
					
					//   1.11 (2017-03-03) fix HOME on last line, dragging off single-line textfield
  
			
		
	
		
		
			
				
					
					//   1.10 (2016-10-25) supress warnings about casting away const with -Wcast-qual
  
			
		
	
		
		
			
				
					
					//   1.9  (2016-08-27) customizable move-by-word
 //   1.9  (2016-08-27) customizable move-by-word
  
			
		
	
		
		
			
				
					
					//   1.8  (2016-04-02) better keyboard handling when mouse button is down
 //   1.8  (2016-04-02) better keyboard handling when mouse button is down
  
			
		
	
		
		
			
				
					
					//   1.7  (2015-09-13) change y range handling in case baseline is non-0
 //   1.7  (2015-09-13) change y range handling in case baseline is non-0
  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -55,12 +54,13 @@ 
			
		
	
		
		
			
				
					
					//
 //
  
			
		
	
		
		
			
				
					
					//   Ulf Winklemann: move-by-word in 1.1
 //   Ulf Winklemann: move-by-word in 1.1
  
			
		
	
		
		
			
				
					
					//   Fabian Giesen: secondary key inputs in 1.5
 //   Fabian Giesen: secondary key inputs in 1.5
  
			
		
	
		
		
			
				
					
					//   Martins Mozeiko: STB_TEXTEDIT_memmove
 //   Martins Mozeiko: STB_TEXTEDIT_memmove in 1.6 
  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					//
 //
  
			
		
	
		
		
			
				
					
					//   Bugfixes:
 //   Bugfixes:
  
			
		
	
		
		
			
				
					
					//      Scott Graham
 //      Scott Graham
  
			
		
	
		
		
			
				
					
					//      Daniel Keller
 //      Daniel Keller
  
			
		
	
		
		
			
				
					
					//      Omar Cornut
 //      Omar Cornut
  
			
		
	
		
		
			
				
					
					//      Dan Thompson
  
			
		
	
		
		
			
				
					
					//
 //
  
			
		
	
		
		
			
				
					
					// USAGE
 // USAGE
  
			
		
	
		
		
			
				
					
					//
 //
  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -203,7 +203,7 @@ 
			
		
	
		
		
			
				
					
					//    void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y)
 //    void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y)
  
			
		
	
		
		
			
				
					
					//    int  stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)
 //    int  stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)
  
			
		
	
		
		
			
				
					
					//    int  stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE *text, int len)
 //    int  stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE *text, int len)
  
			
		
	
		
		
			
				
					
					//    void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int  key)
 //    void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXEDIT_KEYTYPE  key)
  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					//
 //
  
			
		
	
		
		
			
				
					
					//    Each of these functions potentially updates the string and updates the
 //    Each of these functions potentially updates the string and updates the
  
			
		
	
		
		
			
				
					
					//    state.
 //    state.
  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -237,7 +237,9 @@ 
			
		
	
		
		
			
				
					
					//          inputs, set a high bit to distinguish the two; then you can define the
 //          inputs, set a high bit to distinguish the two; then you can define the
  
			
		
	
		
		
			
				
					
					//          various definitions like STB_TEXTEDIT_K_LEFT have the is-key-event bit
 //          various definitions like STB_TEXTEDIT_K_LEFT have the is-key-event bit
  
			
		
	
		
		
			
				
					
					//          set, and make STB_TEXTEDIT_KEYTOCHAR check that the is-key-event bit is
 //          set, and make STB_TEXTEDIT_KEYTOCHAR check that the is-key-event bit is
  
			
		
	
		
		
			
				
					
					//          clear.
 //          clear. STB_TEXTEDIT_KEYTYPE defaults to int, but you can #define it to
  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					//          anything other type you wante before including.
  
			
		
	
		
		
			
				
					
					//
  
			
		
	
		
		
			
				
					
					//     
 //     
  
			
		
	
		
		
			
				
					
					//   When rendering, you can read the cursor position and selection state from
 //   When rendering, you can read the cursor position and selection state from
  
			
		
	
		
		
			
				
					
					//   the STB_TexteditState.
 //   the STB_TexteditState.
  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -450,6 +452,15 @@ static int stb_text_locate_coord(STB_TEXTEDIT_STRING *str, float x, float y) 
			
		
	
		
		
			
				
					
					// API click: on mouse down, move the cursor to the clicked location, and reset the selection
 // API click: on mouse down, move the cursor to the clicked location, and reset the selection
  
			
		
	
		
		
			
				
					
					static  void  stb_textedit_click ( STB_TEXTEDIT_STRING  * str ,  STB_TexteditState  * state ,  float  x ,  float  y ) static  void  stb_textedit_click ( STB_TEXTEDIT_STRING  * str ,  STB_TexteditState  * state ,  float  x ,  float  y )  
			
		
	
		
		
			
				
					
					{ {  
			
		
	
		
		
			
				
					
					   // In single-line mode, just always make y = 0. This lets the drag keep working if the mouse
   
			
		
	
		
		
			
				
					
					   // goes off the top or bottom of the text
   
			
		
	
		
		
			
				
					
					   if (  state - > single_line  )   
			
		
	
		
		
			
				
					
					   {   
			
		
	
		
		
			
				
					
					      StbTexteditRow  r ;   
			
		
	
		
		
			
				
					
					      STB_TEXTEDIT_LAYOUTROW ( & r ,  str ,  0 ) ;   
			
		
	
		
		
			
				
					
					      y  =  r . ymin ;   
			
		
	
		
		
			
				
					
					   }   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					   state - > cursor  =  stb_text_locate_coord ( str ,  x ,  y ) ;     state - > cursor  =  stb_text_locate_coord ( str ,  x ,  y ) ;   
			
		
	
		
		
			
				
					
					   state - > select_start  =  state - > cursor ;     state - > select_start  =  state - > cursor ;   
			
		
	
		
		
			
				
					
					   state - > select_end  =  state - > cursor ;     state - > select_end  =  state - > cursor ;   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -459,9 +470,21 @@ static void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *stat 
			
		
	
		
		
			
				
					
					// API drag: on mouse drag, move the cursor and selection endpoint to the clicked location
 // API drag: on mouse drag, move the cursor and selection endpoint to the clicked location
  
			
		
	
		
		
			
				
					
					static  void  stb_textedit_drag ( STB_TEXTEDIT_STRING  * str ,  STB_TexteditState  * state ,  float  x ,  float  y ) static  void  stb_textedit_drag ( STB_TEXTEDIT_STRING  * str ,  STB_TexteditState  * state ,  float  x ,  float  y )  
			
		
	
		
		
			
				
					
					{ {  
			
		
	
		
		
			
				
					
					   int  p  =  stb_text_locate_coord ( str ,  x ,  y ) ;     int  p  =  0 ;   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					   // In single-line mode, just always make y = 0. This lets the drag keep working if the mouse
   
			
		
	
		
		
			
				
					
					   // goes off the top or bottom of the text
   
			
		
	
		
		
			
				
					
					   if (  state - > single_line  )   
			
		
	
		
		
			
				
					
					   {   
			
		
	
		
		
			
				
					
					      StbTexteditRow  r ;   
			
		
	
		
		
			
				
					
					      STB_TEXTEDIT_LAYOUTROW ( & r ,  str ,  0 ) ;   
			
		
	
		
		
			
				
					
					      y  =  r . ymin ;   
			
		
	
		
		
			
				
					
					   }   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					   if  ( state - > select_start  = =  state - > select_end )     if  ( state - > select_start  = =  state - > select_end )   
			
		
	
		
		
			
				
					
					      state - > select_start  =  state - > cursor ;        state - > select_start  =  state - > cursor ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					   p  =  stb_text_locate_coord ( str ,  x ,  y ) ;   
			
		
	
		
		
			
				
					
					   state - > cursor  =  state - > select_end  =  p ;     state - > cursor  =  state - > select_end  =  p ;   
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -677,7 +700,7 @@ static int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					// API paste: replace existing selection with passed-in text
 // API paste: replace existing selection with passed-in text
  
			
		
	
		
		
			
				
					
					static  int  stb_textedit_paste ( STB_TEXTEDIT_STRING  * str ,  STB_TexteditState  * state ,  STB_TEXTEDIT_CHARTYPE  const   * text ,  int  len ) static  int  stb_textedit_paste_internal  ( STB_TEXTEDIT_STRING  * str ,  STB_TexteditState  * state ,  STB_TEXTEDIT_CHARTYPE  * text ,  int  len )  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					{ {  
			
		
	
		
		
			
				
					
					   // if there's a selection, the paste should delete it
     // if there's a selection, the paste should delete it
   
			
		
	
		
		
			
				
					
					   stb_textedit_clamp ( str ,  state ) ;     stb_textedit_clamp ( str ,  state ) ;   
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -695,8 +718,12 @@ static int stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state 
			
		
	
		
		
			
				
					
					   return  0 ;     return  0 ;   
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# ifndef STB_TEXTEDIT_KEYTYPE  
			
		
	
		
		
			
				
					
					# define STB_TEXTEDIT_KEYTYPE int  
			
		
	
		
		
			
				
					
					# endif  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					// API key: process a keyboard input
 // API key: process a keyboard input
  
			
		
	
		
		
			
				
					
					static  void  stb_textedit_key ( STB_TEXTEDIT_STRING  * str ,  STB_TexteditState  * state ,  int  key ) static  void  stb_textedit_key ( STB_TEXTEDIT_STRING  * str ,  STB_TexteditState  * state ,  STB_TEXTEDIT_KEYTYPE key )  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					{ {  
			
		
	
		
		
			
				
					
					retry : retry :  
			
		
	
		
		
			
				
					
					   switch  ( key )  {     switch  ( key )  {   
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -1096,14 +1123,17 @@ static void stb_textedit_discard_redo(StbUndoState *state) 
			
		
	
		
		
			
				
					
					      // if the k'th undo state has characters, clean those up
        // if the k'th undo state has characters, clean those up
   
			
		
	
		
		
			
				
					
					      if  ( state - > undo_rec [ k ] . char_storage  > =  0 )  {        if  ( state - > undo_rec [ k ] . char_storage  > =  0 )  {   
			
		
	
		
		
			
				
					
					         int  n  =  state - > undo_rec [ k ] . insert_length ,  i ;           int  n  =  state - > undo_rec [ k ] . insert_length ,  i ;   
			
		
	
		
		
			
				
					
					         // delete n characters from all other records 
           // move the remaining redo character data to the end of the buffer 
   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					         state - > redo_char_point  =  state - > redo_char_point  +  ( short )  n ;  // vsnet05
           state - > redo_char_point  =  state - > redo_char_point  +  ( short )  n ;  // vsnet05
   
			
		
	
		
		
			
				
					
					         STB_TEXTEDIT_memmove ( state - > undo_char  +  state - > redo_char_point ,  state - > undo_char  +  state - > redo_char_point - n ,  ( size_t )  ( ( size_t ) ( STB_TEXTEDIT_UNDOCHARCOUNT  -  state - > redo_char_point ) * sizeof ( STB_TEXTEDIT_CHARTYPE ) ) ) ;           STB_TEXTEDIT_memmove ( state - > undo_char  +  state - > redo_char_point ,  state - > undo_char  +  state - > redo_char_point - n ,  ( size_t )  ( ( size_t ) ( STB_TEXTEDIT_UNDOCHARCOUNT  -  state - > redo_char_point ) * sizeof ( STB_TEXTEDIT_CHARTYPE ) ) ) ;   
			
		
	
		
		
			
				
					
					         // adjust the position of all the other records to account for above memmove
   
			
		
	
		
		
			
				
					
					         for  ( i = state - > redo_point ;  i  <  k ;  + + i )           for  ( i = state - > redo_point ;  i  <  k ;  + + i )   
			
		
	
		
		
			
				
					
					            if  ( state - > undo_rec [ i ] . char_storage  > =  0 )              if  ( state - > undo_rec [ i ] . char_storage  > =  0 )   
			
		
	
		
		
			
				
					
					               state - > undo_rec [ i ] . char_storage  =  state - > undo_rec [ i ] . char_storage  + ( short )  n ;  // vsnet05
                 state - > undo_rec [ i ] . char_storage  + = ( short )  n ;  // vsnet05
   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					      }        }   
			
		
	
		
		
			
				
					
					      STB_TEXTEDIT_memmove ( state - > undo_rec  +  state - > redo_point ,  state - > undo_rec  +  state - > redo_point - 1 ,  ( size_t )  ( ( size_t ) ( STB_TEXTEDIT_UNDOSTATECOUNT  -  state - > redo_point ) * sizeof ( state - > undo_rec [ 0 ] ) ) ) ;        // now move all the redo records towards the end of the buffer; the first one is at 'redo_point'
   
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					      STB_TEXTEDIT_memmove ( state - > undo_rec  +  state - > redo_point + 1 ,  state - > undo_rec  +  state - > redo_point ,  ( size_t )  ( ( STB_TEXTEDIT_UNDOSTATECOUNT  -  ( size_t ) state - > redo_point  -  1 ) * sizeof ( state - > undo_rec [ 0 ] ) ) ) ;   
			
		
	
		
		
			
				
					
					      // now move redo_point to point to the new one
   
			
		
	
		
		
			
				
					
					      + + state - > redo_point ;        + + state - > redo_point ;   
			
		
	
		
		
			
				
					
					   }     }   
			
		
	
		
		
			
				
					
					} }  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -1187,11 +1217,11 @@ static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					         // there's definitely room to store the characters eventually
           // there's definitely room to store the characters eventually
   
			
		
	
		
		
			
				
					
					         while  ( s - > undo_char_point  +  u . delete_length  >  s - > redo_char_point )  {           while  ( s - > undo_char_point  +  u . delete_length  >  s - > redo_char_point )  {   
			
		
	
		
		
			
				
					
					            // there's currently not enough room, so discard a redo record
   
			
		
	
		
		
			
				
					
					            stb_textedit_discard_redo ( s ) ;   
			
		
	
		
		
			
				
					
					            // should never happen:
              // should never happen:
   
			
		
	
		
		
			
				
					
					            if  ( s - > redo_point  = =  STB_TEXTEDIT_UNDOSTATECOUNT )              if  ( s - > redo_point  = =  STB_TEXTEDIT_UNDOSTATECOUNT )   
			
		
	
		
		
			
				
					
					               return ;                 return ;   
			
		
	
		
		
			
				
					
					            // there's currently not enough room, so discard a redo record
   
			
		
	
		
		
			
				
					
					            stb_textedit_discard_redo ( s ) ;   
			
		
	
		
		
			
				
					
					         }           }   
			
		
	
		
		
			
				
					
					         r  =  & s - > undo_rec [ s - > redo_point - 1 ] ;           r  =  & s - > undo_rec [ s - > redo_point - 1 ] ;   
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -1318,4 +1348,61 @@ static void stb_textedit_initialize_state(STB_TexteditState *state, int is_singl 
			
		
	
		
		
			
				
					
					{ {  
			
		
	
		
		
			
				
					
					   stb_textedit_clear_state ( state ,  is_single_line ) ;     stb_textedit_clear_state ( state ,  is_single_line ) ;   
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# if defined(__GNUC__) || defined(__clang__)  
			
		
	
		
		
			
				
					
					# pragma GCC diagnostic push  
			
		
	
		
		
			
				
					
					# pragma GCC diagnostic ignored "-Wcast-qual"  
			
		
	
		
		
			
				
					
					# endif  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					static  int  stb_textedit_paste ( STB_TEXTEDIT_STRING  * str ,  STB_TexteditState  * state ,  STB_TEXTEDIT_CHARTYPE  const  * ctext ,  int  len )  
			
		
	
		
		
			
				
					
					{  
			
		
	
		
		
			
				
					
					   return  stb_textedit_paste_internal ( str ,  state ,  ( STB_TEXTEDIT_CHARTYPE  * )  ctext ,  len ) ;   
			
		
	
		
		
			
				
					
					}  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# if defined(__GNUC__) || defined(__clang__)  
			
		
	
		
		
			
				
					
					# pragma GCC diagnostic pop  
			
		
	
		
		
			
				
					
					# endif  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# endif //STB_TEXTEDIT_IMPLEMENTATION
 # endif //STB_TEXTEDIT_IMPLEMENTATION
  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					/*
  
			
		
	
		
		
			
				
					
					- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
		
			
				
					
					This  software  is  available  under  2  licenses  - -  choose  whichever  you  prefer .  
			
		
	
		
		
			
				
					
					- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
		
			
				
					
					ALTERNATIVE  A  -  MIT  License  
			
		
	
		
		
			
				
					
					Copyright  ( c )  2017  Sean  Barrett  
			
		
	
		
		
			
				
					
					Permission  is  hereby  granted ,  free  of  charge ,  to  any  person  obtaining  a  copy  of  
 
			
		
	
		
		
			
				
					
					this  software  and  associated  documentation  files  ( the  " Software " ) ,  to  deal  in  
 
			
		
	
		
		
			
				
					
					the  Software  without  restriction ,  including  without  limitation  the  rights  to  
 
			
		
	
		
		
			
				
					
					use ,  copy ,  modify ,  merge ,  publish ,  distribute ,  sublicense ,  and / or  sell  copies  
 
			
		
	
		
		
			
				
					
					of  the  Software ,  and  to  permit  persons  to  whom  the  Software  is  furnished  to  do  
 
			
		
	
		
		
			
				
					
					so ,  subject  to  the  following  conditions :  
			
		
	
		
		
			
				
					
					The  above  copyright  notice  and  this  permission  notice  shall  be  included  in  all  
 
			
		
	
		
		
			
				
					
					copies  or  substantial  portions  of  the  Software .  
			
		
	
		
		
			
				
					
					THE  SOFTWARE  IS  PROVIDED  " AS IS " ,  WITHOUT  WARRANTY  OF  ANY  KIND ,  EXPRESS  OR  
 
			
		
	
		
		
			
				
					
					IMPLIED ,  INCLUDING  BUT  NOT  LIMITED  TO  THE  WARRANTIES  OF  MERCHANTABILITY ,  
 
			
		
	
		
		
			
				
					
					FITNESS  FOR  A  PARTICULAR  PURPOSE  AND  NONINFRINGEMENT .  IN  NO  EVENT  SHALL  THE  
 
			
		
	
		
		
			
				
					
					AUTHORS  OR  COPYRIGHT  HOLDERS  BE  LIABLE  FOR  ANY  CLAIM ,  DAMAGES  OR  OTHER  
 
			
		
	
		
		
			
				
					
					LIABILITY ,  WHETHER  IN  AN  ACTION  OF  CONTRACT ,  TORT  OR  OTHERWISE ,  ARISING  FROM ,  
 
			
		
	
		
		
			
				
					
					OUT  OF  OR  IN  CONNECTION  WITH  THE  SOFTWARE  OR  THE  USE  OR  OTHER  DEALINGS  IN  THE  
 
			
		
	
		
		
			
				
					
					SOFTWARE .  
			
		
	
		
		
			
				
					
					- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
		
			
				
					
					ALTERNATIVE  B  -  Public  Domain  ( www . unlicense . org )  
			
		
	
		
		
			
				
					
					This  is  free  and  unencumbered  software  released  into  the  public  domain .  
			
		
	
		
		
			
				
					
					Anyone  is  free  to  copy ,  modify ,  publish ,  use ,  compile ,  sell ,  or  distribute  this  
 
			
		
	
		
		
			
				
					
					software ,  either  in  source  code  form  or  as  a  compiled  binary ,  for  any  purpose ,  
 
			
		
	
		
		
			
				
					
					commercial  or  non - commercial ,  and  by  any  means .  
			
		
	
		
		
			
				
					
					In  jurisdictions  that  recognize  copyright  laws ,  the  author  or  authors  of  this  
 
			
		
	
		
		
			
				
					
					software  dedicate  any  and  all  copyright  interest  in  the  software  to  the  public  
 
			
		
	
		
		
			
				
					
					domain .  We  make  this  dedication  for  the  benefit  of  the  public  at  large  and  to  
 
			
		
	
		
		
			
				
					
					the  detriment  of  our  heirs  and  successors .  We  intend  this  dedication  to  be  an  
 
			
		
	
		
		
			
				
					
					overt  act  of  relinquishment  in  perpetuity  of  all  present  and  future  rights  to  
 
			
		
	
		
		
			
				
					
					this  software  under  copyright  law .  
			
		
	
		
		
			
				
					
					THE  SOFTWARE  IS  PROVIDED  " AS IS " ,  WITHOUT  WARRANTY  OF  ANY  KIND ,  EXPRESS  OR  
 
			
		
	
		
		
			
				
					
					IMPLIED ,  INCLUDING  BUT  NOT  LIMITED  TO  THE  WARRANTIES  OF  MERCHANTABILITY ,  
 
			
		
	
		
		
			
				
					
					FITNESS  FOR  A  PARTICULAR  PURPOSE  AND  NONINFRINGEMENT .  IN  NO  EVENT  SHALL  THE  
 
			
		
	
		
		
			
				
					
					AUTHORS  BE  LIABLE  FOR  ANY  CLAIM ,  DAMAGES  OR  OTHER  LIABILITY ,  WHETHER  IN  AN  
 
			
		
	
		
		
			
				
					
					ACTION  OF  CONTRACT ,  TORT  OR  OTHERWISE ,  ARISING  FROM ,  OUT  OF  OR  IN  CONNECTION  
 
			
		
	
		
		
			
				
					
					WITH  THE  SOFTWARE  OR  THE  USE  OR  OTHER  DEALINGS  IN  THE  SOFTWARE .  
			
		
	
		
		
			
				
					
					- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  
			
		
	
		
		
			
				
					
					*/