docs: function func_draw_process_request(arg_terminal_feature, arg_request_str='', arg_response)
  {
  	arg_response.result.value = undefined
  	arg_response.result.str = undefined
  
  	const EXPR_FEATURE_FUNC_NAME = 'func_expression'
  	const func_draw_factory = window.devapt().func_features[DRAW_FACTORY_FUNC_NAME]
  	const func_expr_process = window.devapt().func_features[EXPR_FEATURE_FUNC_NAME]
  
  	const terminal = func_draw_get_terminal(arg_terminal_feature)
  	const draw_session_scope = func_draw_get_scope(terminal)
  	if (! terminal || ! draw_session_scope)
  	{
  		arg_response.result.error = 'terminal or scope not found'
  		return undefined
  	}
  
  	const svg_space = draw_session_scope.get_private_item('svg_space')
  	if (! svg_space)
  	{
  		arg_response.result.error = 'scope svg space not found'
  		return undefined
  	}
  
  	const svg_factory = draw_session_scope.get_private_item('svg_factory')
  	if (! svg_factory)
  	{
  		arg_response.result.error = 'scope svg factory not found'
  		return undefined
  	}
  
  	Object.keys(shapes_map).forEach(
  		(shape_alias)=>{
  			svg_space[shape_alias] = func_draw_factory(arg_terminal_feature, shapes_map, 'rootspace', draw_session_scope, shapes_map[shape_alias], svg_space)
  			svg_space.add_method(shape_alias)
  		}
  	)
  
  	// TEST IF ASSIGN EXPRESSION
  	let assign_name = undefined
  	const lexer_assign = new RegExp(/^\s*([a-zA-Z]{1}[a-zA-Z0-9_]*)?\s*=(.*){1}\s*/)
  	const parts = lexer_assign.exec(arg_request_str)
  	if ( Array.isArray(parts) && parts.length > 2 )
  	{
  		assign_name = parts[1]
  		arg_request_str = parts[2]
  		console.log('func_draw_process_request:assign_name=' + assign_name + ' arg_request_str=' + arg_request_str)
  	}
  	assign_name = assign_name ? assign_name : 'Shape' + svg_factory.count()
  	
  	Object.keys(shapes_map).forEach(
  		(shape_type)=>{
  			if ( draw_session_scope.get_public_item(shape_type) ) return
  
  			const factory_fn = func_draw_factory(arg_terminal_feature, shapes_map, assign_name, draw_session_scope, shapes_map[shape_type], svg_space)
  
  			draw_session_scope.set_public_item(shape_type, factory_fn)
  		}
  	)
  
  
  	// EVAL EXPRESSION
  	const eval_result = func_expr_process(draw_session_scope.get_public_items(), arg_request_str, assign_name)
  	console.log('func_draw_process_request:eval_result=', eval_result)
  
  	// PROCESS EVAL ERRORS
  	let error_msg = undefined
  	if (eval_result.exception)
  	{
  		error_msg = 'bad request string:[' + arg_request_str + ']\n evaluated with exception [' + eval_result.exception.toString() + ']\n'
  	}
  	if (eval_result.errors.length > 0)
  	{
  		error_msg = error_msg ? error_msg : ''
  		error_msg += 'with errors:\n'
  		eval_result.errors.forEach(
  			(error)=>{
  				arg_response.error += 'error:[' + error + ']'
  			}
  		)
  	}
  	if (eval_result.value && eval_result.value.error)
  	{
  		error_msg = error_msg ? error_msg : ''
  		error_msg += 'factory error:[' + eval_result.value.error + ']'
  	}
  	if (error_msg)
  	{
  		arg_response.result.error = error_msg
  		
  		return arg_response
  	}
  
  	// PROCESS EVAL OUTPUT
  	let output_msg = arg_response.result.str ? arg_response.result.str + '\n' : ''
  	if (eval_result.value && eval_result.value.message)
  	{
  		output_msg += eval_result.value.message
  	}
  	arg_response.result.str = output_msg
  	arg_response.result.value = eval_result.value.result
  
  
  	// 	if (! arg_response.result.value)
  	// 	{
  	// 		arg_response.result.value = (eval_result && eval_result.value && eval_result.value.result && eval_result.value.result.value) ? eval_result.value.result.value : eval_result.value
  	// 	}
  	// }
  	if (parts && parts[1])
  	{
  		if (eval_result.value && eval_result.value.value)
  		{
  			draw_session_scope.set_public_item(assign_name, eval_result.value.value)
  		} else {
  			draw_session_scope.set_public_item(assign_name, eval_result.value)
  		}
  	}
  
  	return arg_response
  }