Commit 50c8d5b8 authored by Pol Dellaiera's avatar Pol Dellaiera
Browse files

Update code style.

parent f9b3a6f9
Loading
Loading
Loading
Loading
+10 −4
Changes for includes/views_geojson.default_openlayers_sources.inc: 10 added lines, 4 removed lines.
Original line number Diff line number Diff line
<?php

/**
 * @file
 * Openlayers integration.
 */

use function in_array;

/**
 * Implements hook_default_openlayers_sources().
 */
@@ -13,10 +16,11 @@ function views_geojson_default_openlayers_sources() {
  foreach (views_get_all_views() as $view) {
    foreach ($view->display as $display => $data) {
      $view->set_display($display);

      if (in_array($view->display_handler->get_option('style_plugin'), array(
        'views_geojson_feed',
        'views_geojson',
      ))) {
      ), TRUE)) {
        $ol_source = new stdClass();
        $ol_source->api_version = 1;
        $ol_source->machine_name = 'views_geojson_' . $view->name . '_' . $display;
@@ -30,7 +34,7 @@ function views_geojson_default_openlayers_sources() {
        // Determine if we should use a BBox strategy.
        if ($arguments = $view->display_handler->get_option('arguments')) {
          foreach ($arguments as $id => $argument) {
            if (strpos($id, 'bbox') !== FALSE && $argument['default_argument_type'] == 'querystring') {
            if (mb_strpos($id, 'bbox') !== FALSE && $argument['default_argument_type'] === 'querystring') {
              if (isset($argument['default_argument_options'])) {
                $ol_source->options['useBBOX'] = TRUE;
              }
@@ -52,15 +56,17 @@ function views_geojson_default_openlayers_sources_alter(&$sources) {
  foreach (views_get_all_views() as $view) {
    foreach ($view->display as $display => $data) {
      $view->set_display($display);

      if (in_array($view->display_handler->get_option('style_plugin'), array(
        'views_geojson_feed',
        'views_geojson',
      ))) {
      ), TRUE)) {
        $machine_name = 'views_geojson_' . $view->name . '_' . $display;
        // Check if the configuration for this source was already defined or if
        // it has been modified. If so don't add it, to keep the source
        // exportable.
        $custom_version = ctools_export_crud_load('openlayers_sources', $machine_name);

        if (!isset($sources[$machine_name]) && empty($custom_version)) {
          $ol_source = new stdClass();
          $ol_source->api_version = 1;
@@ -76,7 +82,7 @@ function views_geojson_default_openlayers_sources_alter(&$sources) {
          // Determine if we should use a BBox strategy.
          if ($arguments = $view->display_handler->get_option('arguments')) {
            foreach ($arguments as $id => $argument) {
              if (strpos($id, 'bbox') !== FALSE && $argument['default_argument_type'] == 'querystring') {
              if (mb_strpos($id, 'bbox') !== FALSE && $argument['default_argument_type'] === 'querystring') {
                if (isset($argument['default_argument_options'])) {
                  $ol_source->options['useBBOX'] = TRUE;
                }
+69 −55
Changes for views/views_geojson_bbox_argument.inc: 69 added lines, 55 removed lines.
Original line number Diff line number Diff line
@@ -2,28 +2,16 @@

/**
 * @file
 *
 */

use function count;
use function is_string;

/**
 * Custom filter to return only points within a provided bounding box.
 */
class views_geojson_bbox_argument extends views_handler_argument {

  /**
   * Filter options definition.
   */
  function option_definition() {
    $options = parent::option_definition();
    $options['arg_id'] = array('default' => 'bbox');
    $options['empty_result'] = array(
      'default' => FALSE,
      'bool' => TRUE,
    );
    $options['bbox_wrap'] = array('default' => TRUE, 'bool' => TRUE);
    return $options;
  }

  /**
   * Override the default argument form.
   */
@@ -38,7 +26,21 @@ class views_geojson_bbox_argument extends views_handler_argument {
      '#description' => t('When the argument is not found you may choose to show no result.'),
      '#default_value' => $this->options['empty_result'],
    );
  }

  /**
   * Filter options definition.
   */
  public function option_definition() {
    $options = parent::option_definition();
    $options['arg_id'] = array('default' => 'bbox');
    $options['empty_result'] = array(
      'default' => FALSE,
      'bool' => TRUE,
    );
    $options['bbox_wrap'] = array('default' => TRUE, 'bool' => TRUE);

    return $options;
  }

  /**
@@ -61,10 +63,10 @@ class views_geojson_bbox_argument extends views_handler_argument {
  public function query($group_by = FALSE) {
    // Apply no bbox filtering if the argument is absent or if this is a
    // search_api based view (which doesn't support sql specific query changes).
    if ((empty($this->argument)) || ($this->view->base_field == 'search_api_id')) {
    if ((empty($this->argument)) || ($this->view->base_field === 'search_api_id')) {
      // @TODO: Implement Search API filtering if Solr BBOX is not an option.
      // @see: https://www.drupal.org/project/search_api_location_solr_bboxfield
      return NULL;
      return;
    }

    $this->ensure_my_table();
@@ -77,7 +79,8 @@ class views_geojson_bbox_argument extends views_handler_argument {
      $this->argument = FALSE;
      $this->view->built = TRUE;
      $this->view->executed = TRUE;
      return NULL;

      return;
    }

    if (isset($this->view->display_handler->display->display_options['style_options'])) {
@@ -89,13 +92,13 @@ class views_geojson_bbox_argument extends views_handler_argument {

    // We handle latlon and geofield data_source types.
    // No support yet for WKT.
    if ($data_source['value'] == 'latlon') {
    if ($data_source['value'] === 'latlon') {
      $lat_field_obj = $this->view->field[$data_source['latitude']];
      $lon_field_obj = $this->view->field[$data_source['longitude']];
      $lat_field_table = $lat_field_obj->table;
      $lon_field_table = $lon_field_obj->table;
    }
    elseif ($data_source['value'] == 'geofield') {
    elseif ($data_source['value'] === 'geofield') {
      // Geofield includes both Lat and Lon fields.
      // We pretend they're distinct fields so we can use same code as for
      // latlon, since we're just going to get lat & lon from geofield anyway.
@@ -107,19 +110,21 @@ class views_geojson_bbox_argument extends views_handler_argument {
      $this->argument = FALSE;
      $this->view->built = TRUE;
      $this->view->executed = TRUE;
      return NULL;

      return;
    }

    // If the Latitude / Longitude fields are really geofields,
    // we need to dig a bit deeper to find field names.
    if (isset($lat_field_obj->field_info) && $lat_field_obj->field_info['type'] == 'geofield') {
    if (isset($lat_field_obj->field_info) && $lat_field_obj->field_info['type'] === 'geofield') {
      // @TODO: Maybe the field name can really just be "${lat_field_obj}_lat"?
      $lat_field_name = $lat_field_obj->field_info['storage']['details']['sql']['FIELD_LOAD_CURRENT'][$lat_field_table]['lat'];
    }
    else {
      $lat_field_name = $lat_field_obj->real_field;
    }
    if (isset($lon_field_obj->field_info) && $lon_field_obj->field_info['type'] == 'geofield') {

    if (isset($lon_field_obj->field_info) && $lon_field_obj->field_info['type'] === 'geofield') {
      $lon_field_name = $lon_field_obj->field_info['storage']['details']['sql']['FIELD_LOAD_CURRENT'][$lon_field_table]['lon'];
    }
    else {
@@ -128,7 +133,8 @@ class views_geojson_bbox_argument extends views_handler_argument {

    // Add JOIN(s) to query.
    $this->query->ensure_table($lat_field_table);
    if ($lon_field_table != $lat_field_table) {

    if ($lon_field_table !== $lat_field_table) {
      $this->query->ensure_table($lon_field_table);
    }

@@ -143,28 +149,36 @@ class views_geojson_bbox_argument extends views_handler_argument {
      // wraps around. We need to turn these into BETWEENs with OR.
      if ($right - $left < 360) {
        $group = $this->query->set_where_group('AND');

        if ($left > -180 && $left <= 180) {
          $this->query->add_where($group, "$lon_field_table.$lon_field_name", $left, '>=');
          $this->query->add_where($group, "{$lon_field_table}.{$lon_field_name}", $left, '>=');
        }
        else {
          $this->query->set_where_group('OR', $group);
          $left = ($left + 180) % 360;
          if ($left <= 0) $left += 360; // -12 % 7 will result in -5 and not 2 as expected

          if ($left <= 0) {
            $left += 360;
          } // -12 % 7 will result in -5 and not 2 as expected
          $left -= 180;
          $this->query->add_where($group, "$lon_field_table.$lon_field_name", array(
          $this->query->add_where($group, "{$lon_field_table}.{$lon_field_name}", array(
            $left,
            180,
          ), 'BETWEEN');
        }

        if ($right > -180 && $right <= 180) {
          $this->query->add_where($group, "$lon_field_table.$lon_field_name", $right, '<=');
          $this->query->add_where($group, "{$lon_field_table}.{$lon_field_name}", $right, '<=');
        }
        else {
          $this->query->set_where_group('OR', $group);
          $right = ($right + 180) % 360;
          if ($right <= 0) $right += 360; // -12 % 7 will result in -5 and not 2 as expected

          if ($right <= 0) {
            $right += 360;
          } // -12 % 7 will result in -5 and not 2 as expected
          $right -= 180;
          $this->query->add_where($group, "$lon_field_table.$lon_field_name", array(
          $this->query->add_where($group, "{$lon_field_table}.{$lon_field_name}", array(
            -180,
            $right,
          ), 'BETWEEN');
@@ -173,15 +187,31 @@ class views_geojson_bbox_argument extends views_handler_argument {
    }
    else {
      $group = $this->query->set_where_group('AND');
      $this->query->add_where($group, "$lon_field_table.$lon_field_name", $left, '>=');
      $this->query->add_where($group, "$lon_field_table.$lon_field_name", $right, '<=');
      $this->query->add_where($group, "{$lon_field_table}.{$lon_field_name}", $left, '>=');
      $this->query->add_where($group, "{$lon_field_table}.{$lon_field_name}", $right, '<=');
    }

    $group = $this->query->set_where_group('AND');
    $this->query->add_where($group, "$lat_field_table.$lat_field_name", $bottom, '>=');
    $this->query->add_where($group, "$lat_field_table.$lat_field_name", $top, '<=');
    $this->query->add_where($group, "{$lat_field_table}.{$lat_field_name}", $bottom, '>=');
    $this->query->add_where($group, "{$lat_field_table}.{$lat_field_name}", $top, '<=');
  }

  /**
   * Check if the BBOX coordinates are valid coordinates.
   *
   * Currently only checks if coordinates are numeric.
   *
   * @TODO: if supported by projection this could include degree checking.
   */
  private function _check_bbox_coords($bbox_coords) {
    foreach ($bbox_coords as $coord) {
      if (!is_numeric($coord)) {
        return FALSE;
      }
    }

    return TRUE;
  }

  /**
   * Split BBOX string into {left, bottom, right, top}.
@@ -199,37 +229,21 @@ class views_geojson_bbox_argument extends views_handler_argument {
    }

    $bbox_coords = explode(',', $bbox_coords_str);
    if (count($bbox_coords) == 4) {

    if (count($bbox_coords) === 4) {
      if (!$this->_check_bbox_coords($bbox_coords)) {
        return array();
      }
      $bbox = array(

      return array(
        'left' => $bbox_coords[0],
        'bottom' => $bbox_coords[1],
        'right' => $bbox_coords[2],
        'top' => $bbox_coords[3],
      );
      return $bbox;
    }
    else {
      return array();
    }
    }

  /**
   * Check if the BBOX coordinates are valid coordinates.
   *
   * Currently only checks if coordinates are numeric.
   *
   * @TODO: if supported by projection this could include degree checking.
   */
  private function _check_bbox_coords($bbox_coords) {
    foreach ($bbox_coords as $coord) {
      if (!is_numeric($coord)) {
        return FALSE;
      }
    }
    return TRUE;
    return array();
  }

}
+34 −25
Changes for views/views_plugin_argument_default_bboxquery.inc: 34 added lines, 25 removed lines.
Original line number Diff line number Diff line
<?php

/**
 * @file
 * Contains the BBOX query string argument default plugin.
@@ -10,7 +11,35 @@
 * @TODO: Write an options_validate() method.
 */
class views_plugin_argument_default_bboxquery extends views_plugin_argument_default {
  function option_definition() {

  /**
   * Return the default argument.
   */
  public function get_argument() {
    $query = drupal_get_query_parameters();

    if (isset($query[$this->options['arg_id']])) {
      // Just set the argument here. We'll validate and sanitize the input in
      // views_geojson_bbox_argument::query().
      return $query[$this->options['arg_id']];
    }

    if ($this->argument->options['empty_result']) {
      // Return no values if arg not present and empty result option is set.
      $this->view->built = TRUE;
      $this->view->executed = TRUE;

      return FALSE;
    }

    // Return all values if arg not present.
    return TRUE;
  }

  /**
   *
   */
  public function option_definition() {
    $options = parent::option_definition();
    $options['argument'] = array('default' => '');
    $options['arg_id'] = array('default' => 'bbox');
@@ -18,7 +47,10 @@ class views_plugin_argument_default_bboxquery extends views_plugin_argument_defa
    return $options;
  }

  function options_form(&$form, &$form_state) {
  /**
   *
   */
  public function options_form(&$form, &$form_state) {
    parent::options_form($form, $form_state);

    $form['info'] = array(
@@ -36,27 +68,4 @@ class views_plugin_argument_default_bboxquery extends views_plugin_argument_defa
    );
  }

  /**
   * Return the default argument.
   */
  function get_argument() {
    $query = drupal_get_query_parameters();
    if (isset($query[$this->options['arg_id']])) {
      // Just set the argument here. We'll validate and sanitize the input in
      // views_geojson_bbox_argument::query().
      return $query[$this->options['arg_id']];
    }
    else {
      if ($this->argument->options['empty_result']) {
        // Return no values if arg not present and empty result option is set.
        $this->view->built = TRUE;
        $this->view->executed = TRUE;
        return FALSE;
      }
      else {
        // Return all values if arg not present.
        return TRUE;
      }
    }
  }
}
+80 −57
Changes for views/views_plugin_style_geojson.inc: 80 added lines, 57 removed lines.
Original line number Diff line number Diff line
@@ -7,35 +7,43 @@
 * @see views_plugin_style_geojson.inc
 */

/**
 * Implementation of views_plugin_style
 */
class views_plugin_style_geojson extends views_plugin_style {
use function count;
use function func_get_args;
use function get_class;


/**
   * Store the entity type.
   * @var string
 * Implementation of views_plugin_style.
 */
  protected $entity_type;
class views_plugin_style_geojson extends views_plugin_style {

  /**
   * Store the entity info array.
   *
   * @var array
   */
  protected $entity_info;

  /**
   * Store the entity type.
   *
   * @var string
   */
  protected $entity_type;

  /**
   * If this view is displaying an entity, save the entity type and info.
   */
  function init(&$view, &$display, $options = NULL) {
  public function init(&$view, &$display, $options = NULL) {
    parent::init($view, $display, $options);

    // Pretty-print the JSON.
    module_load_include('inc', 'views_geojson', 'views_geojson.helpers');

    // Search api indexes store the entity metadata in the views data array.
    if (strpos($view->base_table, 'search_api_index_') === 0) {
    if (mb_strpos($view->base_table, 'search_api_index_') === 0) {
      $views_data = views_fetch_data();

      if (isset($views_data[$view->base_table]['table']['entity type'])) {
        $this->entity_type = $views_data[$view->base_table]['table']['entity type'];
        $this->entity_info = entity_get_info($this->entity_type);
@@ -43,9 +51,10 @@ class views_plugin_style_geojson extends views_plugin_style {
    }
    else {
      foreach (entity_get_info() as $key => $info) {
        if ($view->base_table == $info['base table']) {
        if ($view->base_table === $info['base table']) {
          $this->entity_type = $key;
          $this->entity_info = $info;

          break;
        }
      }
@@ -53,9 +62,39 @@ class views_plugin_style_geojson extends views_plugin_style {
  }

  /**
   * Set default options
   * Checks if a field handler class is handled by the entity module.
   *
   * @param object $field_handler_instance
   *   The field handler instance to check.
   *
   * @return bool
   *   TRUE if the field is handled by the entity module views integration.
   */
  public function is_entity_views_handler($field_handler_instance) {
    if (!module_exists('entity')) {
      return FALSE;
    }

    $static_cache = &drupal_static(__METHOD__, array());
    $handler_class = get_class($field_handler_instance);

    if (!isset($static_cache[$handler_class])) {
      $static_cache[$handler_class] = FALSE;

      foreach (entity_views_get_field_handlers() as $field_handler) {
        if ($field_handler_instance instanceof $field_handler) {
          return $static_cache[$handler_class] = TRUE;
        }
      }
    }

    return $static_cache[$handler_class];
  }

  /**
   * Set default options.
   */
  function option_definition() {
  public function option_definition() {
    $options = parent::option_definition();
    $options['data_source'] = array(
      'contains' => array(
@@ -85,13 +124,14 @@ class views_plugin_style_geojson extends views_plugin_style {
      'default' => FALSE,
      'translatable' => FALSE,
    );

    return $options;
  }

  /**
   * Provide a form for setting options.
   */
  function options_form(&$form, &$form_state) {
  public function options_form(&$form, &$form_state) {
    parent::options_form($form, $form_state);

    $fields = array();
@@ -106,6 +146,7 @@ class views_plugin_style_geojson extends views_plugin_style {
        '#prefix' => '<div class="error form-item description">',
        '#suffix' => '</div>',
      );

      return;
    }

@@ -114,6 +155,7 @@ class views_plugin_style_geojson extends views_plugin_style {
      $fields[$field_id] = $handler->definition['title'];

      $field_info = NULL;

      if (!empty($handler->field_info)) {
        $field_info = $handler->field_info;
      }
@@ -121,7 +163,8 @@ class views_plugin_style_geojson extends views_plugin_style {
        // Strip the basic field name from the entity views handler field and
        // fetch the field info for it.
        $property = EntityFieldHandlerHelper::get_selector_field_name($handler->real_field);
        if ($field_name = EntityFieldHandlerHelper::get_selector_field_name(substr($handler->real_field, 0, strpos($handler->real_field, ':' . $property)), ':')) {

        if ($field_name = EntityFieldHandlerHelper::get_selector_field_name(mb_substr($handler->real_field, 0, mb_strpos($handler->real_field, ':' . $property)), ':')) {
          $field_info = field_info_field($field_name);
        }
      }
@@ -176,8 +219,9 @@ class views_plugin_style_geojson extends views_plugin_style {

      // Get Geofield-type fields.
      $geofield_fields = array();

      foreach ($fields as $field_id => $field) {
        if ($fields_info[$field_id]['type'] == 'geofield') {
        if ($fields_info[$field_id]['type'] === 'geofield') {
          $geofield_fields[$field_id] = $field;
        }
      }
@@ -243,7 +287,7 @@ class views_plugin_style_geojson extends views_plugin_style {
      '#type' => 'radios',
      '#title' => t('Content-Type'),
      '#options' => array(
        'default' => t("Default: application/json"),
        'default' => t('Default: application/json'),
        'text/json' => t('text/json'),
      ),
      '#default_value' => $this->options['content_type'],
@@ -265,18 +309,19 @@ class views_plugin_style_geojson extends views_plugin_style {
    if (!empty($this->options['data_source']['name_field'])) {
      $variable_fields['name'] = '${name}';
    }

    if (!empty($this->options['data_source']['description_field'])) {
      $variable_fields['description'] = '${description}';
    }
    // Go through fields.
    foreach ($this->view->display_handler->get_handlers('field') as $field => $handler) {
      if (($field != $this->options['data_source']['name_field']) && ($field != $this->options['data_source']['description_field'])) {
      if (($field !== $this->options['data_source']['name_field']) && ($field !== $this->options['data_source']['description_field'])) {
        $variable_fields[$field] = '${' . $field . '}';
      }
    }
    $variables_list = array(
      'items' => $variable_fields,
      'attributes' => array('class' => array('description'))
      'attributes' => array('class' => array('description')),
    );

    $markup = '<p class="description">' . t('Fields added to this view will be attached to their respective feature, (point, line, polygon,) as attributes. These attributes can then be used to add variable styling to your themes. This is accomplished by using the %syntax syntax in the values for a style.  The following is a list of formatted variables that are currently available; these can be placed right in the style interface.', array('%syntax' => '${field_name}')) . '</p>';
@@ -292,7 +337,7 @@ class views_plugin_style_geojson extends views_plugin_style {
  /**
   * Implementation of view_style_plugin::render().
   */
  function render() {
  public function render() {
    $args = func_get_args();
    $results = array_shift($args);

@@ -304,6 +349,7 @@ class views_plugin_style_geojson extends views_plugin_style {
    // Render each row.
    foreach ($results as $i => $row) {
      $this->view->row_index = $i;

      if ($feature = _views_geojson_render_fields($this->view, $row, $i)) {
        $features['features'][] = $feature;
      }
@@ -314,7 +360,7 @@ class views_plugin_style_geojson extends views_plugin_style {
    $json = drupal_json_encode($features);

    if (!empty($this->options['jsonp_prefix'])) {
      $json = $this->options['jsonp_prefix'] . "($json)";
      $json = $this->options['jsonp_prefix'] . "({$json})";
    }

    // Replace form field placeholders.
@@ -323,25 +369,27 @@ class views_plugin_style_geojson extends views_plugin_style {
    if (!empty($this->view->preview)) {
      // Pretty-print the JSON. This only works for 'page' displays.
      $json = _views_geojson_encode_formatted($features);

      if (!empty($this->options['jsonp_prefix'])) {
        $json = $this->options['jsonp_prefix'] . "($json)";
        $json = $this->options['jsonp_prefix'] . "({$json})";
      }
      if ($this->display->display_plugin == 'page') {
        $json = "<pre>$json</pre>";

      if ($this->display->display_plugin === 'page') {
        $json = "<pre>{$json}</pre>";
      }

      // Replace form field placeholders.
      $json = $this->form_fields_replace($json, FALSE);
    }
    elseif ($this->display->display_plugin == 'feed') {
      $content_type = ($this->options['content_type'] == 'default') ? 'application/json' : $this->options['content_type'];
      drupal_add_http_header("Content-Type", "$content_type; charset=utf-8");
    elseif ($this->display->display_plugin === 'feed') {
      $content_type = ($this->options['content_type'] === 'default') ? 'application/json' : $this->options['content_type'];
      drupal_add_http_header('Content-Type', "{$content_type}; charset=utf-8");
    }
    else {
      if ($this->display->display_plugin == 'page' && !$this->options['using_views_api_mode']) {
      if ($this->display->display_plugin === 'page' && !$this->options['using_views_api_mode']) {
        // Change the content type header since we're sending a JSON response.
        $content_type = ($this->options['content_type'] == 'default') ? 'application/json' : $this->options['content_type'];
        drupal_add_http_header("Content-Type", "$content_type; charset=utf-8");
        $content_type = ($this->options['content_type'] === 'default') ? 'application/json' : $this->options['content_type'];
        drupal_add_http_header('Content-Type', "{$content_type}; charset=utf-8");

        // Page display prints and exits; this is BAD (prevents caching) but
        // supports legacy configurations.
@@ -359,7 +407,7 @@ class views_plugin_style_geojson extends views_plugin_style {
   *
   * @param string $output
   *   The text output of the current display.
   * @param boolean $encode
   * @param bool $encode
   *   Whether or not to json encode placeholders.
   *
   * @return string
@@ -374,8 +422,10 @@ class views_plugin_style_geojson extends views_plugin_style {
      // The minimum form elements needed to do the replacement are 'output',
      // '#substitutions' and the form element name of each field.
      $elements = array('output', '#substitutions');

      foreach ($this->view->field as $field_name => $field) {
        $form_element_name = $field_name;

        if (method_exists($field, 'form_element_name')) {
          $form_element_name = $field->form_element_name();
        }
@@ -412,31 +462,4 @@ class views_plugin_style_geojson extends views_plugin_style {
    return $output;
  }

  /**
   * Checks if a field handler class is handled by the entity module.
   *
   * @param object $field_handler_instance
   *   The field handler instance to check.
   *
   * @return bool
   *   TRUE if the field is handled by the entity module views integration.
   */
  public function is_entity_views_handler($field_handler_instance) {
    if (!module_exists('entity')) {
      return FALSE;
    }

    $static_cache = &drupal_static(__METHOD__, array());
    $handler_class = get_class($field_handler_instance);

    if (!isset($static_cache[$handler_class])) {
      $static_cache[$handler_class] = FALSE;
      foreach (entity_views_get_field_handlers() as $field_handler) {
        if ($field_handler_instance instanceof $field_handler) {
          return $static_cache[$handler_class] = TRUE;
        }
      }
    }
    return $static_cache[$handler_class];
  }
}
+34 −20

File changed.

Preview size limit exceeded, changes collapsed.

Loading