From e0e2392c3cb3282765a945c6461421dab9c19afc Mon Sep 17 00:00:00 2001
From: Lai Power $msg ' . __( 'Fill in the options below if you want to be notified by mail about new vulnerabilities. To add multiple e-mail addresses comma separate them.', 'wpscan' ) . '';
+ echo '
';
+
+ // Output upgrade/manage button.
+ echo "$btn_text";
+ }
+}
diff --git a/wp-content/plugins/wpscan/app/Checks/Check.php b/wp-content/plugins/wpscan/app/Checks/Check.php
new file mode 100644
index 0000000..ccc6dfb
--- /dev/null
+++ b/wp-content/plugins/wpscan/app/Checks/Check.php
@@ -0,0 +1,244 @@
+id = $id;
+ $this->dir = $dir;
+ $this->parent = $parent;
+
+ $count = $this->get_vulnerabilities_count();
+
+ $this->actions[] = array(
+ 'id' => 'run',
+ 'title' => __( 'Run', 'wpscan' ),
+ 'method' => 'run',
+ );
+
+ if ( $count > 0 ) {
+ $this->actions[] = array(
+ 'id' => 'dismiss',
+ 'title' => __( 'Dismiss', 'wpscan' ),
+ 'method' => 'dismiss',
+ 'confirm' => true,
+ );
+ }
+
+ if ( method_exists( $this, 'init' ) ) {
+ $this->init();
+ }
+ }
+
+ /**
+ * Check title.
+ *
+ * @since 1.0.0
+ * @access public
+ * @return string
+ */
+ abstract public function title();
+
+ /**
+ * Check description.
+ *
+ * @since 1.0.0
+ * @access public
+ * @return string
+ */
+ abstract public function description();
+
+ /**
+ * Success message.
+ *
+ * @since 1.0.0
+ * @access public
+ * @return string
+ */
+ abstract public function success_message();
+
+ /**
+ * Add vulnerability
+ *
+ * @since 1.0.0
+ *
+ * @param string $title The vulnerability title.
+ * @param string $severity The severity, can be critical, high, medium, low and info.
+ * @param string $id Unique string to represent the vulnerability in the report object.
+ *
+ * @access public
+ * @return void
+ */
+ final public function add_vulnerability( $title, $severity, $id, $remediation_url ) {
+ $vulnerability = array(
+ 'title' => $title,
+ 'severity' => $severity,
+ 'id' => $id,
+ 'remediation_url' => $remediation_url,
+ );
+
+ $this->vulnerabilities[] = $vulnerability;
+ }
+
+ /**
+ * Get vulnerabilities.
+ *
+ * @since 1.0.0
+ * @access public
+ * @return array|null
+ */
+ final public function get_vulnerabilities() {
+ if ( ! empty( $this->vulnerabilities ) ) {
+ return $this->vulnerabilities;
+ }
+
+ $report = $this->parent->get_report();
+
+ if ( isset( $report['security-checks'] ) ) {
+ if ( isset( $report['security-checks'][ $this->id ] ) ) {
+ return $report['security-checks'][ $this->id ]['vulnerabilities'];
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Get item non-ignored vulnerabilities count
+ *
+ * @since 1.0.0
+ *
+ * @access public
+ * @return int
+ */
+ public function get_vulnerabilities_count() {
+ $vulnerabilities = $this->get_vulnerabilities();
+ $ignored = $this->parent->get_ignored_vulnerabilities();
+
+ if ( empty( $vulnerabilities ) ) {
+ return 0;
+ }
+
+ foreach ( $vulnerabilities as $key => &$item ) {
+ if ( in_array( $item['id'], $ignored, true ) ) {
+ unset( $vulnerabilities[ $key ] );
+ }
+ }
+
+ return count( $vulnerabilities );
+ }
+
+ /**
+ * Dismiss action
+ *
+ * @since 1.0.0
+ * @access public
+ * @return bool
+ */
+ public function dismiss() {
+ $report = $this->parent->get_report();
+ $updated = $report;
+
+ if ( isset( $updated['security-checks'] ) ) {
+ if ( isset( $updated['security-checks'][ $this->id ] ) ) {
+ $updated['security-checks'][ $this->id ]['vulnerabilities'] = array();
+ }
+ }
+
+ if ( $report === $updated ) {
+ return true;
+ } else {
+ return update_option( $this->parent->OPT_REPORT, $updated );
+ }
+ }
+
+ /**
+ * Run action.
+ *
+ * @since 1.0.0
+ * @access public
+ * @return bool
+ */
+ public function run() {
+ $report = $this->parent->get_report();
+ $updated = $report;
+
+ if ( empty( $updated ) ) {
+ $updated = array(
+ 'security-checks' => array(),
+ 'plugins' => array(),
+ 'themes' => array(),
+ 'wordpress' => array(),
+ );
+ }
+
+ if ( isset( $updated['security-checks'][ $this->id ] ) ) {
+ $updated['security-checks'][ $this->id ] = array();
+ }
+
+ $this->perform();
+
+ if ( is_array( $this->vulnerabilities ) ) {
+ $updated['security-checks'][ $this->id ]['vulnerabilities'] = $this->vulnerabilities;
+
+ $this->parent->maybe_fire_issue_found_action('security-check', $this->id, $updated['security-checks'][ $this->id ]);
+ } else {
+ $updated['security-checks'][ $this->id ]['vulnerabilities'] = array();
+ }
+
+ if ( $report === $updated ) {
+ return true;
+ } else {
+ return update_option( $this->parent->OPT_REPORT, $updated );
+ }
+ }
+
+ /**
+ * Perform the check and save the results.
+ *
+ * @since 1.0.0
+ * @access public
+ * @return void
+ */
+ abstract public function perform();
+}
diff --git a/wp-content/plugins/wpscan/app/Checks/System.php b/wp-content/plugins/wpscan/app/Checks/System.php
new file mode 100644
index 0000000..340fdc5
--- /dev/null
+++ b/wp-content/plugins/wpscan/app/Checks/System.php
@@ -0,0 +1,415 @@
+parent = $parent;
+ $this->current_running = get_option( $this->OPT_EVENTS_INLINE );
+
+ register_shutdown_function( array( $this, 'catch_errors' ) );
+
+ add_action( 'admin_notices', array( $this, 'display_errors' ) );
+
+ add_action( 'plugins_loaded', array( $this, 'load_checks' ) );
+ add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue' ) );
+ add_action( 'wp_ajax_wpscan_check_action', array( $this, 'handle_actions' ) );
+
+ add_action( $this->WPSCAN_SECURITY_SCHEDULE, array( $this, 'security_check_now' ), 99 );
+ }
+
+ /**
+ * Register Admin Scripts
+ *
+ * @param string $hook parent.
+ *
+ * @access public
+ * @return void
+ * @since 1.0.0
+ */
+ public function admin_enqueue( $hook ) {
+ if ( $hook === $this->parent->page_hook ) {
+ wp_enqueue_script(
+ 'wpscan-security-checks',
+ plugins_url( 'assets/js/security-checks.js', WPSCAN_PLUGIN_FILE ),
+ array( 'jquery-ui-tooltip' )
+ );
+ }
+ }
+
+ /**
+ * Load checks files.
+ *
+ * @return void
+ * @since 1.0.0
+ * @access public
+ */
+ public function load_checks() {
+ $dir = $this->parent->plugin_dir . 'security-checks';
+ $folders = array_diff( scandir( $dir ), array( '..', '.' ) );
+
+ foreach ( $folders as $folder ) {
+ $file = "$dir/$folder/check.php";
+
+ if ( '.' === $folder[0] ) {
+ continue;
+ }
+
+ require_once $file;
+
+ $data = get_file_data( $file, array( 'classname' => 'classname' ) );
+
+ $data['instance'] = new $data['classname']( $folder, "$dir/$folder", $this->parent );
+
+ $this->checks[ $folder ] = $data;
+ }
+ }
+
+ /**
+ * Register a shutdown hook to catch errors
+ *
+ * @return void
+ * @since 1.0.0
+ * @access public
+ */
+ public function catch_errors() {
+ $error = error_get_last();
+
+ if ( $error && $error['type'] ) {
+
+ if ( basename( $error['file'] ) == 'check.php' ) {
+ $errors = get_option( $this->OPT_FATAL_ERRORS, array() );
+
+ array_push( $errors, $error );
+
+ update_option( $this->OPT_FATAL_ERRORS, array_unique( $errors ) );
+
+ $report = $this->parent->get_report();
+
+ $report['cache'] = strtotime( current_time( 'mysql' ) );
+
+ update_option( $this->parent->OPT_REPORT, $report );
+
+ $this->parent->classes['account']->update_account_status();
+
+ delete_transient( $this->parent->WPSCAN_TRANSIENT_CRON );
+ }
+ }
+ }
+
+ /**
+ * Display fatal errors
+ *
+ * @return void
+ * @since 1.0.0
+ * @access public
+ */
+ public function display_errors() {
+ $screen = get_current_screen();
+ $errors = get_option( $this->OPT_FATAL_ERRORS, array() );
+
+ if ( strstr( $screen->id, $this->parent->classes['report']->page ) ) {
+ foreach ( $errors as $err ) {
+ $msg = explode( 'Stack', $err['message'] )[0];
+ $msg = trim( $msg );
+
+ echo "
', $list );
+ }
+ }
+
+ /**
+ * Return vulnerabilities in the report.
+ *
+ * @param object $check - The check instance.
+ *
+ * @access public
+ * @return string
+ * @since 1.14.4
+ *
+ */
+ public function get_check_vulnerabilities( $instance ) {
+ $vulnerabilities = $instance->get_vulnerabilities();
+ $count = $instance->get_vulnerabilities_count();
+ $ignored = $this->parent->get_ignored_vulnerabilities();
+
+ $not_checked_text = __( 'Not checked yet. Click the Run button to run a scan', 'wpscan' );
+
+ if ( ! isset( $vulnerabilities ) ) {
+ return esc_html( $not_checked_text );
+ } elseif ( empty( $vulnerabilities ) || 0 === $count ) {
+ return esc_html( $instance->success_message() );
+ } else {
+ $list = array();
+
+ foreach ( $vulnerabilities as $item ) {
+ if ( in_array( $item['id'], $ignored, true ) ) {
+ continue;
+ }
+
+ $html = "
', $list );
+ }
+ }
+
+ /**
+ * Display actions buttons
+ *
+ * @param object $instance - The check instance.
+ *
+ * @access public
+ * @return string
+ * @since 1.0.0
+ *
+ */
+ public function list_actions( $instance ) {
+ foreach ( $instance->actions as $action ) {
+ $confirm = isset( $action['confirm'] ) ? $action['confirm'] : false;
+ $button_text = ( $this->current_running && array_key_exists( $instance->id, $this->current_running ) && 'dismiss' !== $action['id'] ) ? esc_html__( 'Running', 'wpscan' ) : esc_html( $action['title'] );
+ $button_disabled = ( $this->current_running && array_key_exists( $instance->id, $this->current_running ) && 'dismiss' !== $action['id'] ) ? ' disabled' : '';
+
+ echo sprintf(
+ "",
+ esc_attr( $instance->id ),
+ esc_attr( $confirm ),
+ esc_attr( $action['id'] ),
+ $button_disabled,
+ $button_text
+ );
+ }
+ }
+
+ /**
+ * Get actions buttons
+ *
+ * @param object $instance - The check instance.
+ *
+ * @access public
+ * @return string
+ * @since 1.14.4
+ *
+ */
+ public function get_list_actions( $instance ) {
+ foreach ( $instance->actions as $action ) {
+ $confirm = isset( $action['confirm'] ) ? $action['confirm'] : false;
+ $button_text = ( $this->current_running && array_key_exists( $instance->id, $this->current_running ) && 'dismiss' !== $action['id'] ) ? esc_html__( 'Running', 'wpscan' ) : esc_html( $action['title'] );
+ $button_disabled = ( $this->current_running && array_key_exists( $instance->id, $this->current_running ) && 'dismiss' !== $action['id'] ) ? ' disabled' : '';
+
+ return sprintf(
+ "",
+ esc_attr( $instance->id ),
+ esc_attr( $confirm ),
+ esc_attr( $action['id'] ),
+ $button_disabled,
+ $button_text
+ );
+ }
+ }
+
+ /**
+ * Load checks files.
+ *
+ * @return void
+ * @since 1.0.0
+ * @access public
+ */
+ public function handle_actions() {
+ check_ajax_referer( 'wpscan' );
+
+ if ( ! current_user_can( $this->parent->WPSCAN_ROLE ) ) {
+ wp_die();
+ }
+
+ $check = isset( $_POST['check'] ) ? $_POST['check'] : false;
+ $action = isset( $_POST['action_id'] ) ? $_POST['action_id'] : false;
+
+ if ( $action && $check ) {
+ $res = 0;
+ if ( 'run' === $action ) {
+ $event_type[ $check ] = $action;
+ $this->add_event_inline( $event_type );
+
+ if ( false === as_next_scheduled_action( $this->WPSCAN_SECURITY_SCHEDULE ) ) {
+ as_schedule_single_action( strtotime( 'now' ), $this->WPSCAN_SECURITY_SCHEDULE );
+ }
+ $res = 1;
+ } else {
+ $action = array_filter(
+ $this->checks[ $check ]['instance']->actions,
+ function ( $i ) use ( $action ) {
+ return $i['id'] === $action;
+ }
+ );
+
+ $action = current( $action );
+
+ if ( method_exists( $this->checks[ $check ]['instance'], $action['method'] ) ) {
+ $res = call_user_func( array( $this->checks[ $check ]['instance'], $action['method'] ) );
+ }
+ }
+
+ if ( $res ) {
+ wp_send_json_success( $check );
+ } else {
+ wp_send_json_error();
+ }
+ }
+
+ wp_send_json_error();
+ }
+
+ /**
+ * Run the Security checks
+ *
+ * @since 1.15
+ * @acces public
+ */
+ public function security_check_now() {
+ if ( ! empty( $this->current_running ) ) {
+ foreach ( $this->current_running as $key => $to_check ) {
+ $check = $key;
+ $action = $to_check;
+ $action = array_filter(
+ $this->checks[ $check ]['instance']->actions,
+ function ( $i ) use ( $action ) {
+ return $i['id'] === $action;
+ }
+ );
+
+ $action = current( $action );
+
+ if ( method_exists( $this->checks[ $check ]['instance'], $action['method'] ) ) {
+ call_user_func( array( $this->checks[ $check ]['instance'], $action['method'] ) );
+ }
+ $this->remove_event_from_list( $check );
+ as_schedule_single_action( strtotime( 'now' ) + 10, $this->WPSCAN_SECURITY_SCHEDULE );
+
+ break;
+ }
+ } else {
+ delete_option( $this->OPT_EVENTS_INLINE );
+ }
+ }
+
+ /**
+ * Register event to wait inline
+ *
+ * @param $event_type
+ *
+ * @since 1.15
+ * @acces public
+ */
+ public function add_event_inline( $event_type ) {
+ if ( $this->current_running ) {
+ update_option( $this->OPT_EVENTS_INLINE, $this->current_running + $event_type );
+ } else {
+ update_option( $this->OPT_EVENTS_INLINE, $event_type );
+ }
+ }
+
+ /**
+ * Remove event from the waiting line
+ *
+ * @param $event
+ *
+ * @since 1.15
+ * @acces public
+ */
+ public function remove_event_from_list( $event ) {
+ if ( $event ) {
+ unset( $this->current_running[ $event ] );
+ update_option( $this->OPT_EVENTS_INLINE, $this->current_running );
+ }
+ }
+}
diff --git a/wp-content/plugins/wpscan/app/Dashboard.php b/wp-content/plugins/wpscan/app/Dashboard.php
new file mode 100644
index 0000000..6b53b9a
--- /dev/null
+++ b/wp-content/plugins/wpscan/app/Dashboard.php
@@ -0,0 +1,84 @@
+parent = $parent;
+
+ add_action( 'wp_dashboard_setup', array( $this, 'add_dashboard_widgets' ) );
+ }
+
+ /**
+ * Add the widget
+ *
+ * @since 1.0.0
+ * @access public
+ * @return void
+ */
+ public function add_dashboard_widgets() {
+ if ( ! current_user_can( $this->parent->WPSCAN_ROLE ) ) {
+ return;
+ }
+
+ wp_add_dashboard_widget(
+ $this->parent->WPSCAN_DASHBOARD,
+ __( 'WPScan Status', 'wpscan' ),
+ array( $this, 'dashboard_widget_content' )
+ );
+ }
+
+ /**
+ * Render the widget
+ *
+ * @since 1.0.0
+ * @access public
+ * @return string
+ */
+ public function dashboard_widget_content() {
+ $report = $this->parent->get_report();
+
+ if ( ! $this->parent->classes['settings']->api_token_set() ) {
+ echo esc_html( '
";
+ }
+
+ echo '
' . __( 'No scan run yet!', 'wpscan' ) . '
'; + } elseif ( empty( $errors ) && 0 === $total ) { + echo '' . __( 'No known vulnerabilities found', 'wpscan' ) . '
'; + } elseif ( ! get_option( $this->parent->OPT_API_TOKEN ) ) { + echo '' . __( 'You need to add a WPScan API Token to the settings page', 'wpscan' ) . '
'; + } else { + echo '' . __( 'Some vulnerabilities were found', 'wpscan' ) . '
'; + } + ?> + ++ +
++ + + + + +
+ + parent->WPSCAN_SCHEDULE ) ) { ?> ++ + parent->WPSCAN_SCHEDULE ) ); ?> +
+ + + + ++ parent->OPT_API_TOKEN ) ) { + _e( 'Click the Run All button to run a full vulnerability scan against your WordPress website.', 'wpscan' ); + } else { + _e( 'Add your API token to the settings page to be able to run a full scan.', 'wpscan' ); + } + ?> +
+ + parent->OPT_API_TOKEN ) ) : ?> ++ parent->WPSCAN_RUN_ALL ) ) { + $spinner_display = ' style="visibility: visible;"'; + $button_disabled = 'disabled'; + } + ?> + > + +
+ + + parent->WPSCAN_ROLE ) ) { + wp_redirect( home_url() ); + wp_die(); + } + + if ( false === as_next_scheduled_action( $this->parent->WPSCAN_RUN_ALL ) ) { + as_schedule_single_action( strtotime( 'now' ), $this->parent->WPSCAN_RUN_ALL ); + } + + wp_die(); + } + + /** + * Ajax scurity check now + * + * @return void + * @since 1.0.0 + * @access public + */ + public function ajax_security_check_now() { + check_ajax_referer( 'wpscan' ); + + if ( ! current_user_can( $this->parent->WPSCAN_ROLE ) ) { + wp_redirect( home_url() ); + wp_die(); + } + + $items_inline = get_option( $this->parent->WPSCAN_RUN_SECURITY ); + + $plugins = array(); + foreach ( $this->parent->classes['checks/system']->checks as $id => $data ) { + $plugins[ $id ] = array( + 'status' => $this->parent->classes['report']->get_status( 'security-checks', $id ), + 'vulnerabilities' => $this->parent->classes['checks/system']->get_check_vulnerabilities( $data['instance'] ), + 'security-check-actions' => $this->parent->classes['checks/system']->get_list_actions( $data['instance'] ), + ); + } + + $response = array( + 'inline' => $items_inline, + 'plugins' => $plugins, + ); + + wp_die( wp_json_encode( $response ) ); + } + + /** + * Ajax to check when the cron task has finished + * + * @return void + * @since 1.0.0 + * @access public + */ + public function ajax_doing_cron() { + check_ajax_referer( 'wpscan' ); + + if ( ! current_user_can( $this->parent->WPSCAN_ROLE ) ) { + wp_redirect( home_url() ); + wp_die(); + } + + // echo get_transient( $this->parent->WPSCAN_TRANSIENT_CRON ) ? 'YES' : 'NO'; + echo false !== as_next_scheduled_action( $this->parent->WPSCAN_RUN_ALL ) ? 'YES' : 'NO'; + + wp_die(); + } +} diff --git a/wp-content/plugins/wpscan/app/ignoreVulnerabilities.php b/wp-content/plugins/wpscan/app/ignoreVulnerabilities.php new file mode 100644 index 0000000..9f12c7a --- /dev/null +++ b/wp-content/plugins/wpscan/app/ignoreVulnerabilities.php @@ -0,0 +1,189 @@ +parent = $parent; + $this->page = 'wpscan_ignore_vulnerabilities'; + + add_action( 'admin_init', array( $this, 'admin_init' ) ); + add_action( 'admin_init', array( $this, 'add_meta_box_ignore_vulnerabilities' ) ); + } + + /** + * Ignore vulnerabilities option + * + * @since 1.0.0 + * @access public + * @return void + */ + public function admin_init() { + $total = $this->parent->get_total(); + + register_setting( $this->page, $this->parent->OPT_IGNORED, array( $this, 'sanitize_ignored' ) ); + + $section = $this->page . '_section'; + + add_settings_section( + $section, + null, + array( $this, 'introduction' ), + $this->page + ); + + if ( $total > 0 ) { + add_settings_field( + $this->parent->OPT_IGNORED, + null, + array( $this, 'field_ignored' ), + $this->page, + $section + ); + } + } + + /** + * Add meta box + * + * @since 1.0.0 + * @access public + * @return void + */ + public function add_meta_box_ignore_vulnerabilities() { + add_meta_box( + 'wpscan-metabox-ignore-vulnerabilities', + __( 'Ignore Vulnerabilities', 'wpscan' ), + array( $this, 'do_meta_box_ignore_vulnerabilities' ), + 'wpscan', + 'side', + 'low' + ); + } + + /** + * Render meta box + * + * @since 1.0.0 + * @access public + * @return string + */ + public function do_meta_box_ignore_vulnerabilities() { + echo ''; + } + + /** + * Introduction + * + * @since 1.0.0 + * @access public + * @return void + */ + public function introduction() { } + + /** + * Ignored field + * + * @since 1.0.0 + * @access public + * @return void + */ + public function field_ignored() { + $this->list_vulnerabilities_to_ignore( 'wordpress', get_bloginfo( 'version' ) ); + + foreach ( get_plugins() as $name => $details ) { + $this->list_vulnerabilities_to_ignore( 'plugins', $this->parent->get_plugin_slug( $name, $details ) ); + } + + foreach ( wp_get_themes() as $name => $details ) { + $this->list_vulnerabilities_to_ignore( 'themes', $this->parent->get_theme_slug( $name, $details ) ); + } + + foreach ( $this->parent->classes['checks/system']->checks as $id => $data ) { + $this->list_vulnerabilities_to_ignore( 'security-checks', $id ); + } + } + + /** + * Sanitize ignored + * + * @since 1.0.0 + * @param string $value value. + * @access public + * @return string + */ + public function sanitize_ignored( $value ) { + if ( empty( $value ) ) { + return array(); + } + + return $value; + } + + /** + * List of vulnerabilities + * + * @since 1.0.0 + * + * @param string $type - Type of report: wordpress, plugins, themes. + * @param string $name - key name of the element. + * + * @access public + * @return string + */ + public function list_vulnerabilities_to_ignore( $type, $name ) { + $report = $this->parent->get_report(); + + if ( isset( $report[ $type ] ) && isset( $report[ $type ][ $name ] ) ) { + $report = $report[ $type ][ $name ]; + } + + if ( ! isset( $report['vulnerabilities'] ) ) { + return null; + } + + $ignored = $this->parent->get_ignored_vulnerabilities(); + + foreach ( $report['vulnerabilities'] as $item ) { + $id = 'security-checks' === $type ? $item['id'] : $item->id; + $title = 'security-checks' === $type ? $item['title'] : $this->parent->get_sanitized_vulnerability_title( $item ); + + echo sprintf( + '>8,g=u%256,y.push(g),y.push(p);return y}(o,i.length-u),i,u,p)}function base64Slice(i,o,u){return 0===o&&u===i.length?p.fromByteArray(i):p.fromByteArray(i.slice(o,u))}function utf8Slice(i,o,u){u=Math.min(i.length,u);for(var p=[],g=o;g239?4:k>223?3:k>191?2:1;if(g+E<=u)switch(E){case 1:k<128&&(P=k);break;case 2:128==(192&(y=i[g+1]))&&(x=(31&k)<<6|63&y)>127&&(P=x);break;case 3:y=i[g+1],w=i[g+2],128==(192&y)&&128==(192&w)&&(x=(15&k)<<12|(63&y)<<6|63&w)>2047&&(x<55296||x>57343)&&(P=x);break;case 4:y=i[g+1],w=i[g+2],_=i[g+3],128==(192&y)&&128==(192&w)&&128==(192&_)&&(x=(15&k)<<18|(63&y)<<12|(63&w)<<6|63&_)>65535&&x<1114112&&(P=x)}null===P?(P=65533,E=1):P>65535&&(P-=65536,p.push(P>>>10&1023|55296),P=56320|1023&P),p.push(P),g+=E}return function decodeCodePointsArray(i){var o=i.length;if(o<=4096)return String.fromCharCode.apply(String,i);var u="",p=0;for(;p =o.length||g>=i.length);++g)o[g+u]=i[g];return g}}).call(this,u(27))},function(i,o){i.exports=function(i){return"object"==typeof i?null!==i:"function"==typeof i}},function(i,o,u){var p=u(11);i.exports=function(i){if(!p(i))throw TypeError(String(i)+" is not an object");return i}},function(i,o,u){var p=u(3);i.exports=!p((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(i,o,u){var p,g,y,w,_,x,k,P,E,O,I,B,D,R,N,U,W,G,j;i.exports=(p=u(2),u(50),void(p.lib.Cipher||(g=p,y=g.lib,w=y.Base,_=y.WordArray,x=y.BufferedBlockAlgorithm,k=g.enc,k.Utf8,P=k.Base64,E=g.algo.EvpKDF,O=y.Cipher=x.extend({cfg:w.extend(),createEncryptor:function(i,o){return this.create(this._ENC_XFORM_MODE,i,o)},createDecryptor:function(i,o){return this.create(this._DEC_XFORM_MODE,i,o)},init:function(i,o,u){this.cfg=this.cfg.extend(u),this._xformMode=i,this._key=o,this.reset()},reset:function(){x.reset.call(this),this._doReset()},process:function(i){return this._append(i),this._process()},finalize:function(i){return i&&this._append(i),this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){function selectCipherStrategy(i){return"string"==typeof i?j:W}return function(i){return{encrypt:function(o,u,p){return selectCipherStrategy(u).encrypt(i,o,u,p)},decrypt:function(o,u,p){return selectCipherStrategy(u).decrypt(i,o,u,p)}}}}()}),y.StreamCipher=O.extend({_doFinalize:function(){return this._process(!0)},blockSize:1}),I=g.mode={},B=y.BlockCipherMode=w.extend({createEncryptor:function(i,o){return this.Encryptor.create(i,o)},createDecryptor:function(i,o){return this.Decryptor.create(i,o)},init:function(i,o){this._cipher=i,this._iv=o}}),D=I.CBC=function(){var i=B.extend();function xorBlock(i,o,u){var p=this._iv;if(p){var g=p;this._iv=void 0}else g=this._prevBlock;for(var y=0;y>>2];i.sigBytes-=o}},y.BlockCipher=O.extend({cfg:O.cfg.extend({mode:D,padding:R}),reset:function(){O.reset.call(this);var i=this.cfg,o=i.iv,u=i.mode;if(this._xformMode==this._ENC_XFORM_MODE)var p=u.createEncryptor;else p=u.createDecryptor,this._minBufferSize=1;this._mode&&this._mode.__creator==p?this._mode.init(this,o&&o.words):(this._mode=p.call(u,this,o&&o.words),this._mode.__creator=p)},_doProcessBlock:function(i,o){this._mode.processBlock(i,o)},_doFinalize:function(){var i=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){i.pad(this._data,this.blockSize);var o=this._process(!0)}else o=this._process(!0),i.unpad(o);return o},blockSize:4}),N=y.CipherParams=w.extend({init:function(i){this.mixIn(i)},toString:function(i){return(i||this.formatter).stringify(this)}}),U=(g.format={}).OpenSSL={stringify:function(i){var o=i.ciphertext,u=i.salt;if(u)var p=_.create([1398893684,1701076831]).concat(u).concat(o);else p=o;return p.toString(P)},parse:function(i){var o=P.parse(i),u=o.words;if(1398893684==u[0]&&1701076831==u[1]){var p=_.create(u.slice(2,4));u.splice(0,4),o.sigBytes-=16}return N.create({ciphertext:o,salt:p})}},W=y.SerializableCipher=w.extend({cfg:w.extend({format:U}),encrypt:function(i,o,u,p){p=this.cfg.extend(p);var g=i.createEncryptor(u,p),y=g.finalize(o),w=g.cfg;return N.create({ciphertext:y,key:u,iv:w.iv,algorithm:i,mode:w.mode,padding:w.padding,blockSize:i.blockSize,formatter:p.format})},decrypt:function(i,o,u,p){return p=this.cfg.extend(p),o=this._parse(o,p.format),i.createDecryptor(u,p).finalize(o.ciphertext)},_parse:function(i,o){return"string"==typeof i?o.parse(i,this):i}}),G=(g.kdf={}).OpenSSL={execute:function(i,o,u,p){p||(p=_.random(8));var g=E.create({keySize:o+u}).compute(i,p),y=_.create(g.words.slice(o),4*u);return g.sigBytes=4*o,N.create({key:g,iv:y,salt:p})}},j=y.PasswordBasedCipher=W.extend({cfg:W.cfg.extend({kdf:G}),encrypt:function(i,o,u,p){var g=(p=this.cfg.extend(p)).kdf.execute(u,i.keySize,i.ivSize);p.iv=g.iv;var y=W.encrypt.call(this,i,o,g.key,p);return y.mixIn(g),y},decrypt:function(i,o,u,p){p=this.cfg.extend(p),o=this._parse(o,p.format);var g=p.kdf.execute(u,i.keySize,i.ivSize,o.salt);return p.iv=g.iv,W.decrypt.call(this,i,o,g.key,p)}}))))},function(i,o){var u={}.hasOwnProperty;i.exports=function(i,o){return u.call(i,o)}},function(i,o,u){var p=u(13),g=u(203),y=u(12),w=u(55),_=Object.defineProperty;o.f=p?_:function defineProperty(i,o,u){if(y(i),o=w(o,!0),y(u),g)try{return _(i,o,u)}catch(i){}if("get"in u||"set"in u)throw TypeError("Accessors not supported");return"value"in u&&(i[o]=u.value),i}},function(i,o){var u=i.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=u)},function(i,o,u){var p=u(13),g=u(16),y=u(41);i.exports=p?function(i,o,u){return g.f(i,o,y(1,u))}:function(i,o,u){return i[o]=u,i}},function(i,o,u){var p=u(35);i.exports=function(i){return Object(p(i))}},function(i,o,u){var p=u(185)("wks"),g=u(133),y=u(17).Symbol,w="function"==typeof y;(i.exports=function(i){return p[i]||(p[i]=w&&y[i]||(w?y:g)("Symbol."+i))}).store=p},function(i,o,u){var p=u(90),g=u(35);i.exports=function(i){return p(g(i))}},function(i,o,u){var p=u(93),g=u(90),y=u(19),w=u(8),_=u(212),x=[].push,createMethod=function(i){var o=1==i,u=2==i,k=3==i,P=4==i,E=6==i,O=7==i,I=5==i||E;return function(B,D,R,N){for(var U,W,G=y(B),j=g(G),X=p(D,R,3),K=w(j.length),Y=0,J=N||_,$=o?J(B,K):u||O?J(B,0):void 0;K>Y;Y++)if((I||Y in j)&&(W=X(U=j[Y],Y,G),i))if(o)$[Y]=W;else if(W)switch(i){case 3:return!0;case 5:return U;case 6:return Y;case 2:x.call($,U)}else switch(i){case 4:return!1;case 7:x.call($,U)}return E?-1:k||P?P:$}};i.exports={forEach:createMethod(0),map:createMethod(1),filter:createMethod(2),some:createMethod(3),every:createMethod(4),find:createMethod(5),findIndex:createMethod(6),filterOut:createMethod(7)}},function(i,o){i.exports=function(i){return"object"==typeof i?null!==i:"function"==typeof i}},function(i,o,u){i.exports=!u(53)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(i,o,u){var p=u(4),g=u(18),y=u(15),w=u(141),_=u(142),x=u(43),k=x.get,P=x.enforce,E=String(String).split("String");(i.exports=function(i,o,u,_){var x,k=!!_&&!!_.unsafe,O=!!_&&!!_.enumerable,I=!!_&&!!_.noTargetGet;"function"==typeof u&&("string"!=typeof o||y(u,"name")||g(u,"name",o),(x=P(u)).source||(x.source=E.join("string"==typeof o?o:""))),i!==p?(k?!I&&i[o]&&(O=!0):delete i[o],O?i[o]=u:g(i,o,u)):O?i[o]=u:w(o,u)})(Function.prototype,"toString",(function toString(){return"function"==typeof this&&k(this).source||_(this)}))},function(i,o,u){var p=u(29),g=u(254),y=u(179),w=Object.defineProperty;o.f=u(24)?Object.defineProperty:function defineProperty(i,o,u){if(p(i),o=y(o,!0),p(u),g)try{return w(i,o,u)}catch(i){}if("get"in u||"set"in u)throw TypeError("Accessors not supported!");return"value"in u&&(i[o]=u.value),i}},function(i,o){var u;u=function(){return this}();try{u=u||new Function("return this")()}catch(i){"object"==typeof window&&(u=window)}i.exports=u},function(i,o,u){"use strict";var p=u(21),g=u(153),y=u(94),w=u(43),_=u(217),x=w.set,k=w.getterFor("Array Iterator");i.exports=_(Array,"Array",(function(i,o){x(this,{type:"Array Iterator",target:p(i),index:0,kind:o})}),(function(){var i=k(this),o=i.target,u=i.kind,p=i.index++;return!o||p>=o.length?(i.target=void 0,{value:void 0,done:!0}):"keys"==u?{value:p,done:!1}:"values"==u?{value:o[p],done:!1}:{value:[p,o[p]],done:!1}}),"values"),y.Arguments=y.Array,g("keys"),g("values"),g("entries")},function(i,o,u){var p=u(23);i.exports=function(i){if(!p(i))throw TypeError(i+" is not an object!");return i}},function(i,o,u){var p=u(112),g=u(4),aFunction=function(i){return"function"==typeof i?i:void 0};i.exports=function(i,o){return arguments.length<2?aFunction(p[i])||aFunction(g[i]):p[i]&&p[i][o]||g[i]&&g[i][o]}},function(i,o){i.exports=function(i){if("function"!=typeof i)throw TypeError(String(i)+" is not a function");return i}},function(i,o,u){var p=u(150),g=u(25),y=u(323);p||g(Object.prototype,"toString",y,{unsafe:!0})},function(i,o,u){var p=u(98);i.exports=function(i,o,u){if(p(i),void 0===o)return i;switch(u){case 1:return function(u){return i.call(o,u)};case 2:return function(u,p){return i.call(o,u,p)};case 3:return function(u,p,g){return i.call(o,u,p,g)}}return function(){return i.apply(o,arguments)}}},function(i,o,u){var p=u(13),g=u(107),y=u(41),w=u(21),_=u(55),x=u(15),k=u(203),P=Object.getOwnPropertyDescriptor;o.f=p?P:function getOwnPropertyDescriptor(i,o){if(i=w(i),o=_(o,!0),k)try{return P(i,o)}catch(i){}if(x(i,o))return y(!g.f.call(i,o),i[o])}},function(i,o){i.exports=function(i){if(null==i)throw TypeError("Can't call method on "+i);return i}},function(i,o){var u=Math.ceil,p=Math.floor;i.exports=function(i){return isNaN(i=+i)?0:(i>0?p:u)(i)}},function(i,o,u){var p=u(12),g=u(31),y=u(6)("species");i.exports=function(i,o){var u,w=p(i).constructor;return void 0===w||null==(u=p(w)[y])?o:g(u)}},function(i,o,u){"use strict";(function(o){var p,g=u(10),y=g.Buffer,w={};for(p in g)g.hasOwnProperty(p)&&"SlowBuffer"!==p&&"Buffer"!==p&&(w[p]=g[p]);var _=w.Buffer={};for(p in y)y.hasOwnProperty(p)&&"allocUnsafe"!==p&&"allocUnsafeSlow"!==p&&(_[p]=y[p]);if(w.Buffer.prototype=y.prototype,_.from&&_.from!==Uint8Array.from||(_.from=function(i,o,u){if("number"==typeof i)throw new TypeError('The "value" argument must not be of type number. Received type '+typeof i);if(i&&void 0===i.length)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof i);return y(i,o,u)}),_.alloc||(_.alloc=function(i,o,u){if("number"!=typeof i)throw new TypeError('The "size" argument must be of type number. Received type '+typeof i);if(i<0||i>=2*(1<<30))throw new RangeError('The value "'+i+'" is invalid for option "size"');var p=y(i);return o&&0!==o.length?"string"==typeof u?p.fill(o,u):p.fill(o):p.fill(0),p}),!w.kStringMaxLength)try{w.kStringMaxLength=o.binding("buffer").kStringMaxLength}catch(i){}w.constants||(w.constants={MAX_LENGTH:w.kMaxLength},w.kStringMaxLength&&(w.constants.MAX_STRING_LENGTH=w.kStringMaxLength)),i.exports=w}).call(this,u(48))},function(i,o,u){(function(){var i,p;i=u(87).Number,o.resolveLength=function(o,u,p){var g;if("number"==typeof o?g=o:"function"==typeof o?g=o.call(p,p):p&&"string"==typeof o?g=p[o]:u&&o instanceof i&&(g=o.decode(u)),isNaN(g))throw new Error("Not a fixed size");return g},p=function p(i){var o,u;for(o in null==i&&(i={}),this.enumerable=!0,this.configurable=!0,i)u=i[o],this[o]=u},o.PropertyDescriptor=p}).call(this)},function(i,o,u){var p=u(26),g=u(97);i.exports=u(24)?function(i,o,u){return p.f(i,o,g(1,u))}:function(i,o,u){return i[o]=u,i}},function(i,o){i.exports=function(i,o){return{enumerable:!(1&i),configurable:!(2&i),writable:!(4&i),value:o}}},function(i,o){var u={}.toString;i.exports=function(i){return u.call(i).slice(8,-1)}},function(i,o,u){var p,g,y,w=u(310),_=u(4),x=u(11),k=u(18),P=u(15),E=u(143),O=u(108),I=u(111),B=_.WeakMap;if(w){var D=E.state||(E.state=new B),R=D.get,N=D.has,U=D.set;p=function(i,o){return o.facade=i,U.call(D,i,o),o},g=function(i){return R.call(D,i)||{}},y=function(i){return N.call(D,i)}}else{var W=O("state");I[W]=!0,p=function(i,o){return o.facade=i,k(i,W,o),o},g=function(i){return P(i,W)?i[W]:{}},y=function(i){return P(i,W)}}i.exports={set:p,get:g,has:y,enforce:function(i){return y(i)?g(i):p(i,{})},getterFor:function(i){return function(o){var u;if(!x(o)||(u=g(o)).type!==i)throw TypeError("Incompatible receiver, "+i+" required");return u}}}},function(i,o,u){var p=u(36),g=Math.max,y=Math.min;i.exports=function(i,o){var u=p(i);return u<0?g(u+o,0):y(u,o)}},function(i,o,u){var p,g=u(12),y=u(311),w=u(144),_=u(111),x=u(209),k=u(140),P=u(108),E=P("IE_PROTO"),EmptyConstructor=function(){},scriptTag=function(i){return"
+ {% endif %}
+