Completed
Push — add/password-package ( 5968b4...00787a )
by
unknown
988:49 queued 977:52
created

Password_Checker::negative_in_array()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 2
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * Password Checker package.
4
 *
5
 * @package  automattic/jetpack-password-checker
6
 */
7
8
namespace Automattic\Jetpack;
9
10
/**
11
 * Checks passwords strength.
12
 */
13
class Password_Checker {
14
	/**
15
	 * Minimum entropy bits a password should contain. 36 bits of entropy is considered
16
	 * to be a reasonable password, 28 stands for a weak one.
17
	 *
18
	 * @var int
19
	 */
20
	public $minimum_entropy_bits = 28;
21
22
	/**
23
	 * Currently tested password.
24
	 *
25
	 * @var string
26
	 */
27
	public $password = '';
28
29
	/**
30
	 * Test results array.
31
	 *
32
	 * @var array
33
	 */
34
	public $test_results = array();
35
36
	/**
37
	 * Current password score.
38
	 *
39
	 * @var int
40
	 */
41
	public $score = 0;
42
43
	/**
44
	 * Current multiplier affecting the score.
45
	 *
46
	 * @var int
47
	 */
48
	public $multiplier = 4;
49
50
	/**
51
	 * A common password disallow list, which on match will immediately disqualify the password.
52
	 *
53
	 * @var array
54
	 */
55
	public $common_passwords = array();
56
57
	/**
58
	 * Minimum password length setting.
59
	 *
60
	 * @var int
61
	 */
62
	public $minimum_password_length = 6;
63
64
	/**
65
	 * User defined strings that passwords need to be tested for a match against.
66
	 *
67
	 * @var array
68
	 */
69
	private $user_strings_to_test = array();
70
71
	/**
72
	 * The user object for whom the password is being tested.
73
	 *
74
	 * @var mixed
75
	 */
76
	protected $user = null;
77
78
	/**
79
	 * The user identifier for whom the password is being tested, used if there's no user object.
80
	 *
81
	 * @var mixed
82
	 */
83
	protected $user_id = null;
84
85
	/**
86
	 * Creates an instance of the password checker class for the specified user, or
87
	 * defaults to the currently logged in user.
88
	 *
89
	 * @param mixed $user can be an integer ID, or a WP_User object.
90
	 */
91
	public function __construct( $user = null ) {
92 View Code Duplication
		if ( is_null( $user ) ) {
93
			$this->user_id = get_current_user_id();
94
		} elseif ( is_object( $user ) && isset( $user->ID ) ) {
95
			// Existing user, using their ID.
96
			$this->user_id = $user->ID;
97
		} elseif ( is_object( $user ) ) {
98
			// Newly created user, using existing data.
99
			$this->user    = $user;
100
			$this->user_id = 'new_user';
101
		} else {
102
			$this->user_id = $user;
103
		}
104
105
		/**
106
		 * Filters the password strength enforcement settings.
107
		 *
108
		 * You can supply your own passwords that should not be used for authenticating in addition to weak and easy
109
		 * to guess strings for each user. For example, you can add passwords from known password databases to avoid
110
		 * compromised password usage.
111
		 *
112
		 * @param array $common_passwords strings that are forbidden for use as passwords.
113
		 */
114
		$this->common_passwords = apply_filters( 'password_checker_common_passwords', $this->common_passwords );
115
116
		/**
117
		 * Filters the password strength enforcement settings.
118
		 *
119
		 * You can modify the minimum password length using this filter.
120
		 *
121
		 * @param int $minimum_password_length minimum password length.
122
		 */
123
		$this->minimum_password_length = apply_filters( 'password_checker_minimum_password_length', $this->minimum_password_length );
124
125
		/**
126
		 * Filters the password strength enforcement settings.
127
		 *
128
		 * You can modify the minimum entropy bits requirement using this filter.
129
		 *
130
		 * @param int $minimum_entropy_bits minimum entropy bits requirement.
131
		 */
132
		$this->minimum_entropy_bits = apply_filters( 'password_checker_minimum_entropy_bits', $this->minimum_entropy_bits );
133
	}
134
135
	/**
136
	 * Run tests against a password.
137
	 *
138
	 * @param string $password      the tested string.
139
	 * @param bool   $required_only only test against required conditions, defaults to false.
140
	 *
141
	 * @return array an array containing failed and passed test results.
142
	 */
143
	public function test( $password, $required_only = false ) {
144
		// Save the password for later use.
145
		$this->password = $password;
146
147
		// Run the tests.
148
		$results = $this->run_tests( $this->get_tests(), $required_only );
149
150
		// If we've failed on the required tests, return now.
151
		if ( ! empty( $results['failed'] ) ) {
152
			return array(
153
				'passed'       => false,
154
				'test_results' => $results,
155
			);
156
		}
157
158
		$entropy_bits = $this->calculate_entropy_bits( $this->password );
159
160
		// If we have failed the entropy bits test, run the regex tests so we can suggest improvements.
161 View Code Duplication
		if ( $entropy_bits < $this->minimum_entropy_bits ) {
162
			$results['failed']['entropy_bits'] = $entropy_bits;
163
			// Run the tests.
164
			$results = array_merge( $results, $this->run_tests( $this->get_tests( 'preg_match' ) ) );
0 ignored issues
show
Documentation introduced by
'preg_match' is of type string, but the function expects a false|array.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
165
		}
166
167
		return ( array(
168
			'passed'       => empty( $results['failed'] ),
169
			'test_results' => $results,
170
		) );
171
	}
172
173
	/**
174
	 * Run the tests using the currently set up object values.
175
	 *
176
	 * @param array $tests         tests to run.
177
	 * @param bool  $required_only whether to run only required tests.
178
	 *
179
	 * @return array test results.
180
	 */
181 View Code Duplication
	protected function run_tests( $tests, $required_only = false ) {
182
		$results = array(
183
			'passed' => array(),
184
			'failed' => array(),
185
		);
186
187
		foreach ( $tests as $test_type => $section_tests ) {
188
			foreach ( $section_tests as $test_name => $test_data ) {
189
				// Skip non-required tests if required_only param is set.
190
				if ( $required_only && ! $test_data['required'] ) {
191
					continue;
192
				}
193
194
				$result = call_user_func( array( $this, 'test_' . $test_type ), $test_data );
195
				if ( $result ) {
196
					$results['passed'][] = array( 'test_name' => $test_name );
197
				} else {
198
					$results['failed'][] = array(
199
						'test_name'   => $test_name,
200
						'explanation' => $test_data['error'],
201
					);
202
203
					if ( isset( $test_data['fail_immediately'] ) ) {
204
						return $results;
205
					}
206
				}
207
			}
208
		}
209
210
		return $results;
211
	}
212
213
	/**
214
	 * Returns an array of tests that need to be run on password strings.
215
	 *
216
	 * @param array $sections only return specific sections with the passed keys, defaults to all.
0 ignored issues
show
Documentation introduced by
Should the type for parameter $sections not be false|array?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
217
	 *
218
	 * @return array test descriptions.
219
	 */
220
	protected function get_tests( $sections = false ) {
221
		// Note: these should be in order of priority.
222
		$tests = array(
223
			'preg_match'      => array(
224
				'no_backslashes'   => array(
225
					'pattern'          => '/^[^\\\\]*$/u',
226
					'error'            => __( 'Passwords may not contain the character "\".', 'jetpack' ),
227
					'required'         => true,
228
					'fail_immediately' => true,
229
				),
230
				'minimum_length'   => array(
231
					'pattern'          => '/^.{' . $this->minimum_password_length . ',}/u',
232
					/* translators: %d is a number of characters in the password. */
233
					'error'            => sprintf( __( 'Password must be at least %d characters.', 'jetpack' ), $this->minimum_password_length ),
234
					'required'         => true,
235
					'fail_immediately' => true,
236
				),
237
				'has_mixed_case'   => array(
238
					'pattern'  => '/([a-z].*?[A-Z]|[A-Z].*?[a-z])/u',
239
					'error'    => __( 'This password is too easy to guess: you can improve it by adding additional uppercase letters, lowercase letters, or numbers.', 'jetpack' ),
240
					'required' => false,
241
				),
242
				'has_digit'        => array(
243
					'pattern'  => '/\d/u',
244
					'error'    => __( 'This password is too easy to guess: you can improve it by mixing both letters and numbers.', 'jetpack' ),
245
					'required' => false,
246
				),
247
				'has_special_char' => array(
248
					'pattern'  => '/[^a-zA-Z\d]/u',
249
					'error'    => __( 'This password is too easy to guess: you can improve it by including special characters such as !#=?*&.', 'jetpack' ),
250
					'required' => false,
251
				),
252
			),
253
			'compare_to_list' => array(
254
				'not_a_common_password'       => array(
255
					'list_callback'    => 'get_common_passwords',
256
					'compare_callback' => 'negative_in_array',
257
					'error'            => __( 'This is a very common password. Choose something that will be harder for others to guess.', 'jetpack' ),
258
					'required'         => true,
259
				),
260
				'not_same_as_other_user_data' => array(
261
					'list_callback'    => 'get_other_user_data',
262
					'compare_callback' => 'test_not_same_as_other_user_data',
263
					'error'            => __( 'Your password is too weak: Looks like you are including easy to guess information about yourself. Try something a little more unique.', 'jetpack' ),
264
					'required'         => true,
265
				),
266
			),
267
		);
268
269
		/**
270
		 * Filters the password strength enforcement settings.
271
		 *
272
		 * You can determine the tests run and their order based on whatever criteria you wish to specify.
273
		 *
274
		 * @param array $tests tests to run.
275
		 */
276
		$tests = apply_filters( 'password_checker_tests', $tests );
277
278
		if ( ! $sections ) {
279
			return $tests;
280
		}
281
282
		$sections = (array) $sections;
283
284
		return array_intersect_key( $tests, array_flip( $sections ) );
285
	}
286
287
	/**
288
	 * Provides the regular expression tester functionality.
289
	 *
290
	 * @param array $test_data the current test data.
291
	 *
292
	 * @return bool does the test pass?
293
	 */
294
	protected function test_preg_match( $test_data ) {
295
		return preg_match( $test_data['pattern'], $this->password );
296
	}
297
298
	/**
299
	 * Provides the comparison tester functionality.
300
	 *
301
	 * @param array $test_data the current test data.
302
	 *
303
	 * @return bool does the test pass?
304
	 */
305
	protected function test_compare_to_list( $test_data ) {
306 View Code Duplication
		if (
307
			! is_callable( array( $this, $test_data['list_callback'] ) )
308
			|| ! is_callable( array( $this, $test_data['compare_callback'] ) )
309
		) {
310
			return false;
311
		}
312
313
		return call_user_func(
314
			array(
315
				$this,
316
				$test_data['compare_callback'],
317
			),
318
			$this->password,
319
			call_user_func( array( $this, $test_data['list_callback'] ) )
320
		);
321
	}
322
323
	/**
324
	 * Getter for the common password list.
325
	 *
326
	 * @return array common passwords.
327
	 */
328
	protected function get_common_passwords() {
329
		return $this->common_passwords;
330
	}
331
332
	/**
333
	 * Returns the widely known user data that can not be used in the password to avoid
334
	 * predictable strings.
335
	 *
336
	 * @return array user data.
337
	 */
338
	protected function get_other_user_data() {
339
		if ( empty( $this->user_id ) ) {
340
			return array();
341
		}
342
343
		$user_data = get_userdata( $this->user_id );
344
		if ( ! $user_data ) {
345
			return array();
346
		}
347
348
		if ( isset( $user_data->ID ) ) {
349
			$this->add_user_strings_to_test( get_user_meta( $user_data->ID, 'first_name', true ) );
350
			$this->add_user_strings_to_test( get_user_meta( $user_data->ID, 'last_name', true ) );
351
			$this->add_user_strings_to_test( get_user_meta( $user_data->ID, 'nickname', true ) );
352
		}
353
354
		if ( isset( $user_data->user_nicename ) ) {
355
			$this->add_user_strings_to_test( $user_data->user_nicename );
356
		}
357
358
		if ( isset( $user_data->display_name ) ) {
359
			$this->add_user_strings_to_test( $user_data->display_name );
360
		}
361
362
		if ( isset( $user_data->first_name ) ) {
363
			$this->add_user_strings_to_test( $user_data->first_name );
364
		}
365
366
		if ( isset( $user_data->last_name ) ) {
367
			$this->add_user_strings_to_test( $user_data->last_name );
368
		}
369
370
		if ( isset( $user_data->user_email ) ) {
371
			$email_username = substr( $user_data->user_email, 0, strpos( $user_data->user_email, '@' ) );
372
			$this->add_user_strings_to_test( $email_username, '.' );
373
			$this->add_user_strings_to_test( $user_data->user_email );
374
		}
375
376
		return $this->get_user_strings_to_test();
377
	}
378
379
	/**
380
	 * Compare the password for matches with known user data.
381
	 *
382
	 * @param string $password        the string to be tested.
383
	 * @param array  $strings_to_test known user data.
384
	 *
385
	 * @return bool does the test pass?
386
	 */
387 View Code Duplication
	protected function test_not_same_as_other_user_data( $password, $strings_to_test ) {
388
		if ( empty( $strings_to_test ) ) {
389
			return false;
390
		}
391
392
		$password_lowercase = strtolower( $password );
393
394
		foreach ( $strings_to_test as $string ) {
395
			$string          = strtolower( $string );
396
			$string_reversed = strrev( $string );
397
398
			if ( $password_lowercase === $string || $password_lowercase === $string_reversed ) {
399
				return false;
400
			}
401
402
			// Also check for the string or reversed string with any numbers just stuck to the end to catch things like bob123 as passwords.
403
			if (
404
				preg_match( '/^' . preg_quote( $string, '/' ) . '\d+$/', $password_lowercase )
405
				|| preg_match( '/^' . preg_quote( $string_reversed, '/' ) . '\d+$/', $password_lowercase )
406
			) {
407
				return false;
408
			}
409
		}
410
411
		return true;
412
	}
413
414
	/**
415
	 * A shorthand for the not in array construct.
416
	 *
417
	 * @param mixed $needle   the needle.
418
	 * @param array $haystack the haystack.
419
	 *
420
	 * @return bool is the needle not in the haystack?
421
	 */
422
	protected function negative_in_array( $needle, $haystack ) {
423
		return ! in_array( $needle, $haystack, true );
424
	}
425
426
	/**
427
	 * A helper function used to break a single string into its constituents so
428
	 * that both the full string and its constituents and any variants thereof
429
	 * can be tested against the password.
430
	 *
431
	 * @param string $string            the string to be broken down.
432
	 * @param string $explode_delimiter delimiter.
433
	 *
434
	 * @return bool
435
	 */
436
	protected function add_user_strings_to_test( $string, $explode_delimiter = ' ' ) {
437
		// Don't check against empty strings.
438
		if ( empty( $string ) ) {
439
			return false;
440
		}
441
442
		$strings = explode( $explode_delimiter, $string );
443
444
		// Remove any non alpha numeric characters from the strings to check against.
445
		foreach ( $strings as $key => $_string ) {
446
			$_string = trim( preg_replace( '/[^a-zA-Z0-9]/', '', $_string ) );
447
			if ( empty( $_string ) ) {
448
				continue;
449
			}
450
451
			$strings[ $key ] = $_string;
452
		}
453
454
		// Check the original too.
455
		$strings[] = trim( $string );
456
457
		// Check the original minus non alpha numeric characters.
458
		$strings[] = trim( preg_replace( '/[^a-zA-Z0-9]/', '', $string ) );
459
460
		// Remove any empty strings.
461
		// Note: This will also filter out '0'.
462
		$strings = array_filter( $strings );
463
		if ( empty( $strings ) ) {
464
			return false;
465
		}
466
467
		$this->user_strings_to_test = array_unique( array_merge( $this->user_strings_to_test, $strings ) );
468
469
		return true;
470
	}
471
472
	/**
473
	 * Getter for the user strings array.
474
	 *
475
	 * @return array user strings.
476
	 */
477
	protected function get_user_strings_to_test() {
478
		return $this->user_strings_to_test;
479
	}
480
481
	/**
482
	 * Return a character set size that is used in the string.
483
	 *
484
	 * @param string $password the password.
485
	 *
486
	 * @return int number of different character sets in use.
487
	 */
488 View Code Duplication
	protected function get_charset_size( $password ) {
489
		$size = 0;
490
491
		// Lowercase a-z.
492
		if ( preg_match( '/[a-z]/', $password ) ) {
493
			$size += 26;
494
		}
495
496
		// Uppercase A-Z.
497
		if ( preg_match( '/[A-Z]/', substr( $password, 1, - 1 ) ) ) {
498
			$size += 26;
499
		}
500
501
		// Digits.
502
		if ( preg_match( '/\d/', substr( $password, 1, - 1 ) ) ) {
503
			$size += 10;
504
		}
505
506
		// Over digits symbols.
507
		if ( preg_match( '/[!|@|#|$|%|^|&|*|(|)]/', $password ) ) {
508
			$size += 10;
509
		}
510
511
		// Other symbols.
512
		if ( preg_match( '#[`|~|-|_|=|+|\[|{|\]|}|\\|\|;:\'",<\.>/\?]#', $password ) ) {
513
			$size += 20;
514
		}
515
516
		// Spaces.
517
		if ( strpos( $password, ' ' ) ) {
518
			$size ++;
519
		}
520
521
		return $size;
522
	}
523
524
	/**
525
	 * Shorthand for getting a character index.
526
	 *
527
	 * @param string $char character.
528
	 *
529
	 * @return int the character code.
530
	 */
531 View Code Duplication
	protected function get_char_index( $char ) {
532
		$char = strtolower( $char[0] );
533
		if ( $char < 'a' || $char > 'z' ) {
534
			return 0;
535
		} else {
536
			return ord( $char[0] ) - ord( 'a' ) + 1;
537
		}
538
	}
539
540
	/**
541
	 * This is the password strength calculation algorithm, based on the formula H = L(logN/log2).
542
	 *
543
	 * H = Entropy
544
	 * L = String length (the for iterator)
545
	 * N = Our charset size, via get_charset_size()
546
	 *
547
	 * @see https://en.wikipedia.org/wiki/Password_strength#Random_passwords
548
	 *
549
	 * On top of the base formula, we're also multiplying the bits of entropy for every char
550
	 * by 1 - (the probabily of it following the previous char)
551
	 * i.e.: the probablity of U following Q is ~0.84. If our password contains this pair of characters,
552
	 * the u char will only add ( 0.16^2 * charset_score ) to our total of entropy bits.
553
	 *
554
	 * @param string $password the password.
555
	 *
556
	 * @return float|int
557
	 */
558 View Code Duplication
	protected function calculate_entropy_bits( $password ) {
559
		$bits = 0;
560
		// Calculate the score.
561
		$charset_score = log( $this->get_charset_size( $password ) ) / log( 2 );
562
563
		$aidx   = $this->get_char_index( $password[0] );
564
		$length = strlen( $password );
565
566
		for ( $b = 1; $b < $length; $b ++ ) {
567
			$bidx = $this->get_char_index( $password[ $b ] );
568
569
			// 27 = number of chars in the index (a-z,' ').
570
			$c = 1.0 - $this->frequency_table[ $aidx * 27 + $bidx ];
571
572
			// Increment the bits.
573
			$bits += $charset_score * $c * $c;
574
575
			// Move on to next pair.
576
			$aidx = $bidx;
577
		}
578
579
		return $bits;
580
	}
581
582
	/**
583
	 * A frequency table of character pairs, starting with  '  ' then  ' a', ' b' [...] , 'a ', 'aa' etc.
584
	 *
585
	 * @see http://rumkin.com/tools/password/passchk.php
586
	 *
587
	 * @var array
588
	 */
589
	public $frequency_table = array(
590
		0.23653710453418866,
591
		0.04577693541332556,
592
		0.03449832337075375,
593
		0.042918209651552706,
594
		0.037390873305146524,
595
		0.028509112115468728,
596
		0.02350896632162123,
597
		0.022188657238664526,
598
		0.028429800262428927,
599
		0.04357019973757107,
600
		0.00913602565971716,
601
		0.03223093745443942,
602
		0.02235311269864412,
603
		0.04438081352966905,
604
		0.04512377897652719,
605
		0.020055401662049863,
606
		0.055903192885260244,
607
		0.0024388394809739026,
608
		0.035207464644991984,
609
		0.07355941099285611,
610
		0.036905671380667734,
611
		0.026134421927394666,
612
		0.023787724158040528,
613
		0.011352092141711621,
614
		0.0032354570637119114,
615
		0.005986878553725033,
616
		0.008861933226417843,
617
		0.11511532293337222,
618
		0.027556203528211108,
619
		0.024331243621519172,
620
		0.039266365359381834,
621
		0.031599941682461,
622
		0.014403265782183991,
623
		0.015480973902901297,
624
		0.027770812071730572,
625
		0.00942761335471643,
626
		0.039872867764980315,
627
		0.0078122175244204695,
628
		0.02808456043154979,
629
		0.08429100451960927,
630
		0.04688963405744277,
631
		0.13831170724595424,
632
		0.002540311998833649,
633
		0.025211838460416972,
634
		0.001543082081936142,
635
		0.09519638431258201,
636
		0.061845750109345385,
637
		0.08907071001603732,
638
		0.02137571074500656,
639
		0.027093162268552268,
640
		0.005521504592506197,
641
		0.003023181221752442,
642
		0.007086747339262283,
643
		0.010262720513194342,
644
		0.08785070710016038,
645
		0.14617757690625455,
646
		0.03417291150313457,
647
		0.0059635515381250915,
648
		0.006146668610584633,
649
		0.195202799241872,
650
		0.002774748505613063,
651
		0.004715556203528212,
652
		0.0044776206444088066,
653
		0.11205481848665985,
654
		0.005654468581425864,
655
		0.0028820527773727946,
656
		0.07383000437381543,
657
		0.005516839189386207,
658
		0.006496573844583759,
659
		0.09843067502551392,
660
		0.0027140982650532145,
661
		0.0006893133109782768,
662
		0.08425368129464937,
663
		0.021325557661466685,
664
		0.006493074792243767,
665
		0.07023414491908442,
666
		0.002077270739174807,
667
		0.0024633328473538415,
668
		0.0007744569179180639,
669
		0.015413325557661468,
670
		0.0011990086018370024,
671
		0.13162851727657093,
672
		0.10115993585070711,
673
		0.0026989357049132527,
674
		0.03319317684793702,
675
		0.002946202070272634,
676
		0.0783216212275842,
677
		0.0018358361277154103,
678
		0.00258813238081353,
679
		0.2141688292754046,
680
		0.09853681294649366,
681
		0.0032482869222918796,
682
		0.04359352675317102,
683
		0.01993526753171016,
684
		0.0036880011663507797,
685
		0.008011663507799971,
686
		0.12014696019827964,
687
		0.0029846916460125384,
688
		0.0017553579238956116,
689
		0.029470185158186325,
690
		0.010413179763813967,
691
		0.030699518880303252,
692
		0.03508499781309229,
693
		0.002021285901734947,
694
		0.0010613792097973467,
695
		0.0005295232541186761,
696
		0.009677212421635807,
697
		0.010585799679253535,
698
		0.17101734946785244,
699
		0.07968625164018078,
700
		0.007839043592360402,
701
		0.005438693687126403,
702
		0.0183606939787141,
703
		0.2732701559994168,
704
		0.004953491762647616,
705
		0.007259367254701851,
706
		0.008104971570199739,
707
		0.13274588132380813,
708
		0.004210526315789474,
709
		0.004997813092287506,
710
		0.017006560723137484,
711
		0.007442484327161393,
712
		0.016789619478058026,
713
		0.08477737279486806,
714
		0.005106283714827234,
715
		0.0005026971861787433,
716
		0.04040355736987899,
717
		0.037535500801866156,
718
		0.00885960052485785,
719
		0.0336410555474559,
720
		0.007066919376002332,
721
		0.005344219273946639,
722
		0.0006333284735384167,
723
		0.010684939495553289,
724
		0.0063064586674442345,
725
		0.15386849394955532,
726
		0.015049424114302375,
727
		0.012162705933809595,
728
		0.020425134859308938,
729
		0.037366379938766583,
730
		0.02157165767604607,
731
		0.009373961218836564,
732
		0.0173214754337367,
733
		0.009616562181075958,
734
		0.029522670943286193,
735
		0.010154249890654615,
736
		0.018600962239393497,
737
		0.06362210234728094,
738
		0.03157078291296107,
739
		0.151603440734801,
740
		0.0062329785683044175,
741
		0.014775331681003062,
742
		0.0020854351946347867,
743
		0.1826342032366234,
744
		0.0878017203674005,
745
		0.054190989940224525,
746
		0.010329202507654177,
747
		0.012763376585508092,
748
		0.0064872430383437815,
749
		0.006381105117364048,
750
		0.005388540603586529,
751
		0.0090800408222773,
752
		0.09611196967487973,
753
		0.09940691062837148,
754
		0.01033969966467415,
755
		0.004034407348009914,
756
		0.008826942703017933,
757
		0.11474675608689314,
758
		0.07132584924916169,
759
		0.012388977985129028,
760
		0.005435194634786413,
761
		0.1417174515235457,
762
		0.0037066627788307337,
763
		0.0045802595130485495,
764
		0.060800699810468,
765
		0.005341886572386646,
766
		0.005683627350925791,
767
		0.12434932205860913,
768
		0.004596588423968508,
769
		0.0007534626038781163,
770
		0.07107041842834232,
771
		0.022361277154104096,
772
		0.04784720804782038,
773
		0.06277533168100306,
774
		0.003441901151771395,
775
		0.005828254847645429,
776
		0.0009669047966175828,
777
		0.009470768333576322,
778
		0.002077270739174807,
779
		0.12797667298440007,
780
		0.08797783933518005,
781
		0.005388540603586529,
782
		0.0024913252660737715,
783
		0.007550954949701123,
784
		0.2786866890217233,
785
		0.002509986878553725,
786
		0.029002478495407494,
787
		0.0303204548768042,
788
		0.07576614666861058,
789
		0.00246799825047383,
790
		0.00592389561160519,
791
		0.039574281965301064,
792
		0.00706808572678233,
793
		0.03304505029887739,
794
		0.05474150750838315,
795
		0.0028633911648928414,
796
		0.0005073625892987316,
797
		0.07293541332555767,
798
		0.053528502697186175,
799
		0.022566554891383584,
800
		0.038151334013704616,
801
		0.002716430966613209,
802
		0.005049132526607377,
803
		0.0009902318122175246,
804
		0.008997229916897508,
805
		0.0011861787432570347,
806
		0.1666377022889634,
807
		0.14414462749671964,
808
		0.003374252806531564,
809
		0.005169266656947077,
810
		0.008468873013558828,
811
		0.16337541915731155,
812
		0.002873888321912815,
813
		0.004305000728969237,
814
		0.0031141565825922144,
815
		0.1241172182533897,
816
		0.0052800699810468,
817
		0.008969237498177577,
818
		0.024094474413179766,
819
		0.017029887738737422,
820
		0.01722700102055693,
821
		0.10618457501093455,
822
		0.006147834961364631,
823
		0.0008269427030179326,
824
		0.03303571949263741,
825
		0.024188948826359528,
826
		0.05213937891820965,
827
		0.04505846333284735,
828
		0.0035270447587111824,
829
		0.006799825047383001,
830
		0.0008199445983379502,
831
		0.02206735675754483,
832
		0.001010059775477475,
833
		0.11971191135734072,
834
		0.04656538854060359,
835
		0.011243621519171892,
836
		0.06513019390581717,
837
		0.032375564951159064,
838
		0.06347047674588133,
839
		0.013678961947805804,
840
		0.03309870243475726,
841
		0.006982942119842543,
842
		0.009726199154395685,
843
		0.010121592068814697,
844
		0.032514360693978714,
845
		0.04986032949409535,
846
		0.039734072022160664,
847
		0.15690683773144773,
848
		0.03949963551538125,
849
		0.014790494241143023,
850
		0.002722262720513194,
851
		0.02614375273363464,
852
		0.10753637556495116,
853
		0.06764834523983088,
854
		0.006221315060504448,
855
		0.021317393206006705,
856
		0.0030826651115322934,
857
		0.002399183554454002,
858
		0.0019069835252952323,
859
		0.015595276279341012,
860
		0.0925126111678087,
861
		0.18437906400349907,
862
		0.006538562472663654,
863
		0.008719638431258201,
864
		0.02116693395538708,
865
		0.18241376293920394,
866
		0.007290858725761773,
867
		0.005976381396705059,
868
		0.005629975215045925,
869
		0.09721300481119698,
870
		0.004810030616707975,
871
		0.024303251202799244,
872
		0.012954658113427612,
873
		0.011057005394372358,
874
		0.02733459688001166,
875
		0.10135121737862662,
876
		0.012016912086309959,
877
		0.001055547455897361,
878
		0.009027555037177431,
879
		0.07162326869806095,
880
		0.01007143898527482,
881
		0.07297623560285756,
882
		0.006741507508383147,
883
		0.0036891675171307776,
884
		0.0008409389123778977,
885
		0.011272780288671819,
886
		0.007020265344802449,
887
		0.1030389269572824,
888
		0.15350809155853623,
889
		0.004232686980609419,
890
		0.004353987461729115,
891
		0.0023385333138941536,
892
		0.14450386353695874,
893
		0.002546143752733635,
894
		0.0024470039364338824,
895
		0.01200758128006998,
896
		0.0981227584195947,
897
		0.003161976964572095,
898
		0.040695145064878264,
899
		0.03460446129173349,
900
		0.003908441463770229,
901
		0.01598483743986004,
902
		0.13107216795451232,
903
		0.003129319142732177,
904
		0.00032307916605919226,
905
		0.04050386353695874,
906
		0.05452689896486368,
907
		0.03589677795597026,
908
		0.07087097244496282,
909
		0.006143169558244642,
910
		0.008684647907858289,
911
		0.0004607085580988482,
912
		0.022010205569324977,
913
		0.0009097536083977258,
914
		0.07328765126111678,
915
		0.14751421490013122,
916
		0.008015162560139961,
917
		0.006601545414783497,
918
		0.025279486805656802,
919
		0.1682449336637994,
920
		0.008313748359819215,
921
		0.007010934538562473,
922
		0.005886572386645284,
923
		0.16889575739903775,
924
		0.004123050007289692,
925
		0.011925936725470185,
926
		0.10007289692374982,
927
		0.013380376148126549,
928
		0.009021723283277445,
929
		0.08650823735238372,
930
		0.007756232686980609,
931
		0.0007243038343781893,
932
		0.0026791077416533026,
933
		0.02797492345823006,
934
		0.032384895757399036,
935
		0.04187432570345531,
936
		0.00882461000145794,
937
		0.0032401224668318998,
938
		0.00033357632307916605,
939
		0.027878116343490307,
940
		0.0022277299897944304,
941
		0.14333518005540166,
942
		0.1725534334451086,
943
		0.02781629975215046,
944
		0.006909462020702727,
945
		0.005264907420906838,
946
		0.16661437527336345,
947
		0.004325995043009185,
948
		0.003334596880011664,
949
		0.005312727802886718,
950
		0.14024668318996938,
951
		0.0013261408368566844,
952
		0.003504884093891238,
953
		0.006375273363464061,
954
		0.04964922000291588,
955
		0.008290421344219274,
956
		0.09536783787724158,
957
		0.05394372357486515,
958
		0.005505175681586237,
959
		0.005339553870826651,
960
		0.01782067356757545,
961
		0.006710016037323225,
962
		0.05105933809593235,
963
		0.002983525295232541,
964
		0.002940370316372649,
965
		0.0004548768041988629,
966
		0.01208456043154979,
967
		0.000915585362297711,
968
		0.20146260387811635,
969
		0.067196967487972,
970
		0.006158332118384605,
971
		0.025438110511736407,
972
		0.07753783350342616,
973
		0.1273876658405015,
974
		0.009337804344656656,
975
		0.07683452398308792,
976
		0.0070412596588423975,
977
		0.08747164309666132,
978
		0.0038827817466102928,
979
		0.018116926665694706,
980
		0.005017641055547455,
981
		0.004567429654468581,
982
		0.028277008310249308,
983
		0.05271555620352821,
984
		0.004394809739029013,
985
		0.0013343052923166642,
986
		0.00411605190260971,
987
		0.059621519171890944,
988
		0.09073859163143316,
989
		0.01446858142586383,
990
		0.006770666277883074,
991
		0.003425572240851436,
992
		0.0004455459979588861,
993
		0.010401516256013998,
994
		0.005825922146085436,
995
		0.10833882490158916,
996
		0.007584779122321038,
997
		0.016903921854497742,
998
		0.02719580113719201,
999
		0.0304814112844438,
1000
		0.02206385770520484,
1001
		0.013064295086747339,
1002
		0.02696369733197259,
1003
		0.009581571657676046,
1004
		0.026761918647033093,
1005
		0.006510570053943724,
1006
		0.021941390873305145,
1007
		0.07042659279778393,
1008
		0.05437410701268406,
1009
		0.1425175681586237,
1010
		0.027802303542790494,
1011
		0.037690625455605774,
1012
		0.0019606356611750987,
1013
		0.1095623268698061,
1014
		0.06157748942994606,
1015
		0.044618749088788455,
1016
		0.04955124653739612,
1017
		0.03608689313310978,
1018
		0.018381688292754043,
1019
		0.003404577926811489,
1020
		0.015036594255722409,
1021
		0.009600233270156,
1022
		0.10794693103951014,
1023
		0.12447528794284882,
1024
		0.0031981338387520046,
1025
		0.0074716430966613205,
1026
		0.003202799241871993,
1027
		0.13437643971424407,
1028
		0.006655197550663361,
1029
		0.0036693395538708266,
1030
		0.049338970695436656,
1031
		0.09486863974340283,
1032
		0.0015990669193760023,
1033
		0.0026604461291733486,
1034
		0.051775477474850555,
1035
		0.0041347135150896636,
1036
		0.005450357194926374,
1037
		0.12030325120279925,
1038
		0.04581309228750547,
1039
		0.0004537104534188657,
1040
		0.12425601399620935,
1041
		0.025981629975215047,
1042
		0.023926519900860182,
1043
		0.04423385333138941,
1044
		0.0017950138504155123,
1045
		0.002661612479953346,
1046
		0.0006333284735384167,
1047
		0.008449045050298877,
1048
		0.000653156436798367,
1049
		0.04816678816153958,
1050
		0.008625164018078437,
1051
		0.0039037760606502403,
1052
		0.005228750546726928,
1053
		0.004531272780288672,
1054
		0.0056672984400058316,
1055
		0.00359585945473101,
1056
		0.0032179618020119548,
1057
		0.0038093016474704767,
1058
		0.011452398308791368,
1059
		0.002519317684793702,
1060
		0.00280390727511299,
1061
		0.005572824026826068,
1062
		0.004554599795888614,
1063
		0.004531272780288672,
1064
		0.0035841959469310393,
1065
		0.004400641492928998,
1066
		0.0036670068523108326,
1067
		0.004839189386207902,
1068
		0.006258638285464354,
1069
		0.004897506925207757,
1070
		0.840776789619478,
1071
		0.004968654322787578,
1072
		0.002886718180492783,
1073
		0.0019757982213150604,
1074
		0.0018568304417553576,
1075
		0.001691208630995772,
1076
		0.09009243329931477,
1077
		0.14030150167662925,
1078
		0.013242746756086894,
1079
		0.013746610293045632,
1080
		0.027342761335471644,
1081
		0.16938912377897652,
1082
		0.006607377168683481,
1083
		0.01661933226417845,
1084
		0.008173786266219566,
1085
		0.13297448607668758,
1086
		0.0034675608689313307,
1087
		0.016641492928998396,
1088
		0.011722991689750693,
1089
		0.021493512173786266,
1090
		0.03430820819361423,
1091
		0.10099548039072752,
1092
		0.00873596734217816,
1093
		0.0018323370753754193,
1094
		0.020103222044029742,
1095
		0.047197550663362,
1096
		0.040833940807697915,
1097
		0.03361189677795597,
1098
		0.010844729552412887,
1099
		0.005544831608106138,
1100
		0.0007522962530981193,
1101
		0.01525120279924187,
1102
		0.00815512465373961,
1103
		0.2109648636827526,
1104
		0.058258055110074355,
1105
		0.007181221752442048,
1106
		0.043560868931331105,
1107
		0.004058900714389853,
1108
		0.10618107595859454,
1109
		0.0062399766729844,
1110
		0.004835690333867911,
1111
		0.02679224376731302,
1112
		0.08414637702288964,
1113
		0.0030698352529523252,
1114
		0.03637498177576906,
1115
		0.01592885260242018,
1116
		0.017413617145356466,
1117
		0.008430383437818923,
1118
		0.037231083248286924,
1119
		0.03290275550371775,
1120
		0.007538125091121154,
1121
		0.004500947660008748,
1122
		0.05932409972299169,
1123
		0.16006764834523984,
1124
		0.03309636973319726,
1125
		0.007766729844000583,
1126
		0.005225251494386936,
1127
		0.0006321621227584196,
1128
		0.012989648636827526,
1129
		0.005274238227146815,
1130
		0.1254503571949264,
1131
		0.12852719055255868,
1132
		0.0035433736696311416,
1133
		0.005203090829566993,
1134
		0.0019314768916751715,
1135
		0.20520775623268697,
1136
		0.002509986878553725,
1137
		0.00343606939787141,
1138
		0.027138649948972155,
1139
		0.13926578218399185,
1140
		0.004565096952908587,
1141
		0.005614812654905963,
1142
		0.00874413179763814,
1143
		0.004109053797929727,
1144
		0.008300918501239247,
1145
		0.08270943286193323,
1146
		0.002912377897652719,
1147
		0.0037066627788307337,
1148
		0.06909578655780726,
1149
		0.03242805073625893,
1150
		0.05237614812654906,
1151
		0.04723487388832191,
1152
		0.0038991106575302524,
1153
		0.006299460562764251,
1154
		0.00043388249015891526,
1155
		0.020029741944889927,
1156
		0.005311561452106721,
1157
		0.09334072022160665,
1158
		0.022940953491762648,
1159
		0.024658988190698353,
1160
		0.02901297565242747,
1161
		0.03531593526753171,
1162
		0.0758023035427905,
1163
		0.013711619769645722,
1164
		0.021597317393206007,
1165
		0.009670214316955824,
1166
		0.044728386062108175,
1167
		0.010596296836273509,
1168
		0.03264382563055839,
1169
		0.0604822860475288,
1170
		0.05489546581134276,
1171
		0.11501851581863246,
1172
		0.01837585653885406,
1173
		0.026237060796034405,
1174
		0.0011255285026971862,
1175
		0.08704125965884241,
1176
		0.10156349322058608,
1177
		0.06660562764251349,
1178
		0.023434319871701415,
1179
		0.010777081207173057,
1180
		0.005409534917626476,
1181
		0.003123487388832191,
1182
		0.0028762210234728096,
1183
		0.0089995626184575,
1184
		0.07518297127861205,
1185
		0.2314868056568013,
1186
		0.002226563639014434,
1187
		0.003285610147251786,
1188
		0.0027455897361131363,
1189
		0.2724537104534189,
1190
		0.0016655489138358362,
1191
		0.0019209797346551977,
1192
		0.0022137337804344656,
1193
		0.17690392185449774,
1194
		0.0014532730718763668,
1195
		0.0024994897215337513,
1196
		0.015302522233561744,
1197
		0.003441901151771395,
1198
		0.015303688584341741,
1199
		0.09314593964134713,
1200
		0.0017833503426155418,
1201
		0.0005108616416387229,
1202
		0.017828838023035427,
1203
		0.010385187345094037,
1204
		0.003168975069252078,
1205
		0.01902901297565243,
1206
		0.005525003644846187,
1207
		0.0010088934246974776,
1208
		0.0009272488700976819,
1209
		0.036282840064149294,
1210
		0.0022977110365942554,
1211
		0.0766805656801283,
1212
		0.22270418428342326,
1213
		0.005283569033386791,
1214
		0.007155562035282111,
1215
		0.01173582154833066,
1216
		0.1715620352821111,
1217
		0.003925936725470185,
1218
		0.004425134859308937,
1219
		0.020040239101909902,
1220
		0.14243242455168392,
1221
		0.0016737133692958156,
1222
		0.0066808572678232975,
1223
		0.011980755212130047,
1224
		0.012638577052048404,
1225
		0.07206065024055984,
1226
		0.08115701997375711,
1227
		0.00710424260096224,
1228
		0.0007278028867181805,
1229
		0.02347630849978131,
1230
		0.04595538708266512,
1231
		0.01481965301064295,
1232
		0.013925061962385188,
1233
		0.0018125091121154687,
1234
		0.00529173348884677,
1235
		0.0016340574427759146,
1236
		0.03072401224668319,
1237
		0.0023746901880740633,
1238
		0.25174165330223064,
1239
		0.06673392622831317,
1240
		0.00878378772415804,
1241
		0.03956261845750109,
1242
		0.010077270739174807,
1243
		0.0844787869951888,
1244
		0.00985216503863537,
1245
		0.004973319725907567,
1246
		0.01893220586091267,
1247
		0.11200583175389998,
1248
		0.0028715556203528212,
1249
		0.004095057588569762,
1250
		0.01202391019098994,
1251
		0.01756757544831608,
1252
		0.014825484764542934,
1253
		0.05312961073042717,
1254
		0.06746872721971132,
1255
		0.003845458521650386,
1256
		0.0210806239976673,
1257
		0.019443067502551394,
1258
		0.08017028721387957,
1259
		0.01825572240851436,
1260
		0.005365213587986587,
1261
		0.01959702580551101,
1262
		0.026184575010934536,
1263
		0.02474879720075813,
1264
		0.002171745152354571,
1265
		0.25827321767021433,
1266
		0.048050153083539875,
1267
		0.01043184137629392,
1268
		0.03930485493512174,
1269
		0.027640180784370902,
1270
		0.03294007872867765,
1271
		0.006474413179763814,
1272
		0.018314039947514214,
1273
		0.015119405161102202,
1274
		0.014706516984983233,
1275
		0.005494678524566263,
1276
		0.03309870243475726,
1277
		0.043864120134130345,
1278
		0.058996355153812505,
1279
		0.06265986295378335,
1280
		0.04633328473538417,
1281
		0.03790756670068523,
1282
		0.0004642076104388394,
1283
		0.037849249161685375,
1284
		0.08369966467415076,
1285
		0.04999679253535501,
1286
		0.02392768625164018,
1287
		0.010998687855372504,
1288
		0.009881323808135296,
1289
		0.003867619186470331,
1290
		0.012434465665548913,
1291
		0.007253535500801866,
1292
		0.11106225397288234,
1293
		0.17624726636535937,
1294
		0.008209943140399476,
1295
		0.008390727511299025,
1296
		0.012682898381688294,
1297
		0.1825653885406036,
1298
		0.001538416678816154,
1299
		0.004590756670068524,
1300
		0.008710307625018223,
1301
		0.1299513048549351,
1302
		0.002677941390873305,
1303
		0.012309666132089225,
1304
		0.014087184720804781,
1305
		0.01199941682461,
1306
		0.031246537396121883,
1307
		0.07206648199445984,
1308
		0.008254264470039366,
1309
		0.0007033095203382417,
1310
		0.007034261554162415,
1311
		0.006599212713223502,
1312
		0.013906400349905234,
1313
		0.050098265053214755,
1314
		0.007133401370462167,
1315
		0.017750692520775622,
1316
		0.0008257763522379356,
1317
		0.03918821985712203,
1318
		0.06015454147834961,
1319
	);
1320
}
1321