Issues (1240)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

application/controllers/examples.php (13 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php defined('SYSPATH') or die('No direct access allowed.');
2
/**
3
 * Contains examples of various Kohana library examples. You can access these
4
 * samples in your own installation of Kohana by going to ROOT_URL/examples.
5
 * This controller should NOT be used in production. It is for demonstration
6
 * purposes only!
7
 *
8
 * $Id: examples.php 4298 2009-04-30 17:06:05Z kiall $
9
 *
10
 * @package    Core
11
 * @author     Kohana Team
12
 * @copyright  (c) 2007-2008 Kohana Team
13
 * @license    http://kohanaphp.com/license.html
14
 */
15
class Examples_Controller extends Controller
16
{
17
18
    // Do not allow to run in production
19
    const ALLOW_PRODUCTION = false;
20
21
    /**
22
     * Displays a list of available examples
23
     */
24
    public function index()
25
    {
26
        // Get the methods that are only in this class and not the parent class.
27
        $examples = array_diff(
28
            get_class_methods(__CLASS__),
29
            get_class_methods(get_parent_class($this))
30
        );
31
32
        sort($examples);
33
34
        echo "<strong>Examples:</strong>\n";
35
        echo "<ul>\n";
36
37
        foreach ($examples as $method) {
38
            if ($method == __FUNCTION__) {
39
                continue;
40
            }
41
42
            echo '<li>'.html::anchor('examples/'.$method, $method)."</li>\n";
43
        }
44
45
        echo "</ul>\n";
46
        echo '<p>'.Kohana::lang('core.stats_footer')."</p>\n";
47
    }
48
49
    /**
50
     * Demonstrates how to archive a directory. First enable the archive module
51
     */
52
    //public function archive($build = FALSE)
53
    //{
54
    //	if ($build === 'build')
55
    //	{
56
    //		// Load archive
57
    //		$archive = new Archive('zip');
58
59
    //		// Download the application/views directory
60
    //		$archive->add(APPPATH.'views/', 'app_views/', TRUE);
61
62
    //		// Download the built archive
63
    //		$archive->download('test.zip');
64
    //	}
65
    //	else
66
    //	{
67
    //		echo html::anchor(Router::$current_uri.'/build', 'Download views');
68
    //	}
69
    //}
70
71
    /**
72
     * Demonstrates how to parse RSS feeds by using DOMDocument.
73
     */
74
    public function rss()
75
    {
76
        // Parse an external atom feed
77
        $feed = feed::parse('http://dev.kohanaphp.com/projects/kohana2/activity.atom');
78
79
        // Show debug info
80
        echo Kohana::debug($feed);
81
82
        echo Kohana::lang('core.stats_footer');
83
    }
84
85
    /**
86
     * Demonstrates the Session library and using session data.
87
     */
88
    public function session()
0 ignored issues
show
session uses the super-global variable $_SESSION which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
89
    {
90
        // Gets the singleton instance of the Session library
91
        $s = Session::instance();
0 ignored issues
show
$s is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
Comprehensibility introduced by
Avoid variables with short names like $s. Configured minimum length is 3.

Short variable names may make your code harder to understand. Variable names should be self-descriptive. This check looks for variable names who are shorter than a configured minimum.

Loading history...
92
93
        echo 'SESSID: <pre>'.session_id()."</pre>\n";
94
95
        echo '<pre>'.print_r($_SESSION, true)."</pre>\n";
96
97
        echo '<br/>{execution_time} seconds';
98
    }
99
100
    /**
101
     * Demonstrates how to use the form helper with the Validation libraryfor file uploads .
102
     */
103
    public function form()
0 ignored issues
show
form uses the super-global variable $_POST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
form uses the super-global variable $_FILES which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
104
    {
105
        // Anything submitted?
106
        if ($_POST) {
107
            // Merge the globals into our validation object.
108
            $post = Validation::factory(array_merge($_POST, $_FILES));
109
110
            // Ensure upload helper is correctly configured, config/upload.php contains default entries.
111
            // Uploads can be required or optional, but should be valid
112
            $post->add_rules('imageup1', 'upload::required', 'upload::valid', 'upload::type[gif,jpg,png]', 'upload::size[1M]');
113
            $post->add_rules('imageup2', 'upload::required', 'upload::valid', 'upload::type[gif,jpg,png]', 'upload::size[1M]');
114
115
            // Alternative syntax for multiple file upload validation rules
116
            //$post->add_rules('imageup.*', 'upload::required', 'upload::valid', 'upload::type[gif,jpg,png]', 'upload::size[1M]');
117
118
            if ($post->validate()) {
119
                // It worked!
120
                // Move (and rename) the files from php upload folder to configured application folder
121
                upload::save('imageup1');
122
                upload::save('imageup2');
123
                echo 'Validation successfull, check your upload folder!';
124
            } else {
125
                // You got validation errors
126
                echo '<p>validation errors: '.var_export($post->errors(), true).'</p>';
127
                echo Kohana::debug($post);
128
            }
129
        }
130
131
        // Display the form
132
        echo form::open('examples/form', array('enctype' => 'multipart/form-data'));
133
        echo form::label('imageup', 'Image Uploads').':<br/>';
134
        // Use discrete upload fields
135
        // Alternative syntax for multiple file uploads
136
        // echo form::upload('imageup[]').'<br/>';
137
138
        echo form::upload('imageup1').'<br/>';
139
        echo form::upload('imageup2').'<br/>';
140
        echo form::submit('upload', 'Upload!');
141
        echo form::close();
142
    }
143
144
    /**
145
     * Demontrates how to use the Validation library to validate an arbitrary array.
146
     */
147
    public function validation()
148
    {
149
        // To demonstrate Validation being able to validate any array, I will
150
        // be using a pre-built array. When you load validation with no arguments
151
        // it will default to validating the POST array.
152
        $data = array(
153
            'user' => 'hello',
154
            'pass' => 'bigsecret',
155
            'reme' => '1'
156
        );
157
158
        $validation = new Validation($data);
159
160
        $validation->add_rules('user', 'required', 'length[1,12]')->pre_filter('trim', 'user');
161
        $validation->add_rules('pass', 'required')->post_filter('sha1', 'pass');
162
        $validation->add_rules('reme', 'required');
163
164
        $result = $validation->validate();
0 ignored issues
show
$result is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
165
166
        var_dump($validation->errors());
0 ignored issues
show
Security Debugging Code introduced by
var_dump($validation->errors()); looks like debug code. Are you sure you do not want to remove it? This might expose sensitive data.
Loading history...
167
        var_dump($validation->as_array());
168
169
        // Yay!
170
        echo '{execution_time} ALL DONE!';
171
    }
172
173
    /**
174
     * Demontrates how to use the Captcha library.
175
     */
176
    public function captcha()
0 ignored issues
show
captcha uses the super-global variable $_POST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
177
    {
178
        // Look at the counters for valid and invalid
179
        // responses in the Session Profiler.
180
        new Profiler;
181
182
        // Load Captcha library, you can supply the name
183
        // of the config group you would like to use.
184
        $captcha = new Captcha;
185
186
        // Ban bots (that accept session cookies) after 50 invalid responses.
187
        // Be careful not to ban real people though! Set the threshold high enough.
188
        if ($captcha->invalid_count() > 49) {
189
            exit('Bye! Stupid bot.');
0 ignored issues
show
Coding Style Compatibility introduced by
The method captcha() contains an exit expression.

An exit expression should only be used in rare cases. For example, if you write a short command line script.

In most cases however, using an exit expression makes the code untestable and often causes incompatibilities with other libraries. Thus, unless you are absolutely sure it is required here, we recommend to refactor your code to avoid its usage.

Loading history...
190
        }
191
192
        // Form submitted
193
        if ($_POST) {
194
            // Captcha::valid() is a static method that can be used as a Validation rule also.
195
            if (Captcha::valid($this->input->post('captcha_response'))) {
0 ignored issues
show
The property input does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
196
                echo '<p style="color:green">Good answer!</p>';
197
            } else {
198
                echo '<p style="color:red">Wrong answer!</p>';
199
            }
200
201
            // Validate other fields here
202
        }
203
204
        // Show form
205
        echo form::open();
206
        echo '<p>Other form fields here...</p>';
207
208
        // Don't show Captcha anymore after the user has given enough valid
209
        // responses. The "enough" count is set in the captcha config.
210
        if (! $captcha->promoted()) {
211
            echo '<p>';
212
            echo $captcha->render(); // Shows the Captcha challenge (image/riddle/etc)
213
            echo '</p>';
214
            echo form::input('captcha_response');
215
        } else {
216
            echo '<p>You have been promoted to human.</p>';
217
        }
218
219
        // Close form
220
        echo form::submit(array('value' => 'Check'));
221
        echo form::close();
222
    }
223
224
    /**
225
     * Demonstrates the features of the Database library.
226
     *
227
     * Table Structure:
228
     *  CREATE TABLE `pages` (
229
     *  `id` mediumint( 9 ) NOT NULL AUTO_INCREMENT ,
230
     *  `page_name` varchar( 100 ) NOT NULL ,
231
     *  `title` varchar( 255 ) NOT NULL ,
232
     *  `content` longtext NOT NULL ,
233
     *  `menu` tinyint( 1 ) NOT NULL default '0',
234
     *  `filename` varchar( 255 ) NOT NULL ,
235
     *  `order` mediumint( 9 ) NOT NULL ,
236
     *  `date` int( 11 ) NOT NULL ,
237
     *  `child_of` mediumint( 9 ) NOT NULL default '0',
238
     *  PRIMARY KEY ( `id` ) ,
239
     *  UNIQUE KEY `filename` ( `filename` )
240
     *  ) ENGINE = MYISAM DEFAULT CHARSET = utf8 PACK_KEYS =0;
241
     *
242
    */
243
    public function database()
244
    {
245
        $db = new Database;
0 ignored issues
show
Comprehensibility introduced by
Avoid variables with short names like $db. Configured minimum length is 3.

Short variable names may make your code harder to understand. Variable names should be self-descriptive. This check looks for variable names who are shorter than a configured minimum.

Loading history...
246
247
        $table = 'pages';
248
        echo 'Does the '.$table.' table exist? ';
249
        if ($db->table_exists($table)) {
250
            echo '<p>YES! Lets do some work =)</p>';
251
252
            $query = $db->select('DISTINCT pages.*')->from($table)->get();
253
            echo $db->last_query();
254
            echo '<h3>Iterate through the result:</h3>';
255
            foreach ($query as $item) {
256
                echo '<p>'.$item->title.'</p>';
257
            }
258
            echo '<h3>Numrows using count(): '.count($query).'</h3>';
259
            echo 'Table Listing:<pre>'.print_r($db->list_tables(), true).'</pre>';
260
261
            echo '<h3>Try Query Binding with objects:</h3>';
262
            $sql = 'SELECT * FROM '.$table.' WHERE id = ?';
263
            $query = $db->query($sql, array(1));
264
            echo '<p>'.$db->last_query().'</p>';
265
            $query->result(true);
266
            foreach ($query as $item) {
267
                echo '<pre>'.print_r($item, true).'</pre>';
268
            }
269
270
            echo '<h3>Try Query Binding with arrays (returns both associative and numeric because I pass MYSQL_BOTH to result():</h3>';
271
            $sql = 'SELECT * FROM '.$table.' WHERE id = ?';
272
            $query = $db->query($sql, array(1));
273
            echo '<p>'.$db->last_query().'</p>';
274
            $query->result(false, MYSQL_BOTH);
275
            foreach ($query as $item) {
276
                echo '<pre>'.print_r($item, true).'</pre>';
277
            }
278
279
            echo '<h3>Look, we can also manually advance the result pointer!</h3>';
280
            $query = $db->select('title')->from($table)->get();
281
            echo 'First:<pre>'.print_r($query->current(), true).'</pre><br />';
282
            $query->next();
283
            echo 'Second:<pre>'.print_r($query->current(), true).'</pre><br />';
284
            $query->next();
285
            echo 'Third:<pre>'.print_r($query->current(), true).'</pre>';
286
            echo '<h3>And we can reset it to the beginning:</h3>';
287
            $query->rewind();
288
            echo 'Rewound:<pre>'.print_r($query->current(), true).'</pre>';
289
290
            echo '<p>Number of rows using count_records(): '.$db->count_records('pages').'</p>';
291
        } else {
292
            echo 'NO! The '.$table.' table doesn\'t exist, so we can\'t continue =( ';
293
        }
294
        echo "<br/><br/>\n";
295
        echo 'done in {execution_time} seconds';
296
    }
297
298
    /**
299
     * Demonstrates how to use the Pagination library and Pagination styles.
300
     */
301
    public function pagination()
302
    {
303
        $pagination = new Pagination(array(
304
            // Base_url will default to the current URI
305
            // 'base_url'    => 'welcome/pagination_example/page/x',
306
307
            // The URI segment (integer) in which the pagination number can be found
308
            // The URI segment (string) that precedes the pagination number (aka "label")
309
            'uri_segment'    => 'page',
310
311
            // You could also use the query string for pagination instead of the URI segments
312
            // Just set this to the $_GET key that contains the page number
313
            // 'query_string'   => 'page',
314
315
            // The total items to paginate through (probably need to use a database COUNT query here)
316
            'total_items'    => 254,
317
318
            // The amount of items you want to display per page
319
            'items_per_page' => 10,
320
321
            // The pagination style: classic (default), digg, extended or punbb
322
            // Easily add your own styles to views/pagination and point to the view name here
323
            'style'          => 'classic',
324
325
            // If there is only one page, completely hide all pagination elements
326
            // Pagination->render() will return an empty string
327
            'auto_hide'      => true,
328
        ));
329
330
        // Just echo to display the links (__toString() rocks!)
331
        echo 'Classic style: '.$pagination;
332
333
        // You can also use the render() method and pick a style on the fly if you want
334
        echo '<hr /> Digg style:     ', $pagination->render('digg');
335
        echo '<hr /> Extended style: ', $pagination->render('extended');
336
        echo '<hr /> PunBB style:    ', $pagination->render('punbb');
337
        echo 'done in {execution_time} seconds';
338
    }
339
340
    /**
341
     * Demonstrates the User_Agent library.
342
     */
343
    public function user_agent()
344
    {
345
        foreach (array('agent', 'browser', 'version') as $key) {
346
            echo $key.': '.Kohana::user_agent($key).'<br/>'."\n";
347
        }
348
349
        echo "<br/><br/>\n";
350
        echo 'done in {execution_time} seconds';
351
    }
352
353
    /**
354
     * Demonstrates the Payment library.
355
     */
356
    /*function payment()
357
    {
358
        $credit_card = new Payment;
359
360
        // You can also pass the driver name to the library to use multiple ones:
361
        $credit_card = new Payment('Paypal');
362
        $credit_card = new Payment('Authorize');
363
364
        // You can specify one parameter at a time:
365
        $credit_card->login = 'this';
366
        $credit_card->first_name = 'Jeremy';
367
        $credit_card->last_name = 'Bush';
368
        $credit_card->card_num = '1234567890';
369
        $credit_card->exp_date = '0910';
370
        $credit_card->amount = '478.41';
371
372
        // Or you can also set fields with an array and the <Payment.set_fields> method:
373
        $credit_card->set_fields(array('login' => 'test',
374
                                       'first_name' => 'Jeremy',
375
                                       'last_name' => 'Bush',
376
                                       'card_num' => '1234567890',
377
                                       'exp_date' => '0910',
378
                                       'amount' => '487.41'));
379
380
        echo '<pre>'.print_r($credit_card, true).'</pre>';
381
382
        echo 'Success? ';
383
        echo ($response = $credit_card->process() == TRUE) ? 'YES!' : $response;
384
    }*/
385
386
    public function calendar()
387
    {
388
        $profiler = new Profiler;
0 ignored issues
show
$profiler is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
389
390
        $calendar = new Calendar($this->input->get('month', date('m')), $this->input->get('year', date('Y')));
391
        $calendar->attach($calendar->event()
392
                ->condition('year', 2008)
393
                ->condition('month', 8)
394
                ->condition('day', 8)
395
                ->output(html::anchor('http://forum.kohanaphp.com/comments.php?DiscussionID=275', 'Learning about Kohana Calendar')));
396
397
        echo $calendar->render();
398
    }
399
400
    /**
401
     * Demonstrates how to use the Image libarary..
402
     */
403
    public function image()
404
    {
405
        // For testing only, save the new image in DOCROOT
406
        $dir = realpath(DOCROOT);
407
408
        // Original Image filename
409
        $image = DOCROOT.'kohana.png';
410
411
        // Create an instance of Image, with file
412
        // The orginal image is not affected
413
        $image = new Image($image);
414
415
        // Most methods are chainable
416
        // Resize the image, crop the center left
417
        $image->resize(200, 100)->crop(150, 50, 'center', 'left');
418
419
        // Display image in browser.
420
        // Keep the actions, to be applied when saving the image.
421
        $image->render($keep_actions = true);
422
423
        // Save the image, as a jpeg
424
        // Here the actions will be discarded, by default.
425
        $image->save($dir.'/mypic_thumb.jpg');
426
427
        //echo Kohana::debug($image);
428
    }
429
430
    /**
431
     * Demonstrates how to use vendor software with Kohana.
432
     */
433
    public function vendor()
434
    {
435
        // Let's do a little Markdown shall we.
436
        $br = "\n\n";
0 ignored issues
show
Comprehensibility introduced by
Avoid variables with short names like $br. Configured minimum length is 3.

Short variable names may make your code harder to understand. Variable names should be self-descriptive. This check looks for variable names who are shorter than a configured minimum.

Loading history...
437
        $output = '#Marked Down!#'.$br;
438
        $output .= 'This **_markup_** is created *on-the-fly*, by ';
439
        $output .= '[php-markdown-extra](http://michelf.com/projects/php-markdown/extra)'.$br;
440
        $output .= 'It\'s *great* for user <input> & writing about `<HTML>`'.$br;
441
        $output .= 'It\'s also good at footnotes :-) [^1]'.$br;
442
        $output .= '[^1]: A footnote.';
443
444
        // looks in system/vendor for Markdown.php
445
        require Kohana::find_file('vendor', 'Markdown');
446
447
        echo Markdown($output);
448
449
        echo 'done in {execution_time} seconds';
450
    }
451
} // End Examples
452