<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jun 13, 2016 at 11:19 AM, Dylan Baker <span dir="ltr"><<a href="mailto:dylan@pnwbakers.com" target="_blank">dylan@pnwbakers.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">This replaces the current bash generator with a python based generator<br>
using mako. It's quite fast and works with both python 2.7 and python<br>
3.5, and should work with 3.3+ and maybe even 3.2.<br>
<br>
It produces an almost identical file except for a minor layout changes,<br>
and the addition of a "generated file, do not edit" warning.<br>
<br>
</span>Cc: "12.0" <<a href="mailto:mesa-stable@lists.freedesktop.org">mesa-stable@lists.freedesktop.org</a>><br>
Signed-off-by: Dylan Baker <<a href="mailto:dylanx.c.baker@intel.com">dylanx.c.baker@intel.com</a>><br>
Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br>
Reviewed-by: Emil Velikov <<a href="mailto:emil.velikov@collabora.com">emil.velikov@collabora.com</a>><br>
---<br>
<br>
I don't have commit access to Mesa, so it would be great if someone<br>
could commit this for me.<br>
<span class=""><br>
v2: - Provide the python file with the csvfile and output location as<br>
      arguments (Jason, Emil)<br>
    - Put the mako template in the python file (Jason)<br>
    - Merge Emil's Android.mk changes<br>
</span>v3: - use builddir for the output of isl_format_layout.c (Jason, Emil)<br>
<span class=""><br>
 src/intel/isl/Android.mk                 |   6 +-<br>
 src/intel/isl/Makefile.am                |  13 +-<br>
 src/intel/isl/gen_format_layout.py       | 207 +++++++++++++++++++++++++++++++<br>
 src/intel/isl/isl_format_layout_gen.bash | 129 -------------------<br>
 4 files changed, 218 insertions(+), 137 deletions(-)<br>
</span><span class=""> create mode 100644 src/intel/isl/gen_format_layout.py<br>
 delete mode 100755 src/intel/isl/isl_format_layout_gen.bash<br>
<br>
</span><span class="">diff --git a/src/intel/isl/Android.mk b/src/intel/isl/Android.mk<br>
index 3134981..ec3c656 100644<br>
--- a/src/intel/isl/Android.mk<br>
+++ b/src/intel/isl/Android.mk<br>
@@ -139,14 +139,14 @@ LOCAL_GENERATED_SOURCES += $(addprefix $(intermediates)/, $(ISL_GENERATED_FILES)<br>
 define bash-gen<br>
        @mkdir -p $(dir $@)<br>
        @echo "Gen Bash: $(PRIVATE_MODULE) <= $(notdir $(@))"<br>
-       $(hide) $(PRIVATE_SCRIPT) < $(PRIVATE_CSV) > $@<br>
+       $(hide) $(PRIVATE_SCRIPT) --csv $(PRIVATE_CSV) --out $(ISL_GENERATED_FILES)<br></span></blockquote><div><br></div><div>I just pushed this with one quick tweak to use $@ here instead of $(ISL_GENERATED_FILES) and one other place below.<br><br></div><div>--Jason<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
 endef<br>
<br>
 isl_format_layout_deps := \<br>
-       $(LOCAL_PATH)/isl_format_layout_gen.bash \<br>
+       $(LOCAL_PATH)/gen_format_layout.py \<br>
        $(LOCAL_PATH)/isl_format_layout.csv<br>
<br>
-$(intermediates)/isl_format_layout.c: PRIVATE_SCRIPT := bash -c $(LOCAL_PATH)/isl_format_layout_gen.bash<br>
+$(intermediates)/isl_format_layout.c: PRIVATE_SCRIPT := $(MESA_PYTHON2) $(LOCAL_PATH)/gen_format_layout.py<br>
 $(intermediates)/isl_format_layout.c: PRIVATE_CSV := $(LOCAL_PATH)/isl_format_layout.csv<br>
 $(intermediates)/isl_format_layout.c: $(isl_format_layout_deps)<br>
        $(call bash-gen)<br>
</span>diff --git a/src/intel/isl/Makefile.am b/src/intel/isl/Makefile.am<br>
index 74f863a..8128888 100644<br>
--- a/src/intel/isl/Makefile.am<br>
+++ b/src/intel/isl/Makefile.am<br>
@@ -1,4 +1,4 @@<br>
<span class="">-# Copyright 2015 Intel Corporation<br>
</span><span class="">+# Copyright 2015-2016 Intel Corporation<br>
 #<br>
</span><span class=""> # Permission is hereby granted, free of charge, to any person obtaining a<br>
</span> # copy of this software and associated documentation files (the "Software"),<br>
@@ -66,10 +66,13 @@ libisl_gen9_la_CFLAGS = $(libisl_la_CFLAGS) -DGEN_VERSIONx10=90<br>
<span class=""><br>
 BUILT_SOURCES = $(ISL_GENERATED_FILES)<br>
<br>
-isl_format_layout.c: isl_format_layout_gen.bash \<br>
</span><span class="">+PYTHON_GEN = $(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS)<br>
+<br>
+isl_format_layout.c: gen_format_layout.py \<br>
</span><span class="">                      isl_format_layout.csv<br>
-       $(AM_V_GEN)$(srcdir)/isl_format_layout_gen.bash \<br>
-           <$(srcdir)/isl_format_layout.csv >$@<br>
</span>+       $(PYTHON_GEN) $(srcdir)/gen_format_layout.py \<br>
+           --csv $(srcdir)/isl_format_layout.csv \<br>
+           --out $(builddir)/isl_format_layout.c<br>
<span class=""><br>
 # ----------------------------------------------------------------------------<br>
 #  Tests<br>
@@ -87,6 +90,6 @@ tests_isl_surf_get_image_offset_test_LDADD = \<br>
 # ----------------------------------------------------------------------------<br>
<br>
 EXTRA_DIST = \<br>
-       isl_format_layout_gen.bash \<br>
+       gen_format_layout.py \<br>
        isl_format_layout.csv \<br>
        README<br>
</span><span class="">diff --git a/src/intel/isl/gen_format_layout.py b/src/intel/isl/gen_format_layout.py<br>
new file mode 100644<br>
</span>index 0000000..d7f3900<br>
--- /dev/null<br>
+++ b/src/intel/isl/gen_format_layout.py<br>
@@ -0,0 +1,207 @@<br>
<span class="">+# encoding=utf-8<br>
+# Copyright © 2016 Intel Corporation<br>
+<br>
+# Permission is hereby granted, free of charge, to any person obtaining a copy<br>
+# of this software and associated documentation files (the "Software"), to deal<br>
+# in the Software without restriction, including without limitation the rights<br>
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br>
+# copies of the Software, and to permit persons to whom the Software is<br>
+# furnished to do so, subject to the following conditions:<br>
+<br>
+# The above copyright notice and this permission notice shall be included in<br>
+# all copies or substantial portions of the Software.<br>
+<br>
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br>
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br>
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<br>
+# SOFTWARE.<br>
+<br>
+"""Generates isl_format_layout.c."""<br>
+<br>
</span><span class="">+from __future__ import absolute_import, division, print_function<br>
+import argparse<br>
+import csv<br>
+import re<br>
+import textwrap<br>
</span><span class="">+<br>
+from mako import template<br>
+<br>
+# Load the template, ensure that __future__.division is imported, and set the<br>
+# bytes encoding to be utf-8. This last bit is important to getting simple<br>
+# consistent behavior for python 3 when we get there.<br>
</span><span class="">+TEMPLATE = template.Template(<br>
+    text=textwrap.dedent("""\<br>
</span>+        /* This file is autogenerated by gen_format_layout.py. DO NOT EDIT! */<br>
<span class="">+<br>
+        /*<br>
+         * Copyright 2015 Intel Corporation<br>
+         *<br>
+         *  Permission is hereby granted, free of charge, to any person obtaining a<br>
+         *  copy of this software and associated documentation files (the "Software"),<br>
+         *  to deal in the Software without restriction, including without limitation<br>
+         *  the rights to use, copy, modify, merge, publish, distribute, sublicense,<br>
+         *  and/or sell copies of the Software, and to permit persons to whom the<br>
+         *  Software is furnished to do so, subject to the following conditions:<br>
+         *<br>
+         *  The above copyright notice and this permission notice (including the next<br>
+         *  paragraph) shall be included in all copies or substantial portions of the<br>
+         *  Software.<br>
+         *<br>
+         *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
+         *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
+         *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL<br>
+         *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
+         *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING<br>
+         *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS<br>
+         *  IN THE SOFTWARE.<br>
+         */<br>
+<br>
</span><span class="">+        #include "isl.h"<br>
+<br>
+        const struct isl_format_layout<br>
+        isl_format_layouts[] = {<br>
</span>+        % for format in formats:<br>
<span class="">+          [ISL_FORMAT_${<a href="http://format.name" rel="noreferrer" target="_blank">format.name</a>}] = {<br>
+            .format = ISL_FORMAT_${<a href="http://format.name" rel="noreferrer" target="_blank">format.name</a>},<br>
+            .name = "ISL_FORMAT_${<a href="http://format.name" rel="noreferrer" target="_blank">format.name</a>}",<br>
+            .bs = ${<a href="http://format.bs" rel="noreferrer" target="_blank">format.bs</a>},<br>
+            .bw = ${<a href="http://format.bw" rel="noreferrer" target="_blank">format.bw</a>},<br>
+            .bh = ${<a href="http://format.bh" rel="noreferrer" target="_blank">format.bh</a>},<br>
+            .bd = ${<a href="http://format.bd" rel="noreferrer" target="_blank">format.bd</a>},<br>
+            .channels = {<br>
+            % for mask in ['r', 'g', 'b', 'a', 'l', 'i', 'p']:<br>
+              <% channel = getattr(format, mask, None) %>\\<br>
+              % if channel.type is not None:<br>
+                .${mask} = { ISL_${channel.type}, ${channel.size} },<br>
+              % else:<br>
+                .${mask} = {},<br>
+              % endif<br>
+            % endfor<br>
+            },<br>
+            .colorspace = ISL_COLORSPACE_${format.colorspace},<br>
+            .txc = ISL_TXC_${format.txc},<br>
+          },<br>
+<br>
</span><span class="">+        % endfor<br>
+        };<br>
+    """),<br>
</span><div><div class="h5">+    future_imports=['division'],<br>
+    output_encoding='utf-8')<br>
+<br>
+<br>
+class Channel(object):<br>
+    """Class representing a Channel.<br>
+<br>
+    Converts the csv encoded data into the format that the template (and thus<br>
+    the consuming C code) expects.<br>
+<br>
+    """<br>
+    # If the csv file grew very large this class could be put behind a factory<br>
+    # to increase efficiency. Right now though it's fast enough that It didn't<br>
+    # seem worthwhile to add all of the boilerplate<br>
+    _types = {<br>
+        'x': 'void',<br>
+        'r': 'raw',<br>
+        'un': 'unorm',<br>
+        'sn': 'snorm',<br>
+        'uf': 'ufloat',<br>
+        'sf': 'sfloat',<br>
+        'ux': 'ufixed',<br>
+        'sx': 'sfixed',<br>
+        'ui': 'uint',<br>
+        'si': 'sint',<br>
+        'us': 'uscaled',<br>
+        'ss': 'sscaled',<br>
+    }<br>
+    _splitter = re.compile(r'\s*(?P<type>[a-z]+)(?P<size>[0-9]+)')<br>
+<br>
+    def __init__(self, line):<br>
+        # If the line is just whitespace then just set everything to None to<br>
+        # save on the regex cost and let the template skip on None.<br>
+        if line.isspace():<br>
+            self.size = None<br>
+            self.type = None<br>
+        else:<br>
+            grouped = self._splitter.match(line)<br>
+            self.type = self._types[grouped.group('type')].upper()<br>
+            self.size = grouped.group('size')<br>
+<br>
+<br>
+class Format(object):<br>
+    """Class taht contains all values needed by the template."""<br>
+    def __init__(self, line):<br>
+        # pylint: disable=invalid-name<br>
+        <a href="http://self.name" rel="noreferrer" target="_blank">self.name</a> = line[0].strip()<br>
+<br>
+        # Future division makes this work in python 2.<br>
+        <a href="http://self.bs" rel="noreferrer" target="_blank">self.bs</a> = int(line[1]) // 8<br>
+        <a href="http://self.bw" rel="noreferrer" target="_blank">self.bw</a> = line[2].strip()<br>
+        <a href="http://self.bh" rel="noreferrer" target="_blank">self.bh</a> = line[3].strip()<br>
+        <a href="http://self.bd" rel="noreferrer" target="_blank">self.bd</a> = line[4].strip()<br>
+        self.r = Channel(line[5])<br>
+        self.g = Channel(line[6])<br>
+        self.b = Channel(line[7])<br>
+        self.a = Channel(line[8])<br>
+        self.l = Channel(line[9])<br>
+        self.i = Channel(line[10])<br>
+        self.p = Channel(line[11])<br>
+<br>
+        # alpha doesn't have a colorspace of it's own.<br>
+        self.colorspace = line[12].strip().upper()<br>
+        if self.colorspace in ['', 'ALPHA']:<br>
+            self.colorspace = 'NONE'<br>
+<br>
+        # This sets it to the line value, or if it's an empty string 'NONE'<br>
+        self.txc = line[13].strip().upper() or 'NONE'<br>
+<br>
+<br>
</div></div>+def reader(csvfile):<br>
<span class="">+    """Wrapper around csv.reader that skips comments and blanks."""<br>
+    # csv.reader actually reads the file one line at a time (it was designed to<br>
+    # open excel generated sheets), so hold the file until all of the lines are<br>
+    # read.<br>
</span>+    with open(csvfile, 'r') as f:<br>
<span class="">+        for line in csv.reader(f):<br>
+            if line and not line[0].startswith('#'):<br>
+                yield line<br>
+<br>
+<br>
+def main():<br>
+    """Main function."""<br>
</span><span class="">+    parser = argparse.ArgumentParser()<br>
+    parser.add_argument('--csv', action='store', help='The CSV file to parse.')<br>
+    parser.add_argument(<br>
+        '--out',<br>
+        action='store',<br>
+        help='The location to put the generated C file.')<br>
+    args = parser.parse_args()<br>
+<br>
</span><span class="">+    # This generator opens and writes the file itself, and it does so in bytes<br>
+    # mode. This solves both python 2 vs 3 problems and solves the locale<br>
+    # problem: Unicode can be rendered even if the shell calling this script<br>
+    # doesn't.<br>
</span>+    with open(args.out, 'wb') as f:<br>
<span class="im HOEnZb">+        try:<br>
+            # This basically does lazy evaluation and initialization, which<br>
+            # saves on memory and startup overhead.<br>
</span><span class="im HOEnZb">+            f.write(TEMPLATE.render(<br>
+                formats=(Format(l) for l in reader(args.csv))))<br>
</span><div class="HOEnZb"><div class="h5">+        except Exception:<br>
+            # In the even there's an error this imports some helpers from mako<br>
+            # to print a useful stack trace and prints it, then exits with<br>
+            # status 1, if python is run with debug; otherwise it just raises<br>
+            # the exception<br>
+            if __debug__:<br>
+                import sys<br>
+                from mako import exceptions<br>
+                print(exceptions.text_error_template().render(),<br>
+                      file=sys.stderr)<br>
+                sys.exit(1)<br>
+            raise<br>
+<br>
+<br>
+if __name__ == '__main__':<br>
+    main()<br>
diff --git a/src/intel/isl/isl_format_layout_gen.bash b/src/intel/isl/isl_format_layout_gen.bash<br>
deleted file mode 100755<br>
index e20da55..0000000<br>
--- a/src/intel/isl/isl_format_layout_gen.bash<br>
+++ /dev/null<br>
@@ -1,129 +0,0 @@<br>
-#!/usr/bin/env bash<br>
-#<br>
-# Copyright 2015 Intel Corporation<br>
-#<br>
-#  Permission is hereby granted, free of charge, to any person obtaining a<br>
-#  copy of this software and associated documentation files (the "Software"),<br>
-#  to deal in the Software without restriction, including without limitation<br>
-#  the rights to use, copy, modify, merge, publish, distribute, sublicense,<br>
-#  and/or sell copies of the Software, and to permit persons to whom the<br>
-#  Software is furnished to do so, subject to the following conditions:<br>
-#<br>
-#  The above copyright notice and this permission notice (including the next<br>
-#  paragraph) shall be included in all copies or substantial portions of the<br>
-#  Software.<br>
-#<br>
-#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
-#  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
-#  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL<br>
-#  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
-#  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING<br>
-#  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS<br>
-#  IN THE SOFTWARE.<br>
-<br>
-set -eu<br>
-set -o pipefail<br>
-<br>
-cat <<'EOF'<br>
-/*<br>
- * Copyright 2015 Intel Corporation<br>
- *<br>
- *  Permission is hereby granted, free of charge, to any person obtaining a<br>
- *  copy of this software and associated documentation files (the "Software"),<br>
- *  to deal in the Software without restriction, including without limitation<br>
- *  the rights to use, copy, modify, merge, publish, distribute, sublicense,<br>
- *  and/or sell copies of the Software, and to permit persons to whom the<br>
- *  Software is furnished to do so, subject to the following conditions:<br>
- *<br>
- *  The above copyright notice and this permission notice (including the next<br>
- *  paragraph) shall be included in all copies or substantial portions of the<br>
- *  Software.<br>
- *<br>
- *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
- *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
- *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL<br>
- *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
- *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING<br>
- *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS<br>
- *  IN THE SOFTWARE.<br>
- */<br>
-<br>
-#include "isl.h"<br>
-<br>
-const struct isl_format_layout<br>
-isl_format_layouts[] = {<br>
-EOF<br>
-<br>
-sed -r '<br>
-# Delete comment lines and empty lines<br>
-/^[[:space:]]*#/d<br>
-/^[[:space:]]*$/d<br>
-<br>
-# Delete spaces<br>
-s/[[:space:]]//g<br>
-<br>
-# Translate formats<br>
-s/^([A-Za-z0-9_]+),*/ISL_FORMAT_\1,/<br>
-<br>
-# Translate data type of channels<br>
-s/\<x([0-9]+),/ISL_VOID@\1,/g<br>
-s/\<r([0-9]+),/ISL_RAW@\1,/g<br>
-s/\<un([0-9]+),/ISL_UNORM@\1,/g<br>
-s/\<sn([0-9]+),/ISL_SNORM@\1,/g<br>
-s/\<uf([0-9]+),/ISL_UFLOAT@\1,/g<br>
-s/\<sf([0-9]+),/ISL_SFLOAT@\1,/g<br>
-s/\<ux([0-9]+),/ISL_UFIXED@\1,/g<br>
-s/\<sx([0-9]+),/ISL_SFIXED@\1,/g<br>
-s/\<ui([0-9]+),/ISL_UINT@\1,/g<br>
-s/\<si([0-9]+),/ISL_SINT@\1,/g<br>
-s/\<us([0-9]+),/ISL_USCALED@\1,/g<br>
-s/\<ss([0-9]+),/ISL_SSCALED@\1,/g<br>
-<br>
-# Translate colorspaces<br>
-# Interpret alpha-only formats as having no colorspace.<br>
-s/\<(linear|srgb|yuv)\>/ISL_COLORSPACE_\1/<br>
-s/\<alpha\>//<br>
-<br>
-# Translate texture compression<br>
-s/\<(dxt|fxt|rgtc|bptc|etc|astc)([0-9]*)\>/ISL_TXC_\1\2/<br>
-' |<br>
-tr 'a-z' 'A-Z' | # Convert to uppersace<br>
-while IFS=, read -r format bpb bw bh bd \<br>
-                    red green blue alpha \<br>
-                    luminance intensity palette \<br>
-                    colorspace txc<br>
-do<br>
-    : ${colorspace:=ISL_COLORSPACE_NONE}<br>
-    : ${txc:=ISL_TXC_NONE}<br>
-<br>
-    cat <<EOF<br>
-   [$format] = {<br>
-      .format = $format,<br>
-      .name = "$format",<br>
-      .bs = $((bpb/8)),<br>
-      .bw = $bw, .bh = $bh, .bd = $bd,<br>
-      .channels = {<br>
-          .r = { $red },<br>
-          .g = { $green },<br>
-          .b = { $blue },<br>
-          .a = { $alpha },<br>
-          .l = { $luminance },<br>
-          .i = { $intensity },<br>
-          .p = { $palette },<br>
-      },<br>
-      .colorspace = $colorspace,<br>
-      .txc = $txc,<br>
-   },<br>
-<br>
-EOF<br>
-done |<br>
-sed -r '<br>
-# Collapse empty channels<br>
-s/\{  \}/{}/<br>
-<br>
-# Split non-empty channels into two members: base type and bit size<br>
-s/@/, /<br>
-'<br>
-<br>
-# Terminate the table<br>
-printf '};\n'<br>
--<br>
2.8.3<br>
<br>
</div></div><br>_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
<br></blockquote></div><br></div></div>