Implements an image recognition captcha.

"; break; case 'admin/modules#description': case 'admin/modules/textimage': case 'admin/textimage': $output = t('Implements an image recognition captcha.'); break; } return $output; } function textimage_captchachallenge(&$form) { $form['captcha_response'] = array ( '#type' => 'textfield', '#title' => t('Captcha Validation'), '#default_value' => '', '#required' => TRUE, '#validate' => array('_captcha_validate' => array()), '#description' => t('Please type in the letters/numbers that are shown in the image above.'), '#prefix' => 'Captcha Image: you will need to recognize the text in it.', ); return $form; } function textimage_captchavalidate(&$captcha_word, &$correct) { $captcha_word = drupal_strtolower($captcha_word); if (($_SESSION['captcha'] != '') && $captcha_word == $_SESSION['captcha']) { $correct = true; } else { $correct = false; form_set_error('captcha_response', t('The image verification code you entered is incorrect.')); } } /** * Implementation of hook_menu(). */ function textimage_menu($may_cache) { $items = array(); $suffix = ''; if (arg(2)!=null) $suffix='/'.arg(2); $items[] = array( 'path' => '_textimage/image'.$suffix, 'title' => t('textimage'), 'callback' => '_textimage_image', 'access' => user_access('access textimages'), 'type' => MENU_CALLBACK ); return $items; } function textimage_perm() { return array('access textimages'); } function textimage_settings() { $fonts_path = variable_get("textimage_fonts_path", ""); $images_path = variable_get("textimage_images_path", ""); //check for GD if (!function_exists(imagecreate)) drupal_set_message(t('Image library not available. Textimage needs the GD library extension to be installed. Please install GD.')); //check for TTF support elseif (!function_exists(imagettftext)) drupal_set_message(t('Your image library does not seem to have TrueType font support. Textimage will work, but will use the default inbuilt font.'),'status'); //check for valid font path elseif ($fonts_path!="" && !is_dir($fonts_path)) drupal_set_message(t('The current font path is invalid. The default font will be used.')); //check for valid image path if ($images_path!="" && !is_dir($images_path)) drupal_set_message(t('The current images path is invalid. No images will be used.')); //Fonts settings $form['fonts'] = array( '#type' => 'fieldset', '#title' => t('Fonts settings'), '#collapsible' => TRUE, '#collapsed' => FALSE ); $form['fonts']['textimage_use_only_upper'] = array( '#type' => 'checkbox', '#title' => t('Use only Uppercase'), '#default_value' => variable_get('textimage_use_only_upper',0) ); $form['fonts']['textimage_fonts_path'] = array( '#type' => 'textfield', '#title' => t('TrueType Fonts Path'), '#default_value' => $fonts_path, '#size' => 30, '#maxlength' => 255, '#description' => t('Location of the directory where the Truetype (.ttf) fonts are stored. If you do not provide any fonts, the module will use the default font for text. Relative paths will be resolved relative to the Drupal installation directory.'), ); $form['fonts']['textimage_font_size'] = array( '#type' => 'textfield', '#title' => t('Font Size'), '#default_value' => variable_get('textimage_font_size',24), '#size' => 5, '#maxlength' => 2, '#description' => t('Font size of Captcha text (in pixels).'), '#validate' => array("_textimage_number_validate" => array("textimage_font_size")), ); $form['fonts']['textimage_char_spacing_max'] = array( '#type' => 'textfield', '#title' => t('Character Spacing'), '#default_value' => variable_get('textimage_char_spacing_max',10), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the kerning between letters in Captcha. Higher numbers indicate more spacing.'), '#validate' => array("_textimage_number_validate" => array("textimage_char_spacing_max")), ); $form['fonts']['textimage_char_jiggle_amount'] = array( '#type' => 'textfield', '#title' => t('Character Jiggle'), '#default_value' => variable_get('textimage_char_jiggle_amount',5), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of up and down movement in the Captcha letters. Higher numbers indicate more jiggling.'), '#validate' => array("_textimage_number_validate" => array("textimage_char_jiggle_amount")), ); $form['fonts']['textimage_char_rotate_amount'] = array( '#type' => 'textfield', '#title' => t('Character Rotation'), '#default_value' => variable_get('textimage_char_rotate_amount',5), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of rotation in the Captcha letters (in degrees, only works with non-default fonts).'), '#validate' => array("_textimage_number_validate" => array("textimage_char_rotate_amount")), ); $form['fonts']['textimage_char_size_amount'] = array( '#type' => 'textfield', '#title' => t('Character Size Adjustment'), '#default_value' => variable_get('textimage_char_size_amount',2), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of variation in size between the different letters in the Captcha (in pixels).'), '#validate' => array("_textimage_number_validate" => array("textimage_char_size_amount")), ); //Image settings $form['images'] = array( '#type' => 'fieldset', '#title' => t('Image settings'), '#collapsible' => TRUE, '#collapsed' => FALSE ); $form['images']['textimage_images_path'] = array( '#type' => 'textfield', '#title' => t('Background Images Path'), '#default_value' => $images_path, '#size' => 30, '#maxlength' => 255, '#description' => t('Location of the directory where the background images are stored. If you do not provide a directory, solid colors will be used. Relative paths will be resolved relative to the Drupal installation directory.'), ); $form['images']['textimage_image_noise'] = array( '#type' => 'textfield', '#title' => t('Image Noise (pixels)'), '#default_value' => variable_get('textimage_image_noise',4), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the amount of noise (random pixels) in the Captcha image. Higher numbers indicate more noise.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_noise")), ); $form['images']['textimage_image_lines'] = array( '#type' => 'textfield', '#title' => t('Image Noise (lines)'), '#default_value' => variable_get('textimage_image_lines',4), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the amount of noise (random lines) in the Captcha image. Higher numbers indicate more noise.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_lines")), ); $form['images']['textimage_image_margin'] = array( '#type' => 'textfield', '#title' => t('Image Margin'), '#default_value' => variable_get('textimage_image_margin',10), '#size' => 5, '#maxlength' => 4, '#description' => t('Set a distance between the Captcha letters and the edges of the image.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_margin")), ); $form['info'] = array( '#type' => 'fieldset', '#title' => t('Image and font information'), '#collapsible' => TRUE, '#collapsed' => FALSE ); if (isset($fonts_path)) { $imagefontinfo .= t('Number of fonts found: ').count(_textimage_font_list()); } if (isset($images_path)) { $imagefontinfo .= '
'.t('Number of background images found: ').count(_textimage_image_list()); } $gdinfo = gd_info(); $imagefontinfo .= '
'.t('GD Version: ').$gdinfo["GD Version"]; $imagefontinfo .= '
'.t(' FreeType Support: '); $imagefontinfo .= ($gdinfo["FreeType Support"]==true) ? 'True' : 'False'; $imagefontinfo .= '
'; $form['info']['captcha_info'] = array ( '#type' => 'item', '#value' => $imagefontinfo, ); return $form; } function textimage_settings_form_validate ($form_id,$form) { //check for valid font path if ($form['textimage_fonts_path'] !="" && !is_dir($form['textimage_fonts_path'])) form_set_error('textimage_fonts_path', t('The entered font path is invalid')); //check for valid image path if ($form['textimage_images_path'] !="" && !is_dir($form['textimage_images_path'])) form_set_error('textimage_images_path', t('The entered image path is invalid')); } function _textimage_number_validate ($field,$fieldName) { if (!is_numeric($field['#value'])) { form_set_error($fieldName,t("The value for")." ".t($field['#title'])." ".t("must be a number")); } } /** * Prints an image containing a textimage code. */ function _textimage_image() { //if we don't have GD2 functions, we can't generate the image if (!function_exists('imagecreatetruecolor')) return; // Set headers header('Expires: Mon, 01 Jan 1997 05:00:00 GMT'); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Cache-Control: post-check=0, pre-check=0', false); header('Pragma: no-cache'); header('Content-type: image/png'); $string = _textimage_code(); // Get truetype font list $fonts = _textimage_font_list(); // Get the background images list $images = _textimage_image_list(); // Randomization amounts: $charSpacingMax = variable_get('textimage_char_spacing_max',10); // Letter spacing max (pixels) $charSpacingMin = max($charSpacingMax*.5,0); // Letter spacing minimum (pixels) $charJiggleAmount = variable_get('textimage_char_jiggle_amount',5); // Up and down randomization (pixels) $charRotateAmount = variable_get('textimage_char_rotate_amount',5); // Character rotation amount (degrees) $charSizeAmount = variable_get('textimage_char_size_amount',2); // Character size amount (pixels) $imageRotateAmount = variable_get('captcha_image_rotate_amount',12); // Image rotation amount (degrees) // Static amounts: $charInitialSize = variable_get('textimage_font_size',24); // Initial Font $imageNoise = variable_get('textimage_image_noise',4); // Amount of noise added to image $imageLines = variable_get('textimage_image_lines',4); // Amount of noise added to image $imageMargin = variable_get('textimage_image_margin',10); // Margin around image (pixels) // write text using a truetype font if (function_exists(imagettftext) && count($fonts) > 0) { // Initialize variables for the loop $characterDetails = array(); // contains the final info about each character // Build a list of character settings for the captcha string for ($i=0;$i $charSize, "angle" => $charAngle, "x" => $x, "y" => $y, "color" => $foreground, "font" => $font, "char" => $char ); // Increment the image size $imageWidth = $x + $charWidth; $imageHeight = max($imageHeight,$y+$charJiggleAmount); } // Create the image based off the string length and margin if (count($images) > 0) { // We're going to be using an image, and need a tranparent background to start with $im = _textimage_create_transparent_image($imageWidth+2*$imageMargin, $imageHeight+2*$imageMargin); $noisecolor = imagecolorallocatealpha($im, 0, 0, 0, 127); } else { // Just make a plain-jane color brackground $im = imagecreatetruecolor($imageWidth+2*$imageMargin, $imageHeight+2*$imageMargin); $background = imagecolorallocate($im, rand(180, 250), rand(180, 250), rand(180, 250)); $noisecolor = $background; imagefill($im, 0, 0, $background); } // Specify colors to be used in the image $foreground = imagecolorallocate($im, rand(0, 80), rand(0, 80), rand(0, 80)); foreach($characterDetails as $char) { // draw character imagettftext($im,$char['size'],$char['angle'],$char['x']+$imageMargin,$char['y']+$imageMargin,$foreground,$char['font'],$char['char']); } } else { // write text using a built-in font $x = 0; $y = 0; $imageWidth = 60 + drupal_strlen($string)*$charSpacingMax*.35; $imageHeight = 30 + $charJiggleAmount; // Create the image if (count($images) > 0 && function_exists(imagecolorallocatealpha)) { // We're going to be using an image, and need a tranparent background to start with $im = _textimage_create_transparent_image($imageWidth, $imageHeight); $noisecolor = imagecolorallocatealpha($im, 0, 0, 0, 127); } else { // Just make a plain-jane color brackground $im = imagecreatetruecolor($imageWidth, $imageHeight); $background = imagecolorallocate($im, rand(180, 250), rand(180, 250), rand(180, 250)); $noisecolor = $background; imagefill($im, 0, 0, $background); } // Add the text for ($i=0;$i 0) { // Prepare a larger image with a background image $im2 = _textimage_create_transparent_image($imageWidth, $imageHeight); } else { // Prepare a larger image with a solid color $im2 = imagecreatetruecolor($imageWidth, $imageHeight); imagefill($im2, 0, 0, $background); } $result = imagecopyresampled ($im2, $im, $imageMargin, $imageMargin, 0, 0, $imageWidth, $imageHeight, imagesx($im), imagesy($im)); $im = $im2; } // strikethrough imageline($im, rand(0, 120), rand(0, 120), rand(0, 120), rand(0, 120), $foreground); // Add Noise for ($x=0; $x<$imageWidth; $x++) { for ($row=0; $row<$imageNoise;$row++) { $y = rand(0,$imageHeight); imagesetpixel($im, $x, $y, $noisecolor); } } // Add Lines and Ellipses for ($x=0; $x<$imageLines;$x++) { imageline($im, rand(0, $imageWidth), rand(0, $imageHeight), rand(0, $imageWidth), rand(0, $imageHeight), $noisecolor); imageellipse($im, rand(0, $imageWidth), rand(0, $imageHeight), rand(0, $imageWidth), rand(0, $imageHeight), $noisecolor); } // Fill image with a random background image if available if (count($images) > 0) { $image = $images[rand(0,count($images)-1)]; _textimage_apply_background_image($im,$image); } //output to browser imagepng($im); imagedestroy($im); } /** * Returns a random string for use in a captcha */ function _textimage_code() { $consts='bcdgjxvmnprst'; $vowels='aeiou'; for ($x=0; $x < 6; $x++) { mt_srand ((double) microtime() * 1000000); $const[$x] = drupal_substr($consts,mt_rand(0,drupal_strlen($consts)-1),1); $vow[$x] = drupal_substr($vowels,mt_rand(0,drupal_strlen($vowels)-1),1); } $string = $const[0] . $vow[0] .$const[2] . $const[1] . $vow[1] . $const[3] . $vow[3] . $const[4]; $string = drupal_substr($string,0,rand(4,6)); //everytime we create a new code, we write it to session $_SESSION['captcha'] = drupal_strtolower($string); if(variable_get('textimage_use_only_upper',0)) $string = drupal_strtoupper($string); return $string; } /** * Returns an array of files with TTF extensions in the specified directory. */ function _textimage_font_list() { $fontdir = variable_get("textimage_fonts_path", ""); $filelist = array(); if (is_dir($fontdir) && $handle = opendir($fontdir)) { while ($file = readdir($handle)) { if (preg_match("/\.ttf$/i",$file) == 1) $filelist[] = $fontdir.'/'.$file; } closedir($handle); } return $filelist; } /** * Returns an array of files with jpg, png, and gif extensions in the specified directory. */ function _textimage_image_list() { $imagesdir = variable_get("textimage_images_path", ""); $filelist = array(); if (is_dir($imagesdir) && $handle = opendir($imagesdir)) { while ($file = readdir($handle)) { if (preg_match("/\.gif|\.png|\.jpg$/i",$file) == 1) $filelist[] = $imagesdir.'/'.$file; } closedir($handle); } return $filelist; } /** * Overlays an image to the supplied image resource */ function _textimage_apply_background_image (&$imageResource,$imageFile) { $backgroundResource = image_gd_open($imageFile,substr($imageFile,-3)); // Copy the text onto the background $backX = imagesx($backgroundResource); $backY = imagesy($backgroundResource); $textX = imagesx($imageResource); $textY = imagesy($imageResource); $randomBackX = rand(0,$backX-$textX); $randomBackY = rand(0,$backY-$textY); // Place the text onto a random location of the background image imagecopyresampled($backgroundResource,$imageResource,$randomBackX,$randomBackY,0,0,$textX,$textY,$textX,$textY); // Crop the background image to the original image size imagecopyresampled($imageResource,$backgroundResource,0,0,$randomBackX,$randomBackY,$textX,$textY,$textX,$textY); } /** * Creates transparent image resources for images with graphic backgrounds */ function _textimage_create_transparent_image($x, $y) { $i = imagecreatetruecolor($x, $y); $b = imagecreatefromstring(base64_decode(_text_image_blankpng())); imagealphablending($i, false); imagesavealpha($i, true); imagecopyresized($i, $b ,0 ,0 ,0 ,0 ,$x, $y, imagesx($b), imagesy($b)); return $i; } function _text_image_blankpng() { $c = "iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m"; $c .= "dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADqSURBVHjaYvz//z/DYAYAAcTEMMgBQAANegcCBNCg"; $c .= "dyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAAN"; $c .= "egcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQ"; $c .= "oHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAA"; $c .= "DXoHAgTQoHcgQAANegcCBNCgdyBAgAEAMpcDTTQWJVEAAAAASUVORK5CYII="; return $c; } ?> With God |

With God

: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/oellermann/includes/ on line 291.

With God

For a Youth Service

My sermon this evening is called "With God". I’m a complete computer geek, and so the first thing I did was to fire up a program I wrote which would do a whole Bible search on whatever words I ask for. I asked, naturally enough, for verses containing "with" and "God", and even my Pentium-MMX, with all its 512KB of cache, 64MB of SDRAM and 3.8GB of disk space was stumped for some time. Eventually, it spat out a list of verses which seemed, at first, to be the entire Bible. Working through them was a sort of whirlwind tour of the Bible, and it raised a series of questions.

Is God really there?

The first question is, of course, "Is God really there?" The Bible’s answer is pretty obvious; I mean, the entire thing is about God and his creation and redemption of his people. But the Bible states that its authorship is, ultimately, God’s; and so the Bible assumes that God is.

We are taught to accept God’s existence as an article of faith. I think that the Bible’s definition of faith is as good as any; Hebrews 11:1 says that "faith is being sure of what we hope for and certain of what we do not see." Faith is incredibly difficult for human beings. Sure, it’s easy enough for me to have "faith" that the sun will rise tomorrow, or that if I drop my notes they’ll fall, or if I don’t get to the point soon, someone’ll throw something at me. These things I can have faith in because I’ve experienced them so often before. So if we’re asking "Is God really there?", before we can have our answer through faith, we need to experience Him.

I’m going to be talking a lot about God and experiencing Him, but I want to start with the most obvious and visible experience of God: in His creation. I want to read you a poem by Samuel Taylor Coleridge. Coleridge was not, apparently, a Christian; he lived his adult life in a confused addiction to laudanum and opium. And yet, when he meditated on nature, he came up with this. Apologies in advance; this is an "old fogey" poem, probably written in the late 1700s, but check it out anyway.

<read Hymn Before Sun-rise in the Vale of Chamouni>

Listen also to David in Psalm 19 (verses 1 – 4):

The heavens declare the glory of God;
the skies proclaim the work of his hands.
Day after day they pour forth speech;
night after night they display knowledge.
There is no speech or language
where their voice is not heard.
Their voice goes out into all the earth,
their words to the end of the world.

God knew all along that we would find ourselves, tonight or whenever, wondering whether or not He exists, and so he sealed His answer on creation. Go and smell the soil, drink the dew, feel the bark of a tree and hear its leaves, whispering: there is no question, is there? God exists. Nature cries his existence, and our souls sing an exultant Amen.

Does God care about us?

So God is, and He created us. But does he care about us? I mean, I’m a programmer. Often, I’ll create little programs or routines that’ll hang around on a server somewhere doing stuff. And I really don’t worry about them; I don’t care what they think or feel, as long as they do their assigned jobs. Is God like that?

There’s a bit of a problem with my metaphor. I mean, computer programs are not exactly human, and I’m not exactly God. God created us with an ability to think and to wonder, and he reveals himself to us. He starts with the revelation of His creation, and when we can grasp Him through that, he moves on to the revelation of His scripture: the Bible. Already we can deduce from the fact that God tells us about himself that he cares about us. The Bible gives us a lot of detail on what that care involves.

The first way in which God cares about us is expressed in His commands. Following the Ten Commandments in Deuteronomy, Moses says this (in Deuteronomy 6:1-3):

"These are the commands, decrees and laws the Lord your God directed me to teach you to observe in the land that you are crossing the Jordan to possess, so that you, your children and their children after them may fear the Lord your God as long as you live by keeping all his decrees and commands that I give you, so that you may enjoy long life."

God cares about us sufficiently to tell us, in His wisdom, what to do for our own good.

More than that, God cares enough about us to be always with us. Listen to Matthew 28:19-20: "Therefore go and make disciples of all nations, baptising them in the name of the Father and of the Son and of the Holy Spirit, and teaching them to obey everything I have commanded you. And surely I am with you always, to the very end of the age."

And God’s presence is not just passive. He protects and fights for us. Listen to David’s words in 1 Chronicles 22:18: "Is not the Lord your God with you? And has he not granted you rest on every side? For he has handed over the inhabitants of the land to me, and the land is subject to the Lord and to His people." But God’s protection and victory is not just limited to the physical realm. Romans 16:20 declares that "the God of peace will soon crush Satan under your feet."

More, even, than protecting us, God loves us. What can be as beautiful to hear as John 3:16: "For God so loved the world that He gave His one and only Son, that whoever believes in Him shall not perish but have eternal life."

God does care about us: he commands us, accompanies us, protects us and loves us more than we can understand.

Can we be with God?

We know that God lavishes his care and love on us. We know that he seeks to accompany and protect us – but can we secure an assurance of being with him? Can we, at will, enter the presence of God? In essence, can we be with God? The short answer to the question is "no". Matthew 19:25-26 records the following: ‘When the disciples heard this, they were greatly astonished and asked, "Who then can be saved?" Jesus looked at them and said, "With man this is impossible." ’ As humans, we are bound to earth and are unable in our own strength to reach the Kingdom of Heaven. But Jesus carries on: "but with God all things are possible". Although we are unrighteous and undeserving, God sent us His son to redeem us, and once we have accepted him as our saviour, we are clean in God’s eyes and may indeed walk right into His presence. The full answer is yes, we can be with God.

What is being with God like?

If, then, we can be with God, what is being with God like? I would guess that to answer that, we first need to ask what God is like.

The Bible ascribes to God two fundamental characteristics. He is Holy, and He is love. By Holy, I mean that God is unique and separate from Creation; he is absolutely pure, perfect and untarnished. God’s holiness implies righteousness and justice which transcend our bent human understandings of these. Millard Erickson states that "in general, God’s love may be thought of as his eternal giving or sharing of himself". Because God is infinite, there is no limit to his love, to his sharing of himself, and it has always been and will always be to eternity without fail.

To be with God is to be exposed to his love and holiness. Perhaps later, once we are gone from the world, we may gain an understanding of the fullness of God’s love and holiness. Even now, though, through Jesus, we are able to come to God, and feel his love, and know his flawlessness. Weighed against these, we are completely inadequate. It would be easy to expect that in approaching an almighty God, us weak humans might be expected to fawn on him and abase ourselves like yes-men before a dictator – but that is not what God wants. Christ died for us; by accepting Christ we can enter into a relationship with God that is based on love: a relationship in which God looks on us as favoured children and heirs. As Christians, we find that the incomparable, sovereign author of creation and ratio essendi of the Universe seeks a friendship with us. We have the unbelievable privilege of talking with him, of sharing our problems with him and experiencing his counsel and his help. And we know that as we grow in our friendship with him, so will we grow in love and holiness until one day we are called to be with him in perfection and glory forevermore.

I’ve asked four questions this evening: "Is God really there?", "Does he care about us?", "Can we be with Him?" and "What is being with Him like?". Each of the questions is natural enough; each of the answers is astonishing in the depth of love it shows that our Creator has for us. If you’ve accepted Christ as your saviour, I encourage you to spend ever more time with him: in His word, in prayer and meditation, and in serving His commands. For by spending time with Him we grow to know Him more and more, and through knowing Him we may increasingly see His perfection shining through our own lives. If you haven’t accepted Christ as your saviour, I can assure you that your life is completely empty compared to what it could be with him. God made us, and he made us long for him in our heart of hearts – and only by giving your life to Him can you begin to understand what it really is to live. If you’re ready to make that decision, or if you want to know more, I would consider it a privilege to talk to you, and there are many others here who feel the same way.


  • Thanks to God for his bounteous blessing, in creation and in His love for us
  • Praise to God for who He is; a God of perfection, of holiness and love.
  • Plea for submissiveness: enable us to live for you according to your will
  • Plea for provision: that God would meet our physical needs, and our spiritual needs – that we would come to know him ever more deeply and to grow more and more like him.
  • Plea for forgiveness: we are human and we do wrong, but we ask for forgiveness according to your grace.
  • As we offer our lives to you once more, we ask that you would use us according to your purpose, for yours is all power and glory.